すべての基準をスクリプトの残りの部分にリダイレクト

すべての基準をスクリプトの残りの部分にリダイレクト

bashスクリプトがあり、残りのすべての出力をファイルにリダイレクトしたいと思います。

#!/bin/bash
# the part I don't know  ${file}
echo spo 
echo car

cat ${file}

出力は spocar​​\n でなければなりません。\n

ベストアンサー1

スクリプトの残りの部分にstdoutをリダイレクトすると、「cat」コマンドが含まれているため、出力は表示されず、$file独自の再帰コピーが無限に埋められる可能性があります(小さすぎない場合でも)cat。書き始める前に最後に)。

これから標準出力をリダイレクトするには、次のようにします。

exec > "$file"

しかし、ここでは以下をしたいかもしれません。

#! /bin/bash -
{
  echo spo 
  echo car
} > "$file"

cat < "$file"

次のこともできます。

exec 3>&1 # save stdout as fd 3
exec > "$file"
echo spo
echo car
exec >&3 3>&- # restore stdout and close fd 3
cat < "$file"

(ところで、上記は複合コマンドをリダイレクトするときに現代のシェルが内部的に実行することです{ some; code; } > ...(10より大きいfdを使用して実行コマンドが表示されないようにO_CLOEXECフラグを設定します)。をフォークします)

また、上記のコードでは持つスクリプトの残りの部分の標準出力を復元するには、cat次のコマンドに対してのみこれを実行できます。

cat < "$file" >&3 3>&-

3>&-(close fd 3)はcatfd 3が使用されていないため必要ありませんが、通常は良い習慣であり、厳密に言えば、シェルO_CLOEXECの動作をエミュレートするためにすべてのコマンドに追加する必要があります)。

おすすめ記事