スクリプトの外部でbash実行トレースを抑制します(set -x)。

スクリプトの外部でbash実行トレースを抑制します(set -x)。

私はこの質問に対する答えを見つけようとしましたが、これまでは幸運ではありませんでした。

他のスクリプトを実行するスクリプトがあり、その多くには実行するすべてのコマンドを印刷する「set -x」があります。私はそれを削除したいが、スクリプトがstderrにエラーメッセージを送信した場合は情報を保持します。

だから書くことはできません。 ./script 2>/dev/null

また、他のスクリプトを編集する権限がないため、設定オプションを手動で変更することはできません。

stderrから別々のファイルまですべてを記録し、トレースコマンドをフィルタリングするつもりですが、より簡単な方法がありますか?

ベストアンサー1

バージョン 4.1 以降では、bash次のことができます。

BASH_XTRACEFD=7 ./script.bash 7> /dev/null

bash(コールで呼び出されても有効ですsh。)

デフォルトでは、出力はデフォルト値2の代わりにファイル記述子7にbash書き込まれるように指示xtraceし、そのファイル記述子にリダイレクトします/dev/null。 fd番号は任意です。スクリプトで使用されていない2より大きいfdを使用してください。このコマンドを入力したシェルがまたbashはの場合はyash9より大きい数字を使用することもできます(ファイル記述子がシェルで内部的に使用されている場合は問題が発生する可能性があります)。

スクリプトを呼び出すシェルがある場合は、bashzshのこともできます。

(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)

9を超える最初の余裕fdは自動的に変数に割り当てられます。

以前のバージョンでは、別のオプションは、渡されたときに何もしないエクスポートされた関数bashxtraceオーバーライドすることです(ただし、位置パラメータを設定するために使用される場合(または他のスクリプトを呼び出す場合)、スクリプトは中断されます。 .)set -x#! /bin/bash -xset -o xtraceset-xbashset

良い:

set()
  case $1 in
    (-x) return 0;;
    (-[!-]|"") builtin set "$@";;
    (*) echo >&2 That was a bad idea, try something else; builtin set "$@";;
  esac

export -f set
./script.bash

$BASH_ENV別のオプションは、各コマンドの前に実行されるファイルにDEBUGトラップを追加することです。set +x

echo 'trap "{ set +x; } 2>/dev/null" DEBUG' > ~/.no-xtrace
BASH_ENV=~/.no-xtrace ./script.bash

set -xただし、これはサブシェルで実行されると機能しません。

@ilkkachuが言ったように、ファイルシステム上のすべてのフォルダに対する書き込み権限がある限り、少なくともスクリプトをコピーして編集できる必要があります。

スクリプトのコピーを作成する場所がない場合、または元のスクリプトを更新するたびに新しいコピーを作成して編集するのが不便な場合でも、次のことができます。

 bash <(sed 's/set -x/set +x/g' ./script.bash)

$0スクリプトがカラフルであるか、特別な操作(スクリプト自体の場所に基づいてファイルを見つける)を実行している場合、この$BASH_SOURCE方法(およびコピー方法)が正しく機能しない可能性があるため、$0スクリプトパス...

おすすめ記事