如何指定用于ruby系统调用的shell?

如何指定用于ruby系统调用的shell?,ruby,bash,shell,Ruby,Bash,Shell,我试图通过系统运行ruby中的命令(或使用backticks),但遇到了问题。当我试图调用一个命令时,shell无法找到它,即使我知道如果我直接调用它,它会工作。例如: `zip` >> sh: zip: command not found 问题似乎是ruby使用的是shshell,其中$PATH设置不正确,而不是bash,我不知道为什么。运行我的应用程序的用户默认设置为使用bash 有没有办法告诉ruby使用bash而不是sh?我猜ruby使用的是system()C函数,它使用/

我试图通过
系统运行ruby中的命令(或使用backticks),但遇到了问题。当我试图调用一个命令时,shell无法找到它,即使我知道如果我直接调用它,它会工作。例如:

`zip`
>> sh: zip: command not found
问题似乎是ruby使用的是
sh
shell,其中
$PATH
设置不正确,而不是
bash
,我不知道为什么。运行我的应用程序的用户默认设置为使用
bash


有没有办法告诉ruby使用
bash
而不是
sh

我猜ruby使用的是
system()
C函数,它使用
/bin/sh
。在大多数系统中,
/bin/sh
只是其他shell的一个符号链接,因此您可以更改为任何您想要的

,据我所知,唯一的方法是显式调用shell,例如

`bash -c zip`

或者使用系统:
system(“bash”、“-c”,命令)


但是,ruby(以及ruby生成的所有进程)应该继承父进程的环境,因此即使在使用另一个shell时,也应该正确设置$PATH。如果路径设置不正确,您是否可以从cron作业或init脚本等运行ruby?

为什么不直接指定zip可执行文件的完整路径。

Hm./bin/sh确实是一个符号链接。。。to/bin/bash!因此,出于某种原因,它将
路径设置为与正常情况不同的东西?调用是从web进行的,而不是从cron或作为脚本进行的。apache会改变我的路径吗?很可能是这样。(很可能apache不会更改PATH,但PATH没有设置为其通常的值,因为在调用apache之前您的rc文件没有来源)。如果您需要用多字命令替换
zip
,并且您不能使用多个参数(例如
IO.popen
),请使用转义引号,如
system(“bash-c\'cat food\”)
是的,我可以。我没有这样做的原因是,它是在多种开发环境中开发的,并且路径不一定在所有环境中都是相同的。像whereis这样的命令应该总是在路径中。或者是所有发行版/usr/bin/whereis中的公共位置,这可能是查找可能分散的存储箱的一个很好的解决方案。
`#{ ENV['SHELL'] } -c zip`