.hgignore
をすばやく編集しようとしていました 今日のCygwinbashシェルからのファイルで、間違いだった行を追加しました。これが最善の方法かどうかはわかりませんが、head -1 .hgignore
を使用することをすぐに考えました。 問題のある行を削除します(以前はファイルに1行しかありませんでした)。案の定、実行すると最初の行が唯一の出力になります。
しかし、出力をリダイレクトし、head -1 .hgignore > .hgignore
を使用してファイルを書き直そうとしたとき 、ファイルは空でした。なぜこれが起こるのですか?代わりに追加しようとすると、head -1 .hgignore >> .hgignore
、正しく追加されますが、これは明らかに望ましい結果ではありません。この場合、切り捨てリダイレクトが機能しないのはなぜですか?
承認された回答:
シェルが次のようなコマンドラインを取得したとき:command > file.out
シェル自体がfile.out
という名前のファイルを開きます(場合によっては作成します)。 。シェルは、ファイル記述子0をオープンから取得したファイルファイル記述子に設定します。これがI/Oリダイレクションの仕組みです。すべてのプロセスがファイル記述子0、1、2を認識しています。
これについて難しいのは、方法です。 file.out
を開きます 。ほとんどの場合、file.out
が必要です オフセット0で書き込み用に開かれています(つまり、切り捨てられています)。これは、シェルが行ったことです。 .hgignoreを切り捨て、書き込み用に開き、ファイル記述子を0に複製してから、head
を実行しました。 。インスタントファイルクロバリング。
bashシェルでは、set noclobber
を実行します この動作を変更します。