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 -o
xtrace 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を使用してプロセステーブルを調べて、そのパラメータが何であるかを確認できます。