コマンドの実行または印刷リダイレクトの問題を許可するために関数でコマンドの実行をラップする方法

コマンドの実行または印刷リダイレクトの問題を許可するために関数でコマンドの実行をラップする方法

私は多くの外部コマンドを実行するBASHコードを書きました(副作用が発生しました)。したがって、開発とデバッグの目的でコマンドを実行または印刷できるように、実行をシェル関数でラップしたいと思います。

したがって、基本コードは次のようになります。

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    else
        "$@"
    fi
}

> /dev/null残念ながら、ほとんどの外部コマンドは成功時に「成功」​​のような内容を出力するので、私はこれらの出力のリダイレクトを使用してきました。しかし、いくつかのステータスクエリがあります。する出力状態で廃棄できません。

だからどうやら私はできない> /dev/null内部に追加しましたrun。また、2番目のリダイレクト機能を追加してほとんどのコードを複製したくありません。

私はこの解決策を試しました。

silence='>/dev/null'
run some_command with params $silence

silenceアイデアは、コマンドを印刷するときに空の文字列に設定することですが、これは機能しますが、コマンドを実行すると次のような結果が得られます。

エラー: 認識できない引数: >/dev/null

未使用の中程度のエレガントなソリューションはありますかeval

答え1

関数の他の変数を調べて、runそれを使ってリダイレクトを決定するのはどうですか?

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    elif [ "$silence" -ne 0 ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

それから:

silence=1 run some_command with params whose output is not needed
silence=0 run some_command with params whose output is needed

あるいは、stdoutの代わりにstderrにコマンドを出力することもできます。

run()
{
    if [ "$print_commands" -ne 0 ]; then
        echo "$@" >&2
    else
        "$@"
    fi
}

答え2

に基づいてhttps://unix.stackexchange.com/a/726123/320598runリダイレクトを制御するために、最初のパラメータを追加することにしました/dev/null

run()
{
    declare silence="$1"; shift
    if [ "$print_commands" -ne 0 ]; then
        echo "$@"
    elif [ "$silence" -ne 0 ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

run 0 non_redirected_command params
run 1 redirected_command params

関連情報