出力リダイレクトを動的に使用するには?

出力リダイレクトを動的に使用するには?

スクリプトにデバッグオプションを追加しようとしています。通常、警告などの出力を非表示にしたいので、>/dev/null 2>&1コマンドをたくさん入れます。

スクリプトをデバッグするには、これらのスクリプトを手動で削除するか、各コマンドをif ... fitest変数に入れる必要があります$DEBUG

>/dev/null 2>&1変数($REDIR)を入れて文章を書くとcommand arg1 $REDIR効果があるようです。デバッグしたい場合は、単に空にしてください$REDIR

しかし、私のシェルで簡単なテストを行った結果、そのように動作しないことがわかりました。

~$ echo "bla" >/dev/null 2>&1
~$ REDIR=>/dev/null 2>&1
~$ echo "bla" $REDIR
bla
~$

明らかな理由から、"or'の周りを使うことはうまく>/dev/null 2>&1いきません。

それでは、なぜ私のアイデアはここで機能しないのですか?命令などを変数に入れて呼び出すことを私が間違って理解したのでしょうか?

ベストアンサー1

リダイレクトはコマンドではないため、この方法では実行できません。を使用すると完了できますが、eval問題が発生します。

必要なタスクを実行するより良い方法は、デバッグ出力用の関数を持つことです。

function debugprint {
    if [ ! -z "$debug" ]; then
        echo "$1"
    fi
}

debugprint "$(echo 'bla' 2>&1)"

これは、標準エラーを標準出力にリダイレクトし、出力を引数として使用してdebugprint呼び出されます。今、デバッグをしたいときにやるべきことは、$debugnull以外のものに設定するだけです。

もちろん、これは(引用に関連する)ワームの(他の)缶を開くこともできる。ただ使用したい場合がありますがset -x、これはデバッグ要件に十分であるかもしれませんし、十分ではないかもしれません。

おすすめ記事