【发布时间】:2016-05-30 19:26:18
【问题描述】:
我想在处理 stdout 和 stderr 输出时执行一个 shell 脚本。目前我使用Process.run、shell=false 和三个用于标准输入、标准输出和标准错误的管道执行命令。我生成纤程以从 stdout 和 stderr 读取并记录(或以其他方式处理)输出。这对于单个命令非常有效,但对于脚本来说非常失败。
我可以在调用Process.run 时简单地设置shell=true,但查看Crystal 源代码似乎只是在命令行前面加上“sh”。我试过在前面加上“bash”,但没有帮助。
重定向(>file)和管道(例如curl something | bash)似乎不适用于Process.run
例如,要下载一个 shell 脚本并执行它,我尝试过:
cmd = %{bash -c "curl http://dist.crystal-lang.org/apt/setup.sh" |重击}
Process.run(cmd, ...)
添加了最初的bash,希望它能启用管道操作符。它似乎没有帮助。我也试过分别执行每个命令:
script.split("\n").reject(/^#/, "").each { Process.run(...) }
当然,当命令使用重定向或管道时,这仍然会失败。例如,命令echo "deb http://dist.crystal-lang.org/apt crystal main" >/etc/apt/sources.list.d/crystal.list 简单地输出:
"deb http://dist.crystal-lang.org/apt水晶主" >/etc/apt/sources.list.d/crystal.list`
如果我改用`` 反引号执行方法,它可能会起作用;但是我将无法实时捕获输出。
【问题讨论】:
-
在第一种情况下,您需要将管道移动到
bash -c中才能调用它。不过,您正在与shell=false作斗争,这是可以让您直接使用shell 语法的东西。 -
@Petesh 遗憾的是,设置
shell=true没有任何帮助。 -
@Petesh 将管道移动到
bash -c调用似乎可行,但是。那么...为什么shell=true不起作用?肯定是一样的吧?
标签: linux bash shell crystal-lang