我有一个简单的脚本。
# 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)'