関数スペル結果のデバッグ出力を追加する

関数スペル結果のデバッグ出力を追加する

値を返す関数があります。
しかし、より簡単なデバッグのためにいくつかを追加したいと思いますecho。しかし、これを行うと結果が台無しになります。
例:

function foo {
   echo "In foo"
   VAR="1234"
   echo "Calculated item"
   echo "$VAR"
}

RESULT=$(foo)
echo "RESULT=$RESULT"

私はそれを期待していた1234
代わりに、出力は次のようになります。

RESULT=In foo  
Calculated item  
1234

この問題を解決する正しい方法は何ですか?

答え1

デバッグ出力を標準エラーにリダイレクトします。

foo () {
   echo 'In foo' >&2
   VAR="1234"
   echo 'Calculated item' >&2
   echo "$VAR"
}

RESULT=$(foo)
printf 'RESULT="%s"\n' "$RESULT"

専用の「デバッグ」機能を作成することもできます。

debug () {
    printf 'DEBUG: %s\n' "$@" >&2
}

foo () {
   debug 'In foo'
   VAR="1234"
   debug 'Calculated item'
   echo "$VAR"
}

RESULT=$(foo)
printf 'RESULT="%s"\n' "$RESULT"

出力:

$ sh script.sh
DEBUG: In foo
DEBUG: Calculated item
RESULT="1234"

関連情報