CshスクリプトでSHELLが/ bin / shを指すのはなぜですか?

はい、Cシェルが悪いことはわかっています。いいえ、Cシェルは選択しませんでした。はい、適切なシェルを使用したいと思います。いいえ、より良いシェルに切り替えることはできません。

非常に単純なスクリプトがあります:

/tmp/env_test.csh

#!/bin/csh -f env 

tcshシェルでログインしているユーザーからこのスクリプトを実行すると、SHELL/bin/tcshになります。このスクリプトをcronから実行すると、SHELL/bin/shと等しくなります。

SHELLが適切に更新されないのはなぜですか?この問題を解決するには何をする必要がありますか?

コメント

  • とにかく問題なのはなぜですか?
  • @muruこれを見つけて解決策を見つけた後、perlbrewは明らかに適切にiv id = “'していないため、'が問題であるように見えます。 82bb9a685b “>

sense " $SHELLが正しいシェルに設定されていない場合、シェルは[t] cshです。 cronが/bin/sh$SHELL=/bin/shを使用して実行されている場合、Cシェルスクリプト(#!/bin/csh -f)。次に、PerlbrewはそれがBourneシェルであると想定し、' Bourneシェルコマンドを使用して環境をセットアップします。これは、perlbrew useを実行する前にsource <perlbrew path>/perlbrew/etc/cshrcを実行したにもかかわらず発生します。 setenv SHELL /bin/cshをperlbrewcshrcに挿入することでこれを解決しました。

回答

man 1 cshを調べます。セクションPre-defined and environment variablesには、cshが定義または尊重する変数がリストされています。小文字の変数shellがあります:

 shell The file in which the shell resides. This variable is used in forking shells to interpret files that have execute bits set, but which are not executable by the system. (See the descrip- tion of Non-builtin Command Execution below.) Initialized to the (system-dependent) home of the shell. 

では、見てみましょう:

% echo $shell /bin/csh 

コメント

  • したがって、いくつかのテストの後でわかることから、$ shellは真の環境ではありません変数ですが、シェルで解釈される変数です。echo $shellはスクリプトから/bin/tcshを返しますが、env | grep -i shellはcronで正しい変数を見つけられません。他の場所(この回答など)からの私の理解は、$SHELLを設定する必要があります。実際、アクティブなログインシェルでは、設定されています。' $SHELLを取得できないのはcron。

回答

SHELL変数を設定する必要がありますcrontrabの/bin/cshにアクセスするには、次の方法でcron環境変数を確認できます。

* * * * * env > ~/cron-env tail -f ~/cron-env 

デフォルトのSHELL/bin/shに設定する必要があります。

SO:cronがスクリプトを実行する環境をシミュレートするにはどうすればよいですか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です