ベストアンサー
A2Aに感謝します。
Anmol Vishwakarmaは、問題。
物事を確実に把握するために:
- / etc / profile、〜/ .bash\_rc 、および〜/。bash\_profile、はすべてファイルであり、c 構成スクリプトと呼ばれます。 変数宣言、エクスポート変数、メールやニュースのチェックなどのログイン時に実行されるコマンド、umaskの設定などを含めることができます。ユーザーが行う一般的な操作は、ディレクトリの$ PATHへの追加、変数のエクスポート、$ PS1の変更、表示色の設定、グリーティングテキストメッセージの追加などです。
- / etc / profile、は、先頭のドットで示されているように、デフォルトでは非表示になっています(したがって、 bash\_profile ではなく、実際には .bash\_profile )。
- (ローカルまたはリモートで)ログインする場合、これはログインシェルと呼ばれ、少し扱われます。通常のシェル呼び出しとは少し異なります。その場合、 / etc / profile ファイル(存在する場合)が実行され、その後〜 /.bash\_profile または〜/。bashrcファイルがこの順序で実行されます。
- インタラクティブシェルの場合、つまりシェルの stdin と stderr はどちらも
TTY、 〜/。bash\_profileファイルは実行されませんが、〜/ .bashrc is。
非対話型シェルの場合、つまり、stdin / stderrのいずれかまたは両方を持つシェルがTTYでない場合、構成スクリプトは実行されません。 。
ログインシェルのログアウト時に、〜/。bash\_logoutファイルが存在する場合は実行されます。
POSIXに従い、 stderr ( stdout ではありません) は、シェルがインタラクティブであるかどうかを決定するストリームです。 stderr がリダイレクトされた場合、 -i がで指定されていない限り、インタラクティブシェルではありません。シェルの呼び出し。 stdout は同じ効果はありません。
回答
それは私の意見ですが、シェル関数(現在のシェルプロセスを終了する)のコンテキストでのexit
が、return
(から戻る)と同じである場合現在の関数)の場合、関数本体のコードによって致命的な状態が検出されたときに現在のスクリプトを終了するコードをシェル関数に記述できませんでした。より構造化されたプログラミング言語でのランタイムassert()
(または同等のもの)の呼び出しについて考えてみてください。
代わりにできることは、呼び出し元にエラーコードを返すことだけです。
確かに、致命的なエラーで突然終了することは、間違いなく最良のプログラミングスタイルではありません(Subversionのlibsvn
は、これが原因でかつて非常に悪い評判を持っていました。ライブラリのコードにより、プログラムはそれを使用して突然終了し、呼び出し元のコードがユーザーに通知したり、エラーからの回復を試みたりする機会がなくなりました。
それでも、致命的なエラーを検出したときに突然終了できるのは期待される条件で機能するソリューションの開発において、非常に実用的であり、シェルプログラミング(したがってGNU Bashプログラミングも)は常に一般的なケースの短い実用的なソリューションであり、考えられるすべての仕様を慎重に処理する複雑なソリューションではありませんlケース(C、Tcl、Perl、Python、さらにはPowerShellなど、他にもたくさんのツール/言語があります)。
誰かがBourneシェルスクリプトを使用している理由として考えられることにも注意してください。上記のツール/言語を使用する代わりに、最初の場所は、前者を使用すると、後者を使用するよりも実際に役立つ作業をまとめる方が非常に簡単だからです。シェルスクリプトを使用すると、ユーザーはほぼ同じ構文を使用でき、彼らが毎日インタラクティブに使用していたツール、つまり彼らはすでに慣れ親しんでいたものです。
質問: bashに組み込まれている「return」コマンドはシェルは機能しますが、「exit」コマンドがシェル機能に十分でないのはなぜですか?