从特定目录运行shell命令

时间:2013-01-18 19:43:24

标签: ruby shell

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

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

在OSX上,/bin/sh是bash的别名,因此上面的代码段运行正常。有没有办法强制Ruby在* nix机器上使用/bin/bash来解释shell命令?

3 个答案:

答案 0 :(得分:4)

在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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

待办事项

Dir.chdir("/bin")

然后执行命令:

`pushd /tmp; echo foo`