【问题标题】:Run a script piped from stdin (Linux/Shell Scripting)运行从标准输入管道传输的脚本(Linux/Shell 脚本)
【发布时间】:2012-04-15 12:06:14
【问题描述】:

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

而不是做

./my_script.sh

我想做这样的事情:

cat my_script.sh | <some command here>

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

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

【问题讨论】:

  • 您必须非常小心地执行此操作。如果脚本中的任何内容从标准输入读取(例如,任何提示用户“是/否”的命令),它将消耗来自您的脚本的行,并且这些行将不会被执行。
  • @jack-oconnor 杰克,如果你害怕什么,那对你来说总是很危险的。问题是关于 linux shell 脚本的。如果有人害怕 linux,那么他一定不能碰 linux shell。但文档、测试和实践会有所帮助。

标签: linux shell scripting command-line


【解决方案1】:

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

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

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

【讨论】:

  • 因为这个答案是为不熟悉 bash 的人准备的,如果你解释一下命令的 set -x 部分完成了什么以及它是解决方案的组成部分还是只是一个例子,你的答案会更好您可以做的事情的类型。
  • 已澄清。 (那里没有特定的 bash,set -x 应该在所有 POSIX shell 中都可用。)
  • 如果脚本用“#!”指定了shell类型东西,那么它会覆盖我将它输入的任何外壳吗?
  • 不,这行不通,您通过管道传输的 shell 会将其解释为注释(即根本没有)。如果没有临时文件,这将很棘手。 (哦,你确实意识到这(wget'ing stuff and running it)有潜在的危险,对吧?)
  • 好的,谢谢。是的,同意如果文件不是来自受信任的来源是危险的(尽管它与自动将其保存到文件然后执行它一样危险)。
【解决方案2】:

您可以使用管道中的标准输入:

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

或:

cat my_script.sh | bash -

或(仅来自标准输入):

bash < my_script.sh

【讨论】:

    【解决方案3】:

    RVM向run their installer推荐这种方法:

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

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 2015-01-18
      • 1970-01-01
      • 2018-12-18
      • 2018-04-09
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多