从标准输入流运行脚本(Linux/Shell 脚本)

20
假设我有一个脚本:my_script.sh 不要执行以下操作:
./my_script.sh

我想要做类似于:

cat my_script.sh | <some command here>

有没有办法直接执行输出wget、s3cat等命令的脚本,而不需要将其保存为临时文件再改变权限?


3
做这件事情时你必须非常小心。如果你的脚本中有任何读取标准输入的部分(例如,任何提示用户“是/否”的命令),它会消耗来自你的脚本的行,而这些行将不会被执行。 - Jack O'Connor
@jack-oconnor 如果你害怕某些事情,那么它对你来说将永远是危险的。问题是关于Linux shell脚本编程的。如果有人害怕Linux,那么他就不应该碰Linux shell。但是文档、测试和实践可以帮助克服恐惧。 - user1742529
3个回答

24

只需将它传输到您喜欢的shell中,例如:

$ cat my_script.sh
set -x
echo hello
$ cat my_script.sh | sh
+ echo hello
hello

(使用set -x命令可以让shell在执行每个语句之前打印出该语句,这对于调试非常有用,但与您的问题无关 - 仅供演示目的。)


由于这个答案是给一个对bash不太熟悉的人,如果你解释一下命令中的set -x部分是做什么的,以及它是否是解决方案的重要部分或只是你可以做的事情类型的例子,那么你的答案会更好。 - Bryan Oakley
澄清一下,这里没有特定于Bash的内容,set -x 应该在所有POSIX shell中都可用。 - Mat
2
如果脚本使用"#!"指定了shell类型,那么它是否会覆盖我将其管道传递到的任何shell? - Switch
2
不,那样行不通,你管道到的 shell 会将其解释为注释(即根本不执行)。这样做没有临时文件会很棘手。(哦,你意识到这种方式(wget 下载并运行)可能非常危险了吗?) - Mat
2
好的,谢谢。同意如果文件不是来自可信来源的话是很危险的(虽然自动保存到文件并执行它也同样危险)。 - Switch

6

您可以使用管道中的stdin:

cat my_script.sh | xargs -i <some_command> {}

或者:

cat my_script.sh | bash -

或者(直接从标准输入):
bash < my_script.sh

0

RVM建议使用运行他们的安装程序的方法:

bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接