0

Ruby はシェル インタープリターとして使用しているようですが、/bin/sh*nix マシンでは. これは私に言うことです:/bin/bashpushdirb

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

OSX では、/bin/shbash のエイリアスであるため、上記のスニペットは問題なく動作します。*nix マシンで Ruby を強制的に/bin/bashシェル コマンドの解釈に使用する方法はありますか?

4

3 に答える 3

4

Rubyのように Bash コマンドを使用してpushdも意味がありません。これらのコマンドは Bash インタープリターの Bash の内部状態に影響を与えるためです。Ruby からバッククォートまたは を使用してシェル コマンドを実行するとsystem、新しいサブプロセスが作成され、コマンドが実行され、そのサブプロセスが閉じられます。

つまり、どうにかしてpushdRuby から Bash コマンドとして実行できたとしても、Bash サブプロセスが開始され、ディレクトリがディレクトリ スタックにプッシュされてから終了します。ディレクトリ スタックに加えた変更は、他のすべてのサブプロセスのデータと共に消去されます。次にシェル コマンドを使用するときには、そのディレクトリに移動することはありません。

Bash ではなく、Ruby でスクリプトを作成しています。内部の 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​​ ソースにハードコーディングされています。したがって、デフォルトのシェルを変更する方法はありません。他の提案されたアプローチのいずれかを使用できます。

于 2013-01-18T20:02:43.593 に答える
0

行う

Dir.chdir("/bin")

次に、コマンドを実行します。

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