-x呼び出しを使用して現在実行中のbashスクリプトがデバッグされているかどうかを確認するにはどうすればよいですか?

-x呼び出しを使用して現在実行中のbashスクリプトがデバッグされているかどうかを確認するにはどうすればよいですか?

launch.sh正しい所有者のファイルを生成するために他のユーザーとして実行されるスクリプトがあります。最初にスクリプトに渡された場合は、この呼び出しに-xを渡したいと思います。

if [ `whoami` == "deployuser" ]; then
  ... bunch of commands that need files to be created as deployuser
else
  echo "Respawning myself as the deployment user... #Inception"
  echo "Called with: <$BASH_ARGV>, <$BASH_EXECUTION_STRING>, <$->"
  sudo -u deployuser -H bash $0 "$@"  # How to pass -x here if it was passed to the script initially?
fi

私が読んでバッシュデバッグページしかし、元のスクリプトが-x

答え1

bashコマンドラインに渡すことができる多くのフラグはsetフラグです。set実行時にこれらのフラグを切り替えることができるシェルが組み込まれています。たとえば、スクリプトを呼び出すことは、bash -x foo.sh本質的にスクリプトの上部で実行するのと同じです。set -x

setこれが組み込みシェルが担当していることがわかったら、私たちはどこを見るべきかを知ることができます。これでこれを行うhelp setと、次のような結果が得られます。

$ help set
set: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]
...
      -x  Print commands and their arguments as they are executed.
...
    Using + rather than - causes these flags to be turned off.  The
    flags can also be used upon invocation of the shell.  The current
    set of flags may be found in $-.  The remaining n ARGs are positional
    parameters and are assigned, in order, to $1, $2, .. $n.  If no
    ARGs are given, all shell variables are printed.
...

したがって、ここで$-どのフラグが有効になっているかがわかります。

$ bash -c 'echo $-'
hBc

$ bash -x -c 'echo $-'
+ echo hxBc
hxBc

したがって、基本的には次のようにします。

if [[ "$-" = *"x"* ]]; then
  echo '`-x` is set'
else
  echo '`-x` is not set'
fi

ボーナスですべてのロゴをコピーしたい場合は、そうすることもできます。

bash -$- /other/script.sh

答え2

set -oxtrace on使用すると出力し-x、それ以外の場合は出力しますxtrace off

答え3

@Patrickの答えは「正確」ですが、パラメータまたはエクスポートされた変数を下付き文字で渡すことで、実行するアクション(トレースオンなど)を指示することもできます。

これの欠点は、入力したいすべてのスクリプトレベルに再エクスポートする必要があることです。

外部出力などを減らすために、動作の出力/修正に必要なスクリプトを選択的に追跡(または影響を及ぼす可能性がある)できるメリットがあります。たとえば、呼び出しスクリプトのトレースをオフにし、呼び出されたスクリプトではオンにすることができます。これは全部または専務という提案ではありません。

あなたの質問に含まれていませんが、関連する内容は次のとおりです。

私は時々次の変数を定義します。

E=""
E="echo "

または

E=""
E=": "

次のように(複数のステートメントで)使用します。

"${E}" rsync ...

または第2の変形の場合

"${E}" echo "this is a debugging message"

次に、コマンドを実行したい場合は、2番目の定義をコメントアウトします。パラメータまたはエクスポートされた変数と一緒にこの手法を使用することもできます。

この方法は複合リストの最初のステートメントでのみ機能するため、複合ステートメントに注意する必要があります。

答え4

プロセスのPIDを取得し、psを使用してプロセステーブルを調べて、そのパラメータが何であるかを確認できます。

関連情報