
デバッグ中にのみメッセージを表示する関数が必要です(関数名)。
#!/bin/bash
debug_function(){
if [[ $DEBUG -eq 1 ]]; then
echo "${FUNCNAME[1]}"
else
DEBUG=0
fi
}
test_function(){
debug_function
echo "something"
}
foo=$(test_function)
echo "Result: $foo"
うまくいきますが、DEBUG = 1を使用すると、関数名が関数出力に明確に追加されます。
# sh test
Result: something
# DEBUG=1 sh test
Result: test_function
something
メッセージのみを印刷する方法はありますか?
これを使用するとwall
正しい動作を得ることができますが、他のオプションはありますか?
ありがとう
答え1
stdoutで印刷するので、echo "${FUNCNAME[1]}"
その出力はの出力に属しdebug_function
、これは再びの出力に属しますtest_function
。
メッセージをstderrとして印刷します。
出力をリダイレクトして、次の操作を行います
echo
。echo "${FUNCNAME[1]}" >&2
または、呼び出し時に出力全体をリダイレクトします
debug_function
(関数全体をstderrとして印刷する必要がある場合)debug_function
。debug_function >&2
後者の方法では、内部コマンドをdebug_function
標準出力に直接印刷できます。 stdoutdebug_function
がリダイレクトされるため、印刷する内容がリダイレクトされます。
関数自体はstdoutをstderrにリダイレクトできますexec >&2
。これは、その機能内のすべてのコマンドに影響します。ただし、これはリダイレクトされた関数がサブシェルで実行されない限り、呼び出し関数/スクリプトにも影響します。
必要に応じてサブシェルでこの機能を実行できます(debug_function)
。常にサブシェルで関数を実行する()
場合は、関数を定義するときに代わりに使用してください。{}
したがって、stdoutの代わりにstderrで印刷することが完全な目的である関数は、次のように定義できます。
debug_function()(
exec >&2
echo whatever
# ...
)
これでecho
関数の他のコマンドは必要ありません>&2
。単に関数を呼び出しても、debug_function
その中のコマンドはstderrに印刷されます。
注:1つのサブシェルまたはコマンドのstdoutまたはstderrは、他のサブシェルまたはコマンド、またはスクリプト全体のstdoutまたはstderrと異なる場合があります。リダイレクトはさまざまなレベルで実装できます。したがって、独自のサブシェルで実行されている関数であっても、関数本体の外部で「正しい」リダイレクトが発生した場合は、スクリプト全体exec >&2
のstdoutに書き込むことができます。詳細は取り上げません。
覚えておくべき最も重要なことは次のとおりです。
標準出力は通常、(あなたの場合のように)キャプチャされるか、追加でパイプされます。 stderrのポイントはエラー/デバッグ/診断メッセージが標準出力を汚染しないようにしてください。。