web-dev-qa-db-ja.com

"(set -o posix; set)| less"は何をしているのですか?

すべてのシェル変数を一覧表示するコマンドを検索したところ、何らかの理由ですべての環境変数を一覧表示するコマンドがあることに気付きましたが、何らかの理由で、すべてのシェル変数を一覧表示する人はいないのです。

しかし、ここの誰かがすべての変数、シェル、環境変数を表示する方法について答えを出しました。

( set -o posix ; set ) | less

彼は実際にこの表現が何をするかを素人に説明しませんでした、そして私の断片的な理解はその背後にある考えを理解するのに十分ではありません。

これは私が知っていることです:

  • (command1; command2)これにより、シェルの子プロセス内でコマンドが実行されます。
  • -setは変数を宣言する方法の1つですが、-o posixの意味と2番目のsetが連続して実行される理由はわかりません

  • command | lessこれは問題ではありません。私が理解しても、出力をより詳細に制御するためのポケットベルです。

15
sharkant

setは、すべてのシェル変数(エクスポートされているかどうかに関係なく)を表示します。バッシュでは、set -o posixは、シェルを POSIX互換モード に設定します。 (他のシェルが同様の機能に対して同様の構文を持っているかどうかはわかりませんが、ここではBashを想定します。)

この場合の違いは、通常Bashのsetはシェル関数も表示することですが、POSIXモードではsetは変数のみを表示し、出力形式をわずかに変更します。

  1. オプションなしでビルトインセットを呼び出すと、シェル関数の名前と定義は表示されません。
  2. オプションなしでset組み込みが呼び出されると、結果に非印刷文字が含まれていても、シェルのメタ文字が含まれていない限り、引用符なしで変数値が表示されます。

Bashには、追加で declare builtin があり、それ以外の場合は非表示またはBash固有の変数フラグをすべて表示できます:declare -p xxは、変数xxをBashが入力として受け取ることができる形式で示します。 declare -pはすべての変数を表示し、declare -fを使用して、関数を表示できます。

13
ilkkachu

基本的に2つの処理が行われます。setコマンドは、現在のシェルオプションの混乱を避けるためにサブシェルで呼び出され、そのサブシェルはすべての変数をリストする前にPOSIXモードに設定されます。マニュアルを引用するには:

posixデフォルト操作がPOSIX標準と異なる場合のbashの動作を変更して、標準(posixモード)に一致させます。 posixモードがbashの動作にどのように影響するかを詳しく説明しているドキュメントへの参照については、以下の「参照」を参照してください。

つまり、POSIXモードのbashは、shの動作に近い動作をします。

オプションなしのsetについては、マニュアルにも記載されており、POSIXモードが必要な理由の理由が実際に示されています。

set [+ abefhkmnptuvxBCEHPT] [+ o option-name] [arg ...]オプションがない場合、各シェル変数の名前と値は、現在設定されている変数を設定またはリセットするための入力として再利用できる形式で表示されます。 。 。posixモードでは、シェル変数のみがリストされます。

...bashが通常モードのときに行われる変数と関数の定義とは対照的です。

POSIXモードの詳細については this を参照してください。

5