Haruskah saya menggunakan kurung sudut tunggal atau ganda untuk mengalihkan ke / dev / null?

18

Sebagian besar jawaban di sini [ 1 ] [ 2 ] [ 3 ] menggunakan braket sudut tunggal untuk mengalihkan ke / dev / null, seperti ini:

command > /dev/null

Tetapi menambahkan ke / dev / null juga berfungsi:

command >> /dev/null

Kecuali untuk karakter tambahan, apakah ada alasan untuk tidak melakukan ini? Apakah salah satu dari ini "lebih baik" dengan implementasi / dev / null yang mendasarinya?

Sunting:
Halaman manual terbuka (2) mengatakan lseek dipanggil sebelum setiap penulisan ke file dalam mode append:

O_APPEND
File dibuka dalam mode append. Sebelum setiap penulisan (2), offset file diposisikan di akhir file, seolah-olah dengan lseek (2). Modifikasi offset file dan operasi penulisan dilakukan sebagai langkah atom tunggal.

yang membuat saya berpikir mungkin ada penalti kinerja kecil untuk menggunakan >>. Tetapi di sisi lain memotong / dev / null sepertinya operasi yang tidak terdefinisi menurut dokumen itu:

O_TRUNC
Jika file sudah ada dan merupakan file biasa dan mode akses memungkinkan penulisan (yaitu, O_RDWR atau O_WRONLY) file akan terpotong dengan panjang 0. Jika file tersebut merupakan file perangkat FIFO atau terminal, flag O_TRUNC diabaikan. Kalau tidak, efek O_TRUNC tidak ditentukan.

dan spec POSIX mengatakan >akan memotong file yang sudah ada , tetapi O_TRUNC adalah implementasi yang ditentukan untuk file perangkat dan tidak ada kata tentang bagaimana / dev / null harus merespons terpotong .

Jadi, apakah memotong / dev / null sebenarnya tidak ditentukan? Dan apakah panggilan lseek berdampak pada kinerja penulisan?

Morgan
sumber

Jawaban:

27

Dengan definisi /dev/nullmenenggelamkan apa pun yang ditulis untuk itu , jadi tidak masalah jika Anda menulis dalam mode tambahkan atau tidak, semuanya dibuang. Karena tidak menyimpan data, tidak ada yang perlu ditambahkan, sungguh.

Jadi pada akhirnya, hanya lebih pendek untuk menulis > /dev/nulldengan satu >tanda.

Adapun tambahan yang diedit:

Buka (2) halaman manual mengatakan lseek dipanggil sebelum masing-masing menulis ke file dalam mode tambahan.

Jika Anda membaca dengan seksama, Anda akan melihatnya berbunyi (penekanan pada saya):

file offset diposisikan di akhir file, seolah-olah dengan lseek (2)

Artinya, itu tidak (perlu) benar-benar memanggil panggilan lseeksistem, dan efeknya tidak sepenuhnya sama: panggilan lseek(fd, SEEK_END, 0); write(fd, buf, size);tanpa O_APPENDtidak sama dengan menulis dalam mode tambahkan, karena dengan panggilan terpisah proses lain dapat menulis ke file di antara panggilan sistem, membuang data yang ditambahkan. Dalam mode penambahan, ini tidak terjadi (kecuali lebih dari NFS, yang tidak mendukung mode penambahan nyata ).

The teks dalam standar tidak menyebutkan lseekpada saat itu, hanya itu menulis akan pergi akhir file.

Jadi, apakah pemotongan / dev / null sebenarnya tidak ditentukan?

Menilai oleh tulisan suci yang Anda rujuk, tampaknya itu adalah implementasi yang ditentukan. Berarti bahwa setiap implementasi waras akan melakukan hal yang sama dengan pipa dan TTY, yaitu, tidak ada. Implementasi gila mungkin melakukan sesuatu yang lain, dan mungkin pemotongan mungkin berarti sesuatu yang masuk akal dalam kasus beberapa file perangkat lain.

Dan apakah panggilan lseek berdampak pada kinerja penulisan?

Menguji. Ini satu-satunya cara untuk mengetahui dengan pasti pada sistem yang diberikan. Atau baca sumber untuk melihat di mana mode tambahan mengubah perilaku, jika ada di mana saja.

ilkkachu
sumber
-3

Jika efisiensi yang Anda inginkan, gunakan command >&-saja. Ini menutup deskriptor file daripada mengarahkan ulang, jadi tidak ada waktu yang terbuang untuk menulis semuanya.

db48x
sumber
3
Jangan tutup stream kurang dari 3. Ini alias deskriptor std * dengan deskriptor file acak; berpotensi dengan hasil bencana.
Yosua
7
Jika Anda baru saja menutup deskriptor file, program akan mendapatkan kesalahan pada setiap panggilan tulis, mungkin mengarah ke pesan kesalahan yang mengganggu dan mungkin program berakhir sebelum menyelesaikan tugasnya.
ilkkachu