我想在处理标准输出和标准错误输出时执行一个 shell 脚本。目前我使用
我可以在调用
像重定向 (
例如,要下载一个 shell 脚本并执行它,我尝试了以下命令:
Process.run
命令来执行命令,其中 shell=false
并且有三个管道分别用于标准输入、标准输出和标准错误输出。我会生成 fiber 来读取标准输出和标准错误输出并将其记录或以其他方式处理。这对于单个命令运行得非常好,但对于脚本则失败了。我可以在调用
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" | bash}
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 crystal main" >/etc/apt/sources.list.d/crystal.list`
bash -c
中才能调用它。但是,你要对抗shell=false
,这是允许你直接使用 shell 语法的东西。 - Anya Shenanigansshell=true
也没有帮助。 - Sod Almightybash -c
调用似乎可以解决问题。那么...为什么shell=true
不起作用呢?它肯定几乎是一样的东西吧? - Sod Almighty