从特定目录运行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?