cat /dev/null > file.txt
adalah penggunaan kucing yang tidak berguna .
Pada dasarnya cat /dev/null
hanya menghasilkan cat
keluaran apa-apa. Ya itu berhasil, tetapi disukai oleh banyak orang karena menghasilkan proses eksternal yang tidak perlu.
Itu salah satu hal yang umum hanya karena itu umum.
Menggunakan just > file.txt
akan bekerja pada sebagian besar shell, tetapi tidak sepenuhnya portabel. Jika Anda ingin sepenuhnya portabel, berikut ini adalah alternatif yang baik:
true > file.txt
: > file.txt
Keduanya :
dan true
tidak menghasilkan data, dan shell builtin (sedangkan cat
utilitas eksternal), sehingga mereka lebih ringan dan lebih 'tepat'.
Memperbarui:
Seperti yang disebutkan tylerl dalam komentarnya, ada juga >| file.txt
sintaksisnya.
Kebanyakan shell memiliki pengaturan yang akan mencegah mereka memotong file yang sudah ada >
. Anda harus menggunakannya >|
sebagai gantinya. Ini untuk mencegah kesalahan manusia saat Anda benar-benar ingin menambahkannya >>
. Anda dapat mengaktifkan perilaku set -C
.
Jadi dengan ini, saya pikir metode yang paling sederhana, paling tepat, dan portabel untuk memotong file adalah:
:>| file.txt
:
juga diamanatkan oleh POSIX untuk menjadi built-in, dan pada kenyataannya berbeda daritrue
yang dianggap sebagai "khusus" built-in .>| file
adalah truncate yang lebih eksplisit.true
tidak harus dibangun dan secara tradisional tidak.:
dibangun di semua kulit keluarga Bourne.:
adalah builtin khusus per POSIX (jadi: > file
akan keluar dari shell misalnya jikafile
tidak dapat dibuka untuk ditulis dalam shell POSIX) dantrue
tidak. POSIX bahkan menyebutkan bahwa:
mungkin lebih efisien daripadatrue
pada beberapa sistem.Dalam hal portabilitas:
Catatan:
sh
atauksh
emulasi, untuk pengalihan tanpa perintah, di zsh, diasumsikan perintah default (pager untuk pengalihan stdin saja,cat
jika tidak), yang dapat disetel dengan variabel NULLCMD dan READNULLCMD. Itu terinspirasi dari fitur serupa di(t)csh
:
di UnixV7 seperti:
yang ditafsirkan setengah jalan antara pemimpin komentar dan perintah nol. Kemudian mereka dan seperti untuk semua builtin, jika pengalihan gagal, yang keluar dari shell.:
daneval
menjadi built-in khusus, jika pengalihan gagal, yang keluar dari shell (bash
hanya melakukannya dalam mode POSIX).(t)csh
, itu mendefinisikan label nol (untukgoto
), jadigoto ''
akan ada cabang di sana. Jika pengalihan gagal, itu keluar dari shell.$PATH
(:
umumnya tidak,true
,cat
,cp
danprintf
umumnya (POSIX mengharuskan mereka)).file
symlink ke file yang tidak ada, beberapacp
implementasi seperti GNU akan menolak untuk membuatnya.Dalam hal keterbacaan:
(bagian ini sangat subjektif)
> file
. Itu>
terlihat seperti prompt atau komentar. Juga pertanyaan yang akan saya tanyakan ketika membaca itu (dan kebanyakan shell akan mengeluh tentang hal yang sama) adalah output apa yang Anda arahkan? .: > file
.:
dikenal sebagai perintah no-op. Sehingga dibaca langsung sebagai menghasilkan file kosong. Namun, di sini lagi, itu:
dapat dengan mudah dilewatkan dan / atau dilihat sebagai prompt.true > file
: apa hubungannya boolean dengan redirection atau konten file? Apa yang dimaksud di sini? adalah hal pertama yang terlintas di pikiran saya ketika saya membaca itu.cat /dev/null > file
. Bergabung/dev/null
kefile
?cat
yang sering dianggap sebagai perintah untuk membuang isi file, yang masih bisa masuk akal: membuang isi yang file kosong kefile
, sedikit seperti cara berbelit-belit untuk mengatakancp /dev/null file
tapi masih bisa dimengerti.cp /dev/null file
. Menyalin isi file kosong kefile
. Masuk akal, meskipun seseorang tidak tahu bagaimanacp
dimaksudkan untuk melakukan secara default mungkin berpikir Anda mencoba untuk membuatfile
sebuahnull
perangkat juga.eval > file
ataueval '' > file
. Tidak menjalankan apa pun dan mengalihkan outputnya ke afile
. Masuk akal bagi saya. Aneh bahwa itu bukan idiom yang umum.printf '' > file
: secara eksplisit tidak mencetak apa pun ke dalam file. Yang paling masuk akal bagi saya.Dari segi kinerja
Perbedaannya adalah apakah kita menggunakan shell builtin atau tidak. Jika tidak, suatu proses harus bercabang dua, perintah dimuat dan dieksekusi.
eval
dijamin akan dibangun di semua kerang.:
bawaan di mana pun itu tersedia (suka Bourne / csh).true
dibangun dalam cangkang mirip Bourne saja.printf
adalah built-in sebagian besar kerang mirip Bourne modern danfish
.cp
dancat
umumnya tidak built-in.Sekarang
cp /dev/null file
tidak meminta pengalihan shell, jadi hal-hal seperti:akan lebih efisien daripada:
(meskipun tidak harus dari:
).
Sendiri
Secara pribadi, saya menggunakan
: > file
kerang mirip Bourne, dan tidak menggunakan apa pun selain kerang seperti Bourne hari ini.sumber
dd of=file count=0
?dd
(seperti setidaknya Solaris 10),count=0
diabaikan.dd if=/dev/null of=file
akan lebih portabel. Bagaimanapun, itu independen dari shell.cp /dev/null file
, bukan?cp /dev/null file
adalah idiom yang umum. Saya membatasi mereka, intinya bukan daftar semua cara yang mungkin.Anda mungkin ingin melihat
truncate
, yang melakukan hal itu: memotong file.Sebagai contoh:
Ini mungkin lebih lambat daripada menggunakan
true > file.txt
.Namun poin utama saya adalah:
truncate
dimaksudkan untuk memotong file, sementara menggunakan> memiliki efek samping memotong file.sumber
truncate
akan tersedia, tetapi perpustakaan C>
atau tidakunistd
akan tersedia?truncate
adalah utilitas FreeBSD, relatif baru-baru ini (2008) ditambahkan ke GNU coreutils (meskipun--size
gaya opsi panjang GNU adalah spesifik GNU), jadi itu tidak tersedia dalam sistem non-GNU-atau-FreeBSD, dan itu tidak tersedia di sistem GNU yang lebih lama, Saya tidak akan mengatakan itu portabel.cp /dev/null file
akan bekerja tanpa pengalihan shell dan akan lebih portabel.Jawabannya sedikit tergantung pada apa
file.txt
itu, dan bagaimana proses menulisnya!Saya akan mengutip kasus penggunaan umum: Anda memiliki logfile yang sedang tumbuh dipanggil
file.txt
, dan ingin memutarnya.Karena itu Anda menyalin, misalnya,
file.txt
ke dalamfile.txt.save
, lalu memotongfile.txt
.Dalam skenario ini, JIKA file tidak dibuka oleh
another_process
(mis:another_process
bisa berupa program keluaran ke file itu, misalnya program mencatat sesuatu), maka 2 proposal Anda setara, dan keduanya berfungsi dengan baik (tetapi yang kedua lebih disukai sebagai pertama "cat / dev / null> file.txt" adalah Penggunaan Cat yang Tidak Berguna dan juga terbuka dan membaca / dev / null).Tetapi masalah sebenarnya adalah jika
other_process
masih aktif, dan masih memiliki pegangan terbuka ke file.txt.Kemudian, 2 kasus utama muncul, tergantung pada seberapa
other process
membuka file:Jika
other_process
membukanya dengan cara normal, maka pegangan akan tetap menunjuk ke lokasi sebelumnya dalam file, misalnya pada offset 1200 byte. Oleh karena itu, penulisan berikutnya akan dimulai pada offset 1200, dan dengan demikian Anda akan memiliki lagi file sebesar 1200bytes (+ apa pun yang ditulis_proses lain), dengan 1200 karakter null terkemuka! Bukan apa yang Anda inginkan , saya kira.Jika
other_process
dibukafile.txt
di "append mode", maka setiap kali ia menulis, pointer akan secara aktif mencari ke akhir file. Karena itu, ketika Anda memotongnya, ia akan "mencari" sampai byte 0, dan Anda tidak akan memiliki efek samping yang buruk! Ini yang Anda inginkan (... biasanya!)Perhatikan bahwa ini berarti Anda perlu, ketika Anda memotong file, untuk memastikan bahwa semua yang
other_process
masih menulis ke lokasi itu telah membukanya dalam mode "append". Jika tidak, Anda harus menghentikannyaother_process
, dan mulai lagi, sehingga mereka mulai menunjuk di awal file alih-alih lokasi sebelumnya.Referensi: /programming//a/16720582/1841533 untuk penjelasan yang lebih bersih, dan contoh singkat yang bagus tentang perbedaan antara mode log normal dan append logging di /programming//a/984761/1841533
sumber
cat /dev/null > file
dan a> file
adalahcat /dev/null
dan itu tidak membuat perbedaan pada file.Saya suka ini dan sering menggunakannya karena terlihat lebih bersih dan tidak seperti seseorang menekan kunci kembali secara tidak sengaja:
Harus jadi built-in juga?
sumber
echo
implementasi yang tidak mendukung-n
(dan akan menampilkan di-n<SPC><NL>
sini.printf '' > file.txt
Akan lebih portabel (setidaknya di seluruh sistem modern / POSIX)