我想在处理 stdout 和 stderr 输出时执行一个 shell 脚本。Process.run
目前,我使用标准输入、shell=false
标准输出和标准错误的三个管道执行命令。我生成纤程以从 stdout 和 stderr 读取并记录(或以其他方式处理)输出。这对于单个命令非常有效,但对于脚本却非常失败。
我可以shell=true
在调用时简单地设置Process.run
,但是查看 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`
如果我改用``
反引号执行方法,它可能会起作用;但是我将无法实时捕获输出。