从特定目录运行shell命令

Ruby似乎使用/bin/sh作为shell解释器,它在* nix机器上不理解/bin/bash命令,例如pushd 。 这是irb告诉我的:

1.9.3-p327 :011 > `pushd /tmp; echo foo`
sh: 1: pushd: not found
=> "foon"

在OSX上, /bin/sh是bash的别名,所以上面的代码片段在那里运行良好。 有没有办法强制Ruby在* nix机器上使用/bin/bash来解释shell命令?


在Ruby中使用类似pushd Bash命令毫无意义,因为这些命令会影响Bash的Bash解释器的内部状态,并且当您使用反引号或system从Ruby运行shell命令时,它会创建一个新的子进程,运行该命令,然后关闭该命令子。

这意味着即使你以某种方式设法从Ruby运行pushd作为Bash命令,会发生的事情是Bash子进程将启动,将目录推入目录堆栈,然后退出。 您对目录堆栈所做的更改将被所有其他子进程的数据擦除 - 并且下一次使用shell命令时,您将不在该目录中。

你在Ruby中编写脚本,而不是在Bash中 - 内部Bash命令在这里没有任何意义,所以你需要使用Ruby的等价物。 例如,而不是写作:

system 'pushd /tmp'
system 'touch file_in_tmp'
system 'popd'

哪个不行,你想要做的是:

Dir.chdir '/tmp' do
    system 'touch file_in_tmp'
end

/ bin / sh在ruby源代码中被硬编码。 所以没有办法改变默认的shell。 您可以使用其他建议方法之一。


Dir.chdir("/bin")

然后执行你的命令:

`pushd /tmp; echo foo`
链接地址: http://www.djcxy.com/p/995.html

上一篇: Running shell commands from a specific directory

下一篇: What is the difference between an abstract function and a virtual function?