GNU/Linux >> Linux の 問題 >  >> Linux

イオリダイレクションとヘッドコマンド?

.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を実行します この動作を変更します。


Linux
  1. findコマンドを使用してLinux上のファイルとディレクトリを検索します

  2. xclipを使用してLinuxコマンドラインでコピーして貼り付けます

  3. Linuxでの入出力とエラーリダイレクトの操作

  1. Linux のパイプとリダイレクト - 解説!

  2. Linux での head コマンドの例

  3. date および watch コマンドの出力をファイルに保存する

  1. $ _対!$。前のコマンドと出力リダイレクトの最後の引数?

  2. Linuxでのファイルコマンドの基本的な例

  3. 出力をファイルに追加する方法は?