我试图通过system
(或使用反引号)从Ruby运行命令,但是遇到了问题。当我尝试调用一个命令时,即使我知道如果直接调用它可以工作,shell也无法找到它。例如:
`zip`
>> sh: zip: command not found
问题似乎是ruby使用的是sh
shell,其中$PATH
设置不正确,而不是bash
,我不确定原因。应用程序正在运行的用户默认使用bash
。
是否有办法告诉ruby使用bash
而不是sh
?
`bash -c zip`
或者`#{ ENV['SHELL'] } -c zip`
或者使用系统命令:system("bash", "-c", command)
然而,Ruby(以及由Ruby生成的所有进程)应该继承父进程的环境变量,因此即使使用另一个shell,$PATH也应该正确设置。您可能是从cron作业、init脚本或类似的地方运行Ruby,其中PATH未正确设置?
system()
C 函数,该函数使用 /bin/sh
。在大多数系统中,/bin/sh
只是一个指向其他 shell 的符号链接,因此您可以更改为任何您想要的。
zip
替换为多个单词的命令,并且不能使用多个参数(例如IO.popen
),请使用转义引号,例如system("bash -c \"cat food\"")
。 - Andrew Grimm