POSIX シェルスクリプトを作成しています。
次のように、(ほぼ)すべての出力を標準エラーストリームにリダイレクトする機能があります。
# print something to stderr
printf "..." $var 1>&2
誰かが以下を使用してすべての関数の出力をリダイレクトする方法があると私に指摘しました。
# redirect all output to standard error stream
exec 1>&2
この行を関数の先頭に保ちます。
他のリダイレクトがない場合は、おそらく同意するでしょうが、カラーサポートテストがあります。
# check if we have color support
if command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1
基本的にどのように機能するのかわからないのでexec
、今はあまりにも多くの詳細を知る必要もなく、この線が上記のexec
カラーサポートテストを妨げていますが、わかります。
答え1
exec <redirection>
現在のシェル(またはサブシェル)のI / Oストリームをリダイレクトします。シェル起動コマンドはシェルのI / Oストリームを継承するため、これらのリダイレクトは一番上に適用されたコマンド固有のリダイレクトでコマンドに影響します。
したがって、次のようになります。
exec >/some/file 2>&1
foo >/another/file
- その後、
exec
シェルのstdoutが実行され、/some/file
stderrも実行されます/some/file
。 - fooが起動すると、シェルはfooのstdoutにリダイレクトされます
/another/file
が、stderrは変更されずに継承されてリダイレクトされます/some/file
。
次のコマンドのうち:
command -v tput > /dev/null 2>&1 && tput setaf 1 > /dev/null 2>&1
継承された stdout/stderr ストリームをまったく使用しません。まず、stdoutがにリダイレクトされ、/dev/null
stderrもリダイレクトされます。だからそれ特定のexec
行はこれらのコマンドには影響しません。