3

概要: Windows マシンで、Bourne シェルがアクティブな Ruby シェルになるようにするにはどうすればよいですか? これが私がしたいことです:

irb> exec('echo $SHELL')
/bin/sh

実際の出力は次のとおりです。

irb> exec('echo $SHELL')
$SHELL

でコマンドを手動で実行しようとするとどうなりますかcmd.exe。Ruby docs によると、execコール チェック$RUBYSHELL$COMSPEC(この順序で?) のように見えます。、、およびのコピーがある場所に設定$RUBYSHELLしようとしましたが、どれも機能していないようです。基本的に完全に無視しているように見えます..."C:\Program Files (x86)\Git\bin\sh.exe"sh/bin/sh/shRUBYSHELL

なんで?exec: を呼び出して結果を渡すRuby gem を使用していますShellwords.shelljoin。この呼び出しは文字をエスケープしますが、Bourne シェルに対してのみです。Windows の下で実行するcmd.exeと、エスケープされた引用符文字をバーフし、代わりに無視するようです。その結果、コマンドが正しく解釈されません。私の問題を解決する別の方法は、クロスプラットフォームでエスケープ コマンド シーケンスを実行するためのより良い方法があるかどうかを知らせることだと思いますがsh、アクティブな Ruby シェルを作成できれば問題は解決するように思えます。

4

2 に答える 2

0
exec("sh","-c","echo $SHELL")

この実用的なアプローチは、ケースを解決できるはずです。私の環境では、さまざまなランタイム環境で同じように機能します。次に例を示します。

Windows 7 64 ビット ルビー 2.1.6p336 上の mingw32 (2015-04-13 リビジョン 50298) [i386-mingw32] ルビー 2.1.6p336

OS-X 10.10.3 ruby​​ 2.0.0p451 (2014-02-24 リビジョン 45167) [x86_64-darwin13.1.0] ルビー 2.0.0p451

于 2015-05-05T19:54:00.787 に答える
0

たとえば、シェルを直接実行します exec('c:\bin\sh')

Windows 環境変数は、パーセンテージ記号で囲むことでアクセスできることに注意してください (おそらくこれはご存知でしょう)。

irb> exec(`echo %SHELL%`)
于 2012-08-27T04:01:23.643 に答える