関数に関するデバッグメッセージ

関数に関するデバッグメッセージ

デバッグ中にのみメッセージを表示する関数が必要です(関数名)。

#!/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のポイントはエラー/デバッグ/診断メッセージが標準出力を汚染しないようにしてください。

おすすめ記事