Saya mencoba mengedit .hgignore dengan cepat file dari bash Shell Cygwin hari ini, dan saya menambahkan baris yang merupakan kesalahan. Saya tidak yakin apakah ini cara terbaik untuk melakukannya, tetapi saya segera berpikir untuk menggunakan head -1 .hgignore untuk menghapus baris yang menyinggung (saya sebelumnya hanya memiliki satu baris dalam file). Benar saja, ketika dijalankan ia memberikan baris pertama sebagai satu-satunya keluaran.
Tetapi ketika saya mencoba mengarahkan ulang output dan menulis ulang file menggunakan head -1 .hgignore > .hgignore , file itu kosong. Mengapa ini terjadi? Jika saya mencoba menambahkan, head -1 .hgignore >> .hgignore , itu ditambahkan dengan benar tetapi ini jelas bukan hasil yang diinginkan. Mengapa pengalihan terpotong tidak berfungsi dalam kasus ini?
Jawaban yang Diterima:
Ketika shell mendapat baris perintah seperti:command > file.out shell itu sendiri membuka (dan mungkin membuat) file bernama file.out . Shell mengatur deskriptor file 0 ke deskriptor file file yang didapatnya dari pembukaan. Begitulah cara kerja pengalihan I/O:setiap proses mengetahui tentang deskriptor file 0, 1, dan 2.
Bagian tersulit dari ini adalah bagaimana untuk membuka file.out . Sebagian besar waktu, Anda ingin file.out dibuka untuk penulisan pada offset 0 (yaitu terpotong) dan inilah yang dilakukan Shell untuk Anda. Itu memotong .hgignore, membukanya untuk menulis, menduplikasi filedescriptor ke 0, lalu menjalankan head . Penghancuran file instan.
Di bash shell, Anda melakukan set noclobber untuk mengubah perilaku ini.