Bash 脚本在某些情况下无限循环
Bash Script loops endlessly under certain circumstances
我目前正在研究 bash 并在最后几天编写了一些脚本。我想,我已经完成了,但经过一些测试,似乎当涉及到一个需要用户交互的简单 yes/no 问题时,它会循环。奇怪的是,每当我 运行 脚本时,它都不会循环。那要看我怎么运行了。所以这是一个示例脚本:
#!/usr/bin/env bash
while true; do
read -rp " test? (y/n): " yn
case $yn in
[Yy]*)
FOO="y"
break
;;
[Nn]*)
FOO="n"
break
;;
*)
echo -e " Please answer yes or no."
echo ""
;;
esac
done
echo "You picked $FOO"
如您所见,它没有做任何特别的事情。它询问是或否,如果您输入任何其他内容,它会显示一条消息。如果我 运行 它(在 Debian/Ubuntu 机器上)像这样:
bash foo.sh
或者像这样:
chmod 755 foo.sh && ./foo.sh
甚至像这样(相同的脚本,托管在 GitHub Gist 上):
bash <(wget -qO- git.io/JUGDp)
它按预期工作。但是如果我 运行 它是这样的,它会循环:
wget -qO- git.io/JUGDp | bash
我对为什么会发生这种情况有一个基本的想法,但即使我的假设是正确的,我该如何预防呢?
当你运行Bash在管道的末端时,它的标准输入连接到管道;因此 read
将无法从终端读取。
将 </dev/tty
附加到您的 read
命令以强制从 tty
而不是 stdin
.
读取
我目前正在研究 bash 并在最后几天编写了一些脚本。我想,我已经完成了,但经过一些测试,似乎当涉及到一个需要用户交互的简单 yes/no 问题时,它会循环。奇怪的是,每当我 运行 脚本时,它都不会循环。那要看我怎么运行了。所以这是一个示例脚本:
#!/usr/bin/env bash
while true; do
read -rp " test? (y/n): " yn
case $yn in
[Yy]*)
FOO="y"
break
;;
[Nn]*)
FOO="n"
break
;;
*)
echo -e " Please answer yes or no."
echo ""
;;
esac
done
echo "You picked $FOO"
如您所见,它没有做任何特别的事情。它询问是或否,如果您输入任何其他内容,它会显示一条消息。如果我 运行 它(在 Debian/Ubuntu 机器上)像这样:
bash foo.sh
或者像这样:
chmod 755 foo.sh && ./foo.sh
甚至像这样(相同的脚本,托管在 GitHub Gist 上):
bash <(wget -qO- git.io/JUGDp)
它按预期工作。但是如果我 运行 它是这样的,它会循环:
wget -qO- git.io/JUGDp | bash
我对为什么会发生这种情况有一个基本的想法,但即使我的假设是正确的,我该如何预防呢?
当你运行Bash在管道的末端时,它的标准输入连接到管道;因此 read
将无法从终端读取。
将 </dev/tty
附加到您的 read
命令以强制从 tty
而不是 stdin
.