set
シェルの動作が変更される可能性があり、予測できない場合は、シェルスクリプトをデプロイする最も正しい方法は何ですか?
たとえば、実行環境rm *.txt
では期待どおりに機能しません。すべての環境で現在のディレクトリのすべてのテキストファイルが削除されたことを確認するにはset -f
どうすればよいですか?rm *.txt
一般的な展開の前にシェルスクリプトが期待どおりに実行されているかどうかを確認するにはどうすればよいですか?
答え1
シェルスクリプトは通常、バイナリファイル、Pythonスクリプト、Perlスクリプト、または他の種類のスクリプトなど、他の種類の実行可能ファイルと同じと見なされます。彼らシェルボーン一番上は、シェルを介して実行するようにカーネルに指示します。他のコマンドのように呼び出す必要があります。
したがって、スクリプトが呼び出されるたびに新しいシェルが起動され、呼び出し側のシェルまたはset -f
システムの他のシェルインスタンス内のすべての設定は関係ありません。
もちろん、ユーザーは次のようにスクリプトを実行する代わりにスクリプトをインポートできます。
. /path/to/your/script
または、次のようにデフォルト以外の設定を使用してシェルで実行します。
sh -f /path/to/your/script
ただし、これは一般的な方法やスクリプト呼び出しとは見なされず、これを行うユーザーは得られる結果を期待する必要があります。
実行ではなくインポートするように設計されたいくつかのスクリプトがあります。その目的は、ソースシェル環境に反映する必要があるcwdを変更するか、環境変数を設定することです。ただし、これはほんの一握りであり、通常は次の作業の一部として実行されます。合意されたプロトコル。これらのファイルは、スタンドアロンスクリプトではなく、ファイルが生成されると予想されるシステムの「プラグイン」に似ていると考えることができます。/etc/rc*.d
たとえば、.sh
/etc/rc*.d
このようにして取得するファイルは、呼び出し側環境にシェルの動作に影響を与える可能性がある設定が何であるかを知る必要がありますが、理想的には、合意されたプロトコルは予測可能な実行環境を約束する必要があります。