LinuCレベル1 GNUとUnixのコマンド 問28
GNUとUnixのコマンド/ストリーム、パイプ、リダイレクトの使用コマンド cmd の標準出力と標準エラー出力の両方を、ファイル all.log に書き込みたい。bashの記法として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)
- Acmd 2>&1 > all.log
- Bcmd > all.log 2>&1
- Ccmd > all.log 2> /dev/null
- Dcmd 2> all.log 1> /dev/null
正解:B
解説
リダイレクトは左から順に処理されます。cmd > all.log 2>&1 では、まず標準出力(1)がall.logに向けられ、次に「標準エラー出力(2)を、その時点の標準出力と同じ先へ向ける」ため、両方がall.logに書き込まれます。順序を逆にした cmd 2>&1 > all.log では、2>&1 を処理した時点の標準出力はまだ端末なので、標準エラー出力は端末に出たままになり、all.logには標準出力だけが書き込まれます。なおbashでは cmd &> all.log という短い記法でも、両方を同じファイルに書き込めます。
選択肢ごとの解説
- A誤り。2>&1 の時点では標準出力がまだ端末を向いているため、標準エラー出力は端末に出て、all.logには標準出力だけが入ります。
- B正しい。標準出力をall.logに向けた後で標準エラー出力をそれと同じ先へ向けるため、両方がall.logに書き込まれます。
- C誤り。標準出力はall.logに書き込まれますが、標準エラー出力は /dev/null に捨てられてしまいます。
- D誤り。標準エラー出力はall.logに書き込まれますが、標準出力は /dev/null に捨てられてしまいます。