运行从stdin传输的脚本(Linux/Shell脚本)

Swi*_*tch 12 linux shell scripting command-line

假设我有一个脚本:my_script.sh

而不是做

./my_script.sh
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

cat my_script.sh | <some command here>
Run Code Online (Sandbox Code Playgroud)

这样脚本就会执行.这可能吗?

使用情况是,如果我想执行脚本是wget的或s3cat等的输出现在我把它保存到一个临时文件,将其更改为可执行文件,然后运行它.有没有办法直接做到这一点?

Mat*_*Mat 20

只需将它管道到您最喜欢的shell,例如:

$ cat my_script.sh
set -x
echo hello
$ cat my_script.sh | sh
+ echo hello
hello
Run Code Online (Sandbox Code Playgroud)

(set -x使shell在运行之前打印出它将要运行的每个语句,方便调试,但它与您的问题无关 - 仅用于演示目的.)

  • 如果脚本使用"#!"指定shell类型 东西,然后覆盖我管道进入的任何外壳? (2认同)
  • 不,这不起作用,你管道的shell将把它解释为注释(即根本不是).如果没有临时文件,那将会很棘手.(哦,你确实意识到这个(wget'ing的东西并运行它)可能真的很危险,对吗?) (2认同)
  • 好的谢谢.是的,同意如果文件不是来自受信任的来源是危险的(尽管它与将文件自动保存到文件然后执行它一样危险). (2认同)

Mih*_*hai 5

你可以使用:

cat my_script.sh | xargs -i <some_command> {}
Run Code Online (Sandbox Code Playgroud)

要么:

cat my_script.sh | bash -
Run Code Online (Sandbox Code Playgroud)