組み込み式はset -x
トレースを有効にして、ワイルドカードの後に実行する前に各コマンドを印刷します。私が疑問に思うのは、set -x
さまざまな状況で提供される出力の違いです。
走ってみるbash -c 'set -x; echo "hello"'
と見えますが…
+ echo hello
hello
走ってみるbash -c '(set -x; echo "hello")'
と見えますが…
+ echo hello
hello
走ってみるbash -c 'hi=$(set -x; echo "hello")'
と見えますが…
++ echo hello
+
最後のケースになぜ二重があるのか知っている人はいますか?
ベストアンサー1
引用するバッシュマニュアルのためset -x
:
拡張後および実行前の引数または関連する単語のリストとともに、単純なコマンド、
for
コマンド、case
コマンド、コマンド、および算術コマンドのトレースを印刷します。select
変数for
の値PS4
が拡張され、結果の値がコマンドおよび拡張引数の前に印刷されます。
PS4
はい~と記述:
このパラメーターの値は次のように拡張されます。PS1
-x
拡張値は、オプションが設定されたときにコマンドラインをエコーする前に印刷されるプロンプトです(参照:組み込みコレクション)。拡張値の最初の文字は、複数レベルの間接参照を表すために必要なだけコピーされます。デフォルトは "+
"です。
反復+
記号は間接参照レベルを示します。
set -x; echo "hello"
単一レベルで動作します。hi=$(set -x; echo "hello")
2つとして実行:交換に使用されるサブシェル環境は2番目のレベルです。
set -x
間接参照レベルは、コマンドが実行されるレベルでは計算されず、「デフォルト」シェルで計算されます。
この文字の複製は Bash にのみ適用されます。他のシェルはこのようにシェルの深さを表示しません。