Bash POSIX拡張を確認できますか?

Bash POSIX拡張を確認できますか?

私はシェルbashについて読んでおり、POSIXと互換性があるようにするにはbash「拡張」する必要があることを多くのソースで理解しています。私にとって、これはbashにロードまたはアンロードできる必要があるように聞こえます。そのトピックでインターネットを検索しようとしましたが、詳細が見つからないようです。私が見つけることができるものは基本的に「Bashには拡張が必要です」と言いました。

Bashがどの拡張機能をロードしているかを確認する方法はありますか?ロードまたはアンロードしますか?別の方法で設定しますか?

答え1

Bashには、POSIX仕様を超えるか違反する多くの機能と動作があります。これは時々標準拡張として記述される。一部のアプリケーションでは、ロード可能な拡張機能ではありません。

これらの拡張には以下が含まれます。[[テスト構文{a,b,c}支柱の拡張可変間接${!x}プロセスは次に置き換えられます。<(...)、そして歴史的な拡張!。拡張は非POSIXこの意味では、Bashの一部です。

また、コマンドと構文の動作に対するさまざまな変更も含まれます。 POSIXスクリプトは、ifで実行すると異なる動作をする可能性がありますbash。たとえば、!履歴拡張の試みとして解釈される文字を使用するか、コマンドの後の辞書コマンド割り当てステートメントに依存します。

foo() { ... ; }
x=1 foo
echo $x

POSIXでは、sh" "を出力する必要があり1ますが、通常の状況では変数の名前空間が複雑になるのを避けるために、コマンドの実行時割り当てbashxコマンドの後に保持されません。


吹く動作をPOSIXと同様に変更するPOSIXモードがあります。合理的なPOSIXスクリプトが異なる動作をしている場合。上記に加えて、timeパイプコマンドを処理するためのBashの(非常に便利な)拡張があります。これは組み込みでなければなりません。 POSIX モードでは、システムのtime実行可能ファイルが特定の状況で実行されます。

$ time --help
bash: --help: command not found
$ set -o posix
$ time --help
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]

持つPOSIXモードの現在の56の動作変更のリストドキュメントから。他のほとんどの拡張機能(および[[${!x}はPOSIXモードでも機能しますが、プロセスの交換は機能しません。ほとんどの場合、正当なPOSIXスクリプトを破損する可能性のある違いのみが修復されます。これは実際に既存の拡張の唯一の「無効化」です。 POSIXモードでは、POSIXスクリプトは期待どおりに実行する必要があります(そうでない状況を構成するのはまだ簡単ですが)。 POSIX モードでも、Bash スクリプトは標準と直接衝突しないシェルが提供する POSIX 以外の機能を使用できます。


dashより最小限のPOSIX準拠を達成しようとする他のシェルがあることは注目に値します。 POSIX以外の拡張を削除する主な方法は、代わりにシェルの1つを使用することです。

答え2

bashPOSIXコンプライアンスを実施するには3つの方法があります。

  • bash--posixオプションで始める
  • 設定オプションPOSIXBashがすでに実行されている場合:set -o posix
  • 環境変数の使用POSIXLY_CORRECT:

    bashの起動時にこの変数が環境にある場合、シェルは次のように入力します。POSIXモード--posix 起動ファイルを読み取る前に、呼び出しオプションが指定されているのと同じです。シェルが実行されているときに設定されると、bashが有効になります。POSIXモード、まるでコマンドがset -o posix実行されたかのように。

これらの3つを使用すると、いくつかを書くことができます。拡大する(例:bashの起動中にロードされた関数)誰かがこれを実行した可能性がありますが、どちらもbash標準ではありません。

関連情報