2009-08-06 2 views
9

私はrubyからコマンドsystem(またはバッククックを使用して)を実行しようとしていますが、問題が発生しています。私がコマンドを呼び出そうとすると、シェルはそれを見つけることができません。たとえそれを真っ直ぐにしても、それが動作することは分かります。たとえば:ルビシステムコールに使用するシェルを指定するにはどうすればよいですか?

`zip` 
>> sh: zip: command not found 

問題はルビーではなくbashより、$PATHが正しく設定されていないshシェルを使用している、と私はなぜわからないということのようです。私のアプリケーションが実行されているユーザーは、デフォルトでbashを使用するように設定されています。

bashの代わりにshを使用するようにルビーに指示する方法はありますか?

答えて

0

zip実行可能ファイルの絶対パスを指定するだけではどうですか。

+0

ああ、できます。なぜなら、私はそれが複数の開発環境で開発されており、そのパスがすべて同じであるとは限らないからです。 –

+2

whereisのようなコマンドは、常にパスになければなりません。/usr/bin/whereisこれは、散らばっている可能性のあるビンを見つけるための良い解決策であるかもしれません。 –

4

Rubyがsystem() C関数を使用していると推測していますが、これは/bin/shです。ほとんどのシステムでは、/bin/shは他のシェルへのシンボリックリンクにすぎないので、あなたは好きなものに変更することができます。

+0

hm。/bin/shは実際には/ bin/bashへのシンボリックリンクです!何らかの理由で 'PATH'を通常とは異なるものに設定していますか? –

9

私の知る限り、これを行う唯一の方法はシェルを明示的に呼び出すことです。

`bash -c zip` 

または

`#{ ENV['SHELL'] } -c zip` 

またはシステムと

system("bash", "-c", command)

しかしルビー(ルビーによって生成されたすべてのプロセスが)ので、親プロセスの環境を継承しなければならないが$ PATHには、場合でも、正しく設定されています別のシェルを使用します。おそらく、PATHが正しく設定されていないcronジョブやinitスクリプトなどからルビを実行していますか?

+0

コールはウェブから作成され、cronやスクリプトは呼び出されません。 apacheが私の道を変えることができますか? –

+1

これは大文字である可能性が高いです。 (おそらく、apacheはPATHを変更しませんが、PATHは通常の値に設定されていません。これは、rcファイルがApacheを起動する前にソースになっていないためです)。 – sepp2k

+0

'zip'をマルチワードコマンドに置き換える必要があり、複数の引数(例えば' IO.popen')を使うことができない場合は、 'system(" bash -c \ "cat food \ "") ' –

関連する問題