如果通过管道传输,Bash readline 会吃掉所有内容

如果通过管道传输,Bash readline 会吃掉所有内容

我有一个简单的脚本。

# test.sh

read -p ">> " user
read -p ">> " -n1 yes

echo

echo "user: $user"
echo "yes: $yes"

执行时,bash test.sh它会提示输入值并将它们存储在变量user和中yes。所以输出是这样的

user@host:~/static/dcc$ bash test.sh 
>> foo
>> b
user: foo
yes: b

然而,当 cat test.sh 通过管道传输到 bash 时,它不起作用,相反, read 会吃掉它后面的所有内容并将其存储在user变量中,就像看起来一样(不提示输入)。

user@host:~/static/dcc$ cat test.sh | bash

user: read -p ">> " -n1 yes
yes: 

使用进程替换工作正常,但如果 bash 作为 sudo 运行则不行(这就是我需要的)

user@host:~/static/dcc$ bash <(cat test.sh)
>> user
>> y
user: user
yes: y
user@host:~/static/dcc$ sudo bash <(cat test.sh)
bash: /dev/fd/63: No such file or directory

在现实世界的示例中,我尝试使用curl从网络获取脚本并像使用sudo一样运行它。如果可能的话,我想避免首先下载脚本的额外步骤。

答案1

好吧,read从标准输入读取,然后您通过标准输入输入脚本的其余部分......所以,这是行不通的。

您必须下载该文件。你的替换技巧工作得很好,但它工作得很好,它是在调用 sudo 的 shell 中完成的,而不是在 sudo 调用的 shell 中完成的。你可以轻松地规避这一点:

sudo bash -c 'bash <(curl https://scripttodownload)'

相关内容