![将带有“read”的脚本通过管道传输到 bash](https://linux22.com/image/46911/%E5%B0%86%E5%B8%A6%E6%9C%89%E2%80%9Cread%E2%80%9D%E7%9A%84%E8%84%9A%E6%9C%AC%E9%80%9A%E8%BF%87%E7%AE%A1%E9%81%93%E4%BC%A0%E8%BE%93%E5%88%B0%20bash.png)
我需要通过管道来运行脚本bash
(wget
而不是直接使用 bash 运行它)。
$ wget -O - http://example.com/my-script.sh | bash
它不起作用,因为我的脚本read
中有语句。由于某种原因,这些在通过管道传输到 bash 时不起作用:
# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi
# `read` works directly
$ read -p "input: " var
input: <prompt>
# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$
读取命令并没有input:
按照应有的方式提示和询问值,而是直接被 传递bash
。
read
有谁知道我如何用to管道传输脚本bash
?
答案1
read
从标准输入读取。但 bash 进程的标准输入已被脚本获取。根据 shell 的不同,要么read
不会读取任何内容,因为 shell 已经读取并解析了整个脚本,要么read
会消耗脚本中不可预测的行。
简单的解决方案:
bash -c "$(wget -O - http://example.com/my-script.sh)"
更复杂的解决方案,更多的是出于教育目的,而不是说明针对此特定场景的良好解决方案:
echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
答案2
进程替换将执行您想要的操作:
bash <(wget ...)
也就是说,我不得不质疑你的动机。如果您控制网络服务器(并使用 https),那么这可能是有意义的。但仅仅盲目地运行来自互联网的脚本是非常危险的。
答案3
有什么问题吗:
wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh
?