0

これが私がやろうとしていることです:

[[ "${1}" == "debug" ]] && DEBUG='2>/dev/null' || DEBUG=''

{
    echo "a b c"
    echo "d e f" >&2
} ${DEBUG}

これは、「sh: 予期しないトークン `${BLAH}' の近くで構文エラーが発生しました」という理由で機能しません。私は次のように似たようなことをすることができます:

eval echo "def" ${DEBUG}

しかし、コードの大きなブロックではそれができません。別の方法として、次のように、「exec」を使用して、残りのコードとインラインでリダイレクトを行うこともできます。

[[ "${1}" == "debug" ]] && exec 2>/dev/null

しかし、特定の方法で exec を使用しようとすると、シェルがハングします。何かアイデアはありますか?

4

2 に答える 2

0

別の fd を作成します。

[[ "${1}" == "debug" ]] && exec 7>/dev/null || exec 7>&2

{
    echo "a b c"
    echo "d e f" >&7
}

ところで、debug引数が言及されている場合、またはその逆の場合、出力を無効にする必要がありますか?

実際のより良い方法は、関数を作成することです:

if [[ "${1}" == "debug" ]]; then
    function debug {
        echo "$1" >&2
    }
else
    function debug {
        :
    }
fi

{
    echo "a b c"
    debug "d e f"
}
于 2013-09-27T22:03:21.140 に答える
0

スクリプトでは、

[[ $1 != debug ]] && exec 2>/dev/null

実際にあなたが探しているものです。しかし、おそらく対話型シェルでは実行したくないでしょう。

Bash はstderr、エラー状態について警告するだけでなく、いくつかの非常に重要なことに使用します。1 つにはstderr、コマンド プロンプトを出力するため、および (通常は) 入力した文字を表示できるようにエコーするために使用します。

そのため、対話型シェルを使用している場合exec 2>/dev/null、bash は引き続き動作し、引き続きリッスンしますが、応答できなくなります。だから「ぶら下がっている」ように見えますが、それはただの錯覚です。入力してみてくださいEcho hello, me(入力内容を確認できません)。Enter キーを押すと、通常どおり、エコーの結果が表示されます。

ところで、何をしようとしているのですか?抑圧/dev/stderrはほとんど正しいことではありません...

于 2013-09-27T22:03:31.363 に答える