でbash
4.1以上、あなたが行うことができます
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
スクリプトのパスで置き換えます...
./script 2>some_file