はい、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
に設定する必要があります。