"( set -o posix ; set ) | less "は何をしていますか? [コピー]

"( set -o posix ; set ) | less "は何をしていますか? [コピー]

私はすべてのシェル変数をリストするコマンドを検索している間、すべての環境変数をリストするコマンドがあることに気づきましたが、どういうわけか私が知らない理由ですべてのシェル変数をリストした人はいません。

さて、ここにすべての変数、シェル、環境変数を表示する方法に答えてくれた人がいます。

( set -o posix ; set ) | less

彼は実際にこの表現が何をしているのかを一般の人々に説明しません。

私が知っているのは次のとおりです。

  • (コマンド1、コマンド2)これにより、コマンドはシェルの子プロセス内で実行されます。
  • 置く変数を宣言するいくつかの方法ですが、それが何であるかはわかりません。-o posix第二の意味と理由置く継続的に実行

  • コマンド少ないそれは問題ではありません。私がそれを理解しても、それは出力をより制御するためのポケットベルです。

答え1

setすべてのシェル変数を表示します(エクスポートしたかどうか)。 Bashでset -o posixシェルを次に設定します。POSIX互換モード。 (他のシェルにも同様の機能に似た構文があるかどうかはわかりませんが、ここではBashを使用しているとします。)

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

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

Bashには次のものもあります。declare組み込みすべての隠し変数またはBash関連の変数を表示するために使用できるフラグ:declare -p xxBashが入力として使用できる形式で変数を表示します。すべての変数を表示し、機能を表示するために使用できます。xxdeclare -pdeclare -f

答え2

基本的に2つのことが起こります。set現在のシェルオプションを台無しにしないようにサブシェルからコマンドが呼び出され、すべての変数がリストされる前にサブシェルがPOSIXモードに設定されます。マニュアル引用:

posixは、標準(posixモード)と一致するようにPOSIX標準にデフォルト設定されているbashの動作を変更します。 posix モードが bash の動作にどのように影響するかについて詳しくは、下記のドキュメントをご覧ください。

つまり、bashPOSIXモードの動作ははるかに似ていますsh

Option-less の場合、setマニュアルにも記載されており、実際には次のように記載されています。理由POSIXモードが必要な理由:

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

bash...一般モードで実行される変数と関数の定義とは反対です。

バラよりこれPOSIX モードに関する追加情報。

関連情報