私はシェル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
ますが、通常の状況では変数の名前空間が複雑になるのを避けるために、コマンドの実行時割り当てbash
はx
コマンドの後に保持されません。
吹く動作を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
bash
POSIXコンプライアンスを実施するには3つの方法があります。
bash
--posix
オプションで始める- 設定オプションPOSIXBashがすでに実行されている場合:
set -o posix
環境変数の使用
POSIXLY_CORRECT
:bashの起動時にこの変数が環境にある場合、シェルは次のように入力します。POSIXモード
--posix
起動ファイルを読み取る前に、呼び出しオプションが指定されているのと同じです。シェルが実行されているときに設定されると、bashが有効になります。POSIXモード、まるでコマンドがset -o posix
実行されたかのように。
これらの3つを使用すると、いくつかを書くことができます。拡大する(例:bashの起動中にロードされた関数)誰かがこれを実行した可能性がありますが、どちらもbash標準ではありません。