私は多くの外部コマンドを実行する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