過去問ドリル

LinuCレベル1 GNUとUnixのコマンド 問38

GNUとUnixのコマンド/ストリーム、パイプ、リダイレクトの使用

bashで、ファイル data.txt の行を並べ替えて同じファイルに書き戻そうとして、sort data.txt > data.txt を実行した(noclobberは無効の既定状態)。実行後の data.txt の状態として適切なものはどれか。

当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)

正解:D

解説

リダイレクトはコマンドを起動する前にシェルが処理します。> data.txt によって data.txt は起動前に切り詰められ(空にされ)、その後に sort が空のファイルを読むため、結果として data.txt は空になります。同じファイルを読みながら書き換えたい場合は、一時ファイルに出力してから mv で置き換えるか、出力先を指定する sort -o data.txt data.txt を使います(GNU sortの -o は入力と同じファイルを指定できます)。set -o noclobber を有効にしておくと、> による既存ファイルの上書きがエラーになります。

選択肢ごとの解説

  • A誤り。sort が読み始める時点で data.txt は既に空になっているため、並べ替えた内容は残りません。
  • B誤り。noclobberが無効な既定状態ではエラーにならず、ファイルは切り詰められたうえで sort が実行されます。
  • C誤り。追記になるのは >> を使った場合です。> はファイルを切り詰めてから書き込みます。
  • D正しい。シェルがリダイレクトの処理で data.txt を先に空にするため、sort は空の入力を読み、結果も空になります。
LinuCレベル1の問題を演習モードで解く