sh shell script on windows causes error: /dev/tty: No such device or address
sh shell script on windows causes error: /dev/tty: No such device or address
在 Windows 上 git commit-msg 我想 运行 以下脚本:
MSG=""
if ! grep -s -qE "#[0-9]" "$MSG";then
exec < /dev/tty
cat "$MSG"
echo "Your commit message does not contain a reference to a work item. Continue? [y/n]"
read -s -n 1 sure
if [[ $sure == "y" ]]; then
exit 0
else
echo "Aborting commit..."
exit 1
fi
fi
当我使用 Git 扩展时 运行 没问题。
但是当我想直接从 Visual Studio(团队资源管理器或 Git 更改)提交时,出现以下消息的错误:
Your git-hook, '.git/hooks/commit-msg' (line 23) is not supported, likely because it expects interactive console support./r/nSee your administrator for additional assistance.
我的问题:
是否有可能检查 exec < /dev/tty 是否可以执行?否则我只会打印一条相应的消息。
提前致谢。
您可以使用 if [ -t 1 ]
或 if [ -t 2 ]
来测试您是在管道中还是在终端中。
if [ -t 1 ]; then # or if [ -t 2 ]
# do interactive stuff
else
# non-interactive variant
fi
参考:How to detect if my shell script is running through a pipe?
编辑:OP 报告说 [ -t 1 ]
在我原来的回答中没有用,但是 [ -t 2 ]
可以。第一个测试 stdout 进入 tty,第二个测试 stderr 进入 tty。在这种情况下,我猜测 Git Extensions 和 Visual Studio 都捕获了脚本的标准输出,但是 Git Extensions 将 stderr 发送到 tty 而 Visual Studio 也捕获了它。
在 Windows 上 git commit-msg 我想 运行 以下脚本:
MSG=""
if ! grep -s -qE "#[0-9]" "$MSG";then
exec < /dev/tty
cat "$MSG"
echo "Your commit message does not contain a reference to a work item. Continue? [y/n]"
read -s -n 1 sure
if [[ $sure == "y" ]]; then
exit 0
else
echo "Aborting commit..."
exit 1
fi
fi
当我使用 Git 扩展时 运行 没问题。
但是当我想直接从 Visual Studio(团队资源管理器或 Git 更改)提交时,出现以下消息的错误:
Your git-hook, '.git/hooks/commit-msg' (line 23) is not supported, likely because it expects interactive console support./r/nSee your administrator for additional assistance.
我的问题: 是否有可能检查 exec < /dev/tty 是否可以执行?否则我只会打印一条相应的消息。
提前致谢。
您可以使用 if [ -t 1 ]
或 if [ -t 2 ]
来测试您是在管道中还是在终端中。
if [ -t 1 ]; then # or if [ -t 2 ]
# do interactive stuff
else
# non-interactive variant
fi
参考:How to detect if my shell script is running through a pipe?
编辑:OP 报告说 [ -t 1 ]
在我原来的回答中没有用,但是 [ -t 2 ]
可以。第一个测试 stdout 进入 tty,第二个测试 stderr 进入 tty。在这种情况下,我猜测 Git Extensions 和 Visual Studio 都捕获了脚本的标准输出,但是 Git Extensions 将 stderr 发送到 tty 而 Visual Studio 也捕获了它。