LinuCレベル1 GNUとUnixのコマンド 問38
GNUとUnixのコマンド/ストリーム、パイプ、リダイレクトの使用bashで、ファイル data.txt の行を並べ替えて同じファイルに書き戻そうとして、sort data.txt > data.txt を実行した(noclobberは無効の既定状態)。実行後の data.txt の状態として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「GNUとUnixのコマンド」に対応。実際の試験問題ではありません)
- A並べ替えた結果が書き込まれ、data.txt は昇順に並んだ内容になる
- Bエラーで sort が起動されず、data.txt は元の内容のまま残る
- C元の内容の後ろに、並べ替えた結果が追記された内容になる
- Dsort が読む前にシェルがファイルを空にするため、空になる
正解: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 は空の入力を読み、結果も空になります。