POSIXは、ネストされたポイントが失敗したときにスクリプトを続行するかどうかを指定しますか?

POSIXは、ネストされたポイントが失敗したときにスクリプトを続行するかどうかを指定しますか?

たとえば、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適用されると思います。

~からIEEE規格1003.1-2017:

名前

    ポイント - 現在の環境でコマンドを実行します。

要約

    . file

説明する

    シェルは次のコマンドを実行する必要があります。文書現在の環境で。

    もし文書<スラッシュ>がない場合、シェルは指定された検索パスを使用する必要があります。以下を含むディレクトリを探します。文書。しかし、一般的なコマンド検索とは異なり指すユーティリティは実行可能である必要はありません。読み取り可能なファイルがないと、非対話型シェルは中断されます。対話型シェルは標準エラーに診断メッセージを記録する必要がありますが、この場合は構文エラーと見なすべきではありません。

dashまたは、bashIEEE Std 1003.1-2017に完全に準拠していると主張しない限り、両方のシェルの要件はありません。

楽しく、dash(1)Debian Stretch の現在のマンページ 次のテキストが含まれています。

スプリントこれはシステムの標準コマンドソルバーです。現在のバージョンスプリントシェルのPOSIX 1003.2および1003.2a仕様に準拠するように変更されました。 ...POSIX 指定機能と一部の Berkeley 拡張のみがこのシェルに統合されました。

このマンページには次の内容が記載されています。.例:

. file

    シェルは指定されたファイルのコマンドを読み取り、実行します。

ご覧のとおり、dashIEEE Std 1003.1-2017に準拠していません。それにもかかわらず、私はこの動作が標準的な観点から見たときに「間違っている」と思われますdash。これは、この動作が続行するのではなく、現在のスクリプトを中断するためです。

関連情報