たとえば、example.sh
次のような場合
. non-existing.sh
echo 'continues!'
その後、インタラクティブセッションからスクリプトをインポートし、. ./example.sh
端末に「続き!」と表示されたらどうなりますか?これ基準指定する
読み取り可能なファイルがないと、非対話型シェルは中断されます。対話型シェルは標準エラーに診断メッセージを記録する必要がありますが、この場合は構文エラーと見なすべきではありません。
セッションを続行する必要があるかどうかはわかりますが、入れ子になったソース. non-existing.sh
にどのように適用されるかはわかりません。 Bashはエラーメッセージを印刷しても実行されます(使用されていてもset -o posix
)。 Dashは現在のスクリプトを中断します(example.sh
)。これがBashがPOSIXと互換性がないのか、それともPOSIX(実装定義の動作)に指定されていないのか疑問に思います。
答え1
読み取り可能なファイルがないと、非対話型シェルは中断されます
。
それ以外の場合は、[非対話型の場合]最後に実行されたコマンドの値を返します。https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#dot
2行目の引用符は、前のコマンドの終了コードが無視されることを示します。しかし、シェルをエラー終了モードに設定したいと思います。まあ、それをする必要があります。
答え2
POSIXは入れ子になったソースファイルについては黙っていますが、説明要求があれば既存のテキストがdot
適用されると思います。
名前
ポイント - 現在の環境でコマンドを実行します。
要約
. file
説明する
シェルは次のコマンドを実行する必要があります。文書現在の環境で。
もし文書<スラッシュ>がない場合、シェルは指定された検索パスを使用する必要があります。道以下を含むディレクトリを探します。文書。しかし、一般的なコマンド検索とは異なり指すユーティリティは実行可能である必要はありません。読み取り可能なファイルがないと、非対話型シェルは中断されます。対話型シェルは標準エラーに診断メッセージを記録する必要がありますが、この場合は構文エラーと見なすべきではありません。
dash
または、bash
IEEE Std 1003.1-2017に完全に準拠していると主張しない限り、両方のシェルの要件はありません。
楽しく、dash(1)
Debian Stretch の現在のマンページ
次のテキストが含まれています。
スプリントこれはシステムの標準コマンドソルバーです。現在のバージョンスプリントシェルのPOSIX 1003.2および1003.2a仕様に準拠するように変更されました。 ...POSIX 指定機能と一部の Berkeley 拡張のみがこのシェルに統合されました。
このマンページには次の内容が記載されています。.
例:
. file
シェルは指定されたファイルのコマンドを読み取り、実行します。
ご覧のとおり、dash
IEEE Std 1003.1-2017に準拠していません。それにもかかわらず、私はこの動作が標準的な観点から見たときに「間違っている」と思われますdash
。これは、この動作が続行するのではなく、現在のスクリプトを中断するためです。