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.