如何从通过管道传输到 bash 的脚本中读取用户输入

How to read user input from a script piped to bash

提问人:phil_rawlings 提问时间:12/16/2022 最后编辑:Cyrusphil_rawlings 更新时间:12/16/2022 访问量:89

问:

我想从 bash 脚本内部读取用户输入:test.sh

#!/bin/bash
read -p "Do you want to continue? (y/n) " yn

case $yn in 
    [yY] ) echo "Doing stuff...";
        echo "Done!";;
    [nN] ) echo "Exiting...";
        exit;;
    * ) echo "Invalid response";;
esac

当直接使用其中一种运行脚本时,这可以正常工作。./test.shbash test.sh

但是,我想从 URL 运行此脚本(嗯,它的更复杂版本),所以我像这样调用它:

curl -s https://<myurl>/test.sh | bash -s

这将运行脚本,但它只显示 ,没有其他任何内容(甚至不打印“是否要继续?”消息)。我知道这是因为 curl 的 stdout 通过管道传输到 bash 的 stdin,但在这种情况下如何读取用户输入?Invalid Response

为了完整起见,如果脚本保存在本地,我也会得到相同的行为,并且我这样做:

bash < test.sh

Bash 管道 stdin

评论

0赞 user1934428 11/17/2023
脚本将 curl 命令中 stdout 的第一行存储到变量 中。由于此行可能不包含 Y 或 N,因此您将收到无效的响应。您可以通过执行 ?.yncurl -s https://<myurl>/test.sh | head -n 1| tee| bash -s

答:

1赞 Cyrus 12/16/2022 #1

我建议将

read -p "Do you want to continue? (y/n) " yn

read -p "Do you want to continue? (y/n) " yn </dev/tty

以防止从(您的管道)读取。readstdin