私はこの質問に対する答えを見つけようとしましたが、これまでは幸運ではありませんでした。
他のスクリプトを実行するスクリプトがあり、その多くには実行するすべてのコマンドを印刷する「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
はの場合はyash
9より大きい数字を使用することもできます(ファイル記述子がシェルで内部的に使用されている場合は問題が発生する可能性があります)。
スクリプトを呼び出すシェルがある場合は、bash
次zsh
のこともできます。
(export BASH_XTRACEFD; ./script.bash {BASH_XTRACEFD}> /dev/null)
9を超える最初の余裕fdは自動的に変数に割り当てられます。
以前のバージョンでは、別のオプションは、渡されたときに何もしないエクスポートされた関数bash
でxtrace
オーバーライドすることです(ただし、位置パラメータを設定するために使用される場合(または他のスクリプトを呼び出す場合)、スクリプトは中断されます。 .)set -x
#! /bin/bash -x
set -o xtrace
set
-x
bash
set
良い:
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
スクリプトパス...