POSIX シェルスクリプト関数では exec 1>&2 を使用します。他のioリダイレクトを妨げますか?

POSIX シェルスクリプト関数では exec 1>&2 を使用します。他のioリダイレクトを妨げますか?

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/filestderrも実行されます/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/nullstderrもリダイレクトされます。だからそれ特定のexec行はこれらのコマンドには影響しません。

おすすめ記事