0

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 的别名,所以上面的代码片段在那里运行良好。有没有办法强制 *nix 机器上的 Ruby/bin/bash用于解释 shell 命令?

4

3 回答 3

4

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

这意味着即使您以某种方式设法pushd从 Ruby 中作为 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
于 2013-01-18T20:04:38.427 回答
1

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

于 2013-01-18T20:02:43.593 回答
0

Dir.chdir("/bin")

然后执行您的命令:

`pushd /tmp; echo foo`
于 2013-01-18T19:59:44.567 回答