将文件管道化到sh和调用shell文件之间的区别

将文件管道化到sh和调用shell文件之间的区别,shell,pipe,Shell,Pipe,这就是我们试图做的: $ wget -qO- www.example.com/script.sh | sh 它悄悄地下载脚本并将其打印到stdout,然后通过管道将其传输到sh。不幸的是,这并没有完全起作用,未能在各个点等待用户输入,以及一些语法错误 这才是真正起作用的: $ wget -qOscript www.example.com/script.sh && chmod +x ./script && ./script 但是有什么不同呢 我在想,管道化文件可

这就是我们试图做的:

$ wget -qO- www.example.com/script.sh | sh
它悄悄地下载脚本并将其打印到stdout,然后通过管道将其传输到sh。不幸的是,这并没有完全起作用,未能在各个点等待用户输入,以及一些语法错误

这才是真正起作用的:

$ wget -qOscript www.example.com/script.sh && chmod +x ./script && ./script
但是有什么不同呢


我在想,管道化文件可能不会执行文件,而是单独执行每一行,但我对这类事情不熟悉,所以我不知道。

当管道化到
sh
时,该shell/脚本的stdin将是管道。因此,脚本无法从控制台获取用户输入。当您正常运行脚本时,stdin是控制台,您可以在其中输入信息。

您可以尝试告诉shell进行交互:

$ wget -qO- www.example.com/script.sh | sh -i

我也有同样的问题,在修补和谷歌搜索之后,这对我来说是有效的

wget -O - www.example.com/script.sh | sh

您的脚本实际上可能需要与sh不同的shell,比如bash,如果您执行它,shebang行将被检查,如果您使用管道传输它,它不会想到这一点,但是直接将它传输到bash并没有修复它。这是完全有意义的。非常感谢你。