新しいシェルを呼び出したら、`set -xv`を実行してください。

新しいシェルを呼び出したら、`set -xv`を実行してください。

次のコマンドは有効です

% DEBUGCLI=YES exec zsh             
% set -xv 
% echo debug
echo debug
+zsh:2> echo debug
debug

しかし、私が次のようなことをしようとすると

% exec zsh -c 'set -xv'

端末を閉じます。

私はそれを使用したくありませんexec zsh -xv。なぜならここ

2つではなく1つのコマンドを探してset -xvいるのでexec zsh

うん、私も頑張った。

exec zsh ; set -xv& exec zsh && set -xv.両方のコマンドでは無視されますset -xv

ベストアンサー1

zsh -c 'set -xv'zshrun include を指示しますset -xv。実行後、set -xvスクリプトは完了してzsh終了します(終了コードはset)。zsh -c uname走って仕上げるのと同じですuname

exec zsh ; set -xv現在のプロセス内で実行するように現在のシェルに指示します。したがって、シェルはもはやコマンドを実行しないzshため、後続のすべてのコマンドは決して実行されません(とにかく返された後にのみ実行できます)。exec

とオプションを使用して対話型シェルを実行するには、次の手順を実行しますzsh-v-x

zsh -xv

または

zsh -o verbose -o xtrace

あなたの環境でインタラクティブに実行したい場合set -xvzshDEBUGCLI=YESあなたがリンクした答えやりたいことを提案したら、以下を追加できます。

if [[ $DEBUGCLI = YES ]]; then
  set -o xtrace -o verbose
fi

~/.zshrcまたは残りの部分を追跡して記録したくない場合は、最後の行)。~/.zshrc

とにかく、毎回シェルを再起動せずにset -xvand set +xv(またはset -o xtrace -o verboseand)を実行してデバッグをオンまたはオフにすることができます。set +o xtrace +o verbose

フックまたはzleウィジェットでコマンドを実行するのではなく、入力したコードの実行中にのみ適用されるようにするには、xtraceフックの最後で設定し、フックの先頭preexec()で設定を解除するだけですprecmd()(そしてset +x 2> /dev/null)。

おすすめ記事