首页 > 解决方案 > Bash 脚本在某些情况下无休止地循环

问题描述

我目前正在玩 bash 并在最后几天编写了一些脚本。我想,我已经完成了,但经过一些测试,似乎当涉及到一个需要用户交互的简单是/否问题时,它会循环。奇怪的是,每当我运行脚本时,它都不会循环。这取决于我如何运行它。所以这是一个示例脚本:

#!/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

我对为什么会发生这种情况有一个基本的了解,但即使我的假设是正确的,我该如何预防呢?

标签: linuxbashwget

解决方案


当你在管道末端运行 Bash 时,它的标准输入连接到管道;因此read将无法从终端读取。


推荐阅读