Jika kita gunakan echo 1234 >> some-file
maka Dokumentasi mengatakan bahwa output ditambahkan.
Dugaan saya adalah, jika beberapa file tidak ada, maka O_CREAT akan membuat file baru. Jika >
digunakan, maka O_TRUNC akan memotong file yang ada.
Dalam kasus >>
: Apakah file akan dibuka sebagai O_WRONLY (atau O_RDWR) dan berusaha untuk mengakhiri dan menulis operasi dilakukan, mensimulasikan O_APPEND? Atau apakah file akan dibuka sebagai O_APPEND, membiarkannya ke kernel untuk memastikan penambahan terjadi?
Saya menanyakan hal ini karena proses conserver menimpa beberapa marker yang dimasukkan oleh echo, ketika file output berasal dari titik mount NFS, & Dokumentasi NFS mengatakan O_APPEND tidak didukung di server, jadi kernel klien harus menanganinya. Saya kira proses conserver menggunakan O_APPEND, tetapi tidak yakin tentang bash >>
di linux, maka mengajukan pertanyaan di sini.
O_APPEND
tidak didukung; masalahnya adalah ini ditiru. Pada sistem file lokal, beberapa proses penulisan ke file yang sama dibuka denganO_APPEND
tidak akan pernah menimpa data masing-masing; pada NFS,O_APPEND
ditiru dengan mencari sampai akhir sebelum menulis, yang meninggalkan kemungkinan kondisi balapan. Tidak ada jalan lain di NFS ini; setiap penulis paralel perlu menulis file sendiri. Satu-satunya cara untuk mengatasi ini adalah menyiapkan proses server pada server NFS, memiliki logger log|nc server port
, dan meminta server menambahkan data yang masuk ke log.Jawaban:
Saya menjalankan ini:
strace -o spork.out bash -c "echo 1234 >> some-file"
untuk mencari tahu pertanyaan Anda. Inilah yang saya temukan:Tidak ada file bernama "some-file" ada di direktori tempat saya menjalankan
echo
perintah.sumber
Ini tidak hanya dilakukan di Bash, itu diperlukan oleh standar.
Dari Spesifikasi Single Unix :
Oleh karena itu setiap shell yang mematuhi POSIX harus melakukannya. Pada beberapa sistem Unix,
/bin/sh
mungkin shell Bourne non-POSIX (Shell Bourne awalnya ditulis sebelumO_APPEND
diciptakan), dan shell POSIX yang tersedia biasanyaksh
, yang akan tersediash
di lokasi jalur yang berbeda seperti Solaris's/usr/xpg4/bin
.sumber
open()
.>>
sendiri diperkenalkan oleh pendahulunya shell Thomson.Melihat di sumbernya, ia menggunakan O_APPEND. Untuk bash 4.3.30 di
make_cmd.c
baris 710-713 baca:sumber
Mari selidiki yang menggunakan
strace
sistem file lokal (non-NFS):Kerang lainnya, yaitu
dash
,dash
,sh
dari busybox' danmksh
berperilaku dengan cara yang sama.Opsi ini
-e open
berarti-e trace=open
hanya melacakopen()
panggilan sistem.sumber