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命令?
答案 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`