`set -x`は何をしますか?


260

次の行を含むシェルスクリプトがあります。

[ "$DEBUG" == 'true' ] && set -x

15
見てみましょう:help -m set | less
Cyrus

4
help -m set先端をありがとう。うまくいきました。man set質問する前に試しましたが、ubuntuにはありますNo manual entry for set
Ole

2
@Ole setはbashに組み込まれているのでman bash、SHELL BUILTIN COMMANDSセクションで見つけることができます。manページを表示しているときは、おそらく次の正規表現を検索することでジャンプできます\bset \[
User5910 2018

回答:


364

set -x実行されたすべてのコマンドが端末に出力されるシェルのモードを有効にします。あなたの場合、それは明らかにデバッグに使用されます。これは、典型的な使用例ですset -x。実行されるすべてのコマンドを印刷すると、スクリプトが期待どおりに機能しない場合に、スクリプトの制御フローを視覚化するのに役立つ場合があります。

set +x それを無効にします。


5
その機能を再び無効にする方法は?
feedc0de 2017年

85
@DanielBrunner:set +x無効にします。
John Zwinck 2017年

2
これはとても便利です!誰かがもっと早く教えてくれたらいいのに。このような、スクリプトに関するメタスキルを向上させる興味深いトリックはありますか?
学生

7
@Student:set -eスクリプトの上部にあると、エラーが発生した場合(明示的に処理されない場合)にスクリプトがエラーで終了します。私はそれが(Visual Basicの悪名高いOn Error Resume Next)のように意のままに続けることであるデフォルトよりも非常に好ましいことを発見しました。
John Zwinck

1
@JohnZwinckは、残念ながら、set -e持っている非常に、コンテキストを「確認」に関数が呼び出された場合-指定した行の行動は、コールスタックには、最大何に依存しているため、それは(コードレビューはほとんど不可能という点まで、望ましくない副作用をset -e無効になっていますその呼び出しとそれが呼び出すすべてのもののために)。BashFAQ#105の演習を参照してください。
Charles Duffy

78

set -x

コマンド、caseコマンド、selectコマンド、およびコマンドの算術演算、それらの引数または関連する単語リストが展開されてから実行される前に、それらのトレースを出力します。PS4変数の値が展開され、結果の値がコマンドとその展開された引数の前に出力されます。

[ ソース ]

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

上記の例は、の使用法を示していますset -x。使用すると、上記の算術式が拡張されます。一本一本の線が段階的に評価されている様子を見ることができました。

  • 最初のステップexprが評価されました。
  • 2番目のステップechoが評価されました。

セットの詳細については→ このリンクにアクセスしてください

シェルスクリプトに関しては、

[ "$DEBUG" == 'true' ] && set -x

実行モードがとして選択されてDEBUGいる場合、スクリプトはいくつかの追加の情報行を出力している可能性があります。従来、スクリプトが次のようなオプションの引数で呼び出された場合、デバッグモードを有効にするために使用されていました-d



6

-u:デフォルトでは無効です。有効にすると、未構成の変数を使用するとエラーメッセージが表示されます。

-v:デフォルトでは非アクティブです。アクティベーション後、情報が出力される前に、情報の元のコンテンツが(可変解像度なしで)表示されます。

-x:デフォルトでは非アクティブです。有効にすると、コマンドの実行前にコマンドの内容が表示されます(変数解決後、++記号が表示されます)。

次の違いを比較します。

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.