Mengapa Anda ingin / dev / null ke sesuatu?
Anda akan melakukan itu untuk memotong isi file sambil menjaga inode tetap utuh. Semua program yang membuka file untuk membaca atau menulis tidak akan terpengaruh di luar fakta ukuran file akan diatur ulang ke nol.
Alternatif palsu yang sering ditemukan adalah menghapus file kemudian membuatnya lagi:
rm file
touch file
atau yang serupa:
mv file file.old
gzip file.old
touch file
Masalahnya adalah metode ini tidak mencegah file lama dari terus ditulis oleh proses apa pun yang memiliki file yang dihapus terbuka pada waktu penghapusan. Alasan mengapa berada di bawah sistem file Unix, ketika Anda menghapus file, Anda hanya memutuskan tautan namanya (path) dari kontennya (inode). Inode tetap hidup selama ada proses yang terbuka untuk membaca atau menulis.
Ini menyebabkan beberapa efek negatif: log yang ditulis setelah penghapusan file hilang karena tidak ada cara mudah / portabel untuk membuka file yang dihapus. Selama proses menulis ke file yang dihapus, isinya masih menggunakan ruang pada sistem file. Itu berarti bahwa jika Anda menghapus / membuat file karena itu mengisi disk Anda, disk tetap terisi. Salah satu cara untuk memperbaiki masalah terakhir ini adalah memulai kembali proses logger tetapi Anda mungkin tidak ingin melakukannya karena layanan penting dan log perantara akan hilang secara definitif. Ada juga efek samping karena file yang Anda buat mungkin tidak memiliki izin, pemilik, dan grup yang sama dengan yang asli. Ini misalnya dapat mencegah penganalisa log untuk membaca file yang baru dibuat, atau lebih buruk, mencegah proses logging untuk menulis log sendiri.
Metode pertama, cat /dev/null > filemencapai tujuan dengan benar , meskipun memiliki legenda urban yang ulet, cat /dev/nullbagiannya sama sekali tidak berguna. Ini membuka file pseudo yang kosong oleh desain, gagal membaca apa pun dari itu dan akhirnya hanya keluar. Dengan menggunakan perintah ini maka buang-buang tombol, byte, panggilan sistem, dan siklus CPU dan dapat diganti tanpa perubahan fungsional dengan perintah no-op yang lebih cepat :atau bahkan, dengan sebagian besar shell, tanpa perintah sama sekali.
Biarkan saya mencoba metafora untuk menjelaskan betapa tidak berguna cat /dev/nullitu. Katakanlah tujuan Anda adalah mengosongkan gelas.
Anda pertama-tama mengeluarkan cairan apa pun darinya. Itu cukup dan tepat apa ( > file) tidak mengingat fakta pengalihan selalu diproses terlebih dahulu.
Kemudian, Anda mengambil botol kosong ( /dev/null) dan menuangkannya ke gelas kosong ( cat). Ini adalah langkah sia-sia ...
Jika Anda membaca dokumen tertaut Anda sampai akhir, Anda mungkin memperhatikan komentar di baris ini dari versi skrip yang disempurnakan:
cat / dev / null> wtmp # ':> wtmp' dan '> wtmp' memiliki efek yang sama.
Mereka memang punya; terlalu buruk cat /dev/nulldisimpan dalam kode.
Itu berarti bahwa kode berikut ini akan berfungsi dengan semua shell umum (baik cshdan shkeluarga):
cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."
dan ini akan bekerja dengan semua kerang menggunakan sintaks Bourne, seperti ash, bash, ksh, zshdan sejenisnya:
cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
Perhatikan bahwa dengan shell Bourne pre-POSIX kuno, salah satu dari perintah ini, termasuk perintah cat /dev/nulltidak akan memotong file jika ditulis sesudahnya oleh skrip shell yang masih berjalan yang menambahkannya. Alih-alih file byte nol, itu akan menjadi file jarang dengan ukurannya tidak berubah. Hal yang sama akan terjadi jika file tersebut ditulis oleh suatu proses mencari ke posisi yang dianggapnya saat ini sebelum menulis.
Hati-hati juga bahwa beberapa solusi alternatif sering disarankan untuk memotong file yang memang memiliki kekurangan.
Kedua hal berikut ini tidak melakukan pekerjaan. File yang dihasilkan tidak kosong tetapi berisi baris kosong. Ini akan memecah file log seperti wtmpitu menyimpan catatan lebar tetap.
echo > file
echo "" > file
Yang berikutnya berdasarkan shopsi BSD tidak portabel, POSIX tidak menentukan opsi yang diizinkan untuk gema sehingga Anda mungkin berakhir dengan file yang berisi baris dengan " -n":
echo -n > file
Yang itu juga tidak portabel dengan menggunakan shurutan pelarian System V. Beberapa shell akan membuat file yang berisi baris dengan " \c":
echo "\c" > file
Yang itu menggunakan perintah yang dirancang untuk melakukan pekerjaan itu. Masalah yang digunakan truncatetidak portabel karena perintah ini, yang tidak ditentukan oleh POSIX, mungkin hilang dari sistem Unix / Linux.
truncate -s 0
Akhirnya, berikut adalah beberapa alternatif yang portabel dan akan melakukan pekerjaan dengan baik: