将带有“read”的脚本通过管道传输到 bash

将带有“read”的脚本通过管道传输到 bash

我需要通过管道来运行脚本bashwget而不是直接使用 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

相关内容