LinuCレベル1 GNUとUnixのコマンド 問43
GNUとUnixのコマンド/ストリーム、パイプ、リダイレクトの使用スクリプト ./build.sh の標準出力を画面に表示しながら、既存のファイル build.log の内容を消さずに、その末尾へ書き足したい。コマンドとして適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)
- A./build.sh | tee build.log
- B./build.sh | tee -a build.log
- C./build.sh >> build.log
- D./build.sh | tee -i build.log
正解:B
解説
tee は標準入力を標準出力へ流しつつ、同じ内容を指定したファイルへ書き出すコマンドです。オプションなしではファイルを上書きしますが、-a(--append)を付けるとファイルの末尾に追記します。>> によるリダイレクトも追記になりますが、出力はすべてファイルに向かうため画面には表示されません。標準エラー出力もあわせて記録したい場合は ./build.sh 2>&1 | tee -a build.log のようにします。
選択肢ごとの解説
- A誤り。オプションなしの tee は指定したファイルを上書きするため、build.log の既存の内容が消えてしまいます。
- B正しい。tee -a は画面へ出力しながら、ファイルの末尾に追記します。
- C誤り。>> で追記はできますが、標準出力はすべてファイルに書き込まれるため、画面には何も表示されません。
- D誤り。tee -i は割り込みシグナル(SIGINT)を無視するオプションで、ファイルは上書きされるため既存の内容が消えます。