/ Dev / null'dan okuyabilirim; nasıl düzeltilir?


80

Wikipedia makalesini/dev/null okudum ve dosyalara taşıyarak oynuyordum /dev/null.

Bunun için bir tane yarattım test_fileve içine biraz içerik koydum:

$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya

Daha sonra dosyayı şu noktaya taşımayı denedim /dev/null:

$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied

O zamandan beri, bu bana bir Permission deniedHata verdi ; sudoDevam ettim ve bir Permission deniedhatayla karşılaştığımda normalde yaptığım gibi kullandım .

$ sudo mv test_file /dev/null

Komut başarılı oldu ve test_fileartık dizinde mevcut değil.

Ancak, Vikipedi makalesi, taşınan herhangi bir şeyi kurtarmanın mümkün olmadığını /dev/nullve EOFbundan okumaya çalışan herhangi bir işleme yol açtığını söylüyor. Ancak şunu okuyabilirim /dev/null:

$ cat /dev/null
This is written by Aditya

Neyi yanlış yaptım ve /dev/nullnormale nasıl döndürebilirim? Ve neden Permission denieden başta hatayla karşılaştım ?

Yanıtlar:


147

/dev/nullbir dosyadır. Özel bir dosya. Sisteminizdeki bir donanıma hitap eden / dev / sda veya / dev / tty gibi bir aygıt dosyası.

Aradaki tek fark /dev/null, hiçbir donanıma bağlı olmamasıdır. Ona gönderdiğiniz tüm veriler sessizce atılır. Aşağıdaki komutu beğenin:

echo "Hello World" > /dev/null

terminalinizde hiçbir şey yazdırmaz, çünkü çıktısını echoboşa, boşluğa, kara delik gönderirsiniz .

Ancak yaptığınız zaman mv test_file /dev/null, özel dosyayı /dev/nullnormal bir metin dosyası ile değiştirdiniz, içeriğinizin bir kopyasını alın test_file. Başka bir deyişle, sen kaybettin /dev/null.

Şimdi, yapmanız gereken şey (onu yeniden yapılandırmak için):

sudo rm /dev/null
sudo mknod -m 0666 /dev/null c 1 3

Bunu yeniden yapılandırmalısınız çünkü varsayılan olarak çok sayıda komut dosyası çıktı gönderir /dev/null. Eğer /dev/nullartık bir kara delik ancak normal bir metin dosyasıdır, bu büyümeye büyümeye ve dosya sistemi up doldurabilir. Ve bundan kaçınmak istediğinden eminim.

Ve çok daha tehlikeli bir sürü senaryo, okumanın /dev/nullhiçbir şeyi okumayacağını; Bu varsayımı kırmak, sisteminizin her yerinde dosyalara yazılmış rastgele çöplere yol açabilir ... düzeltmek neredeyse imkansızdır.

Ve Linux'un çok görevli olduğunu unutmayın: oyun oynarken /dev/nullbir çok işlem yürüyor ve birkaç saniye içinde bile “fırsat penceresi” sırasında bile hasara yol açıyor.

Oynamak /dev/nullistiyorsanız bir kopya oluşturabilir ve deneyebilirsiniz:

sudo mknod -m 0666 /tmp/null c 1 3 

/tmp/nullAynı şekilde çalışan, /dev/nullancak sisteminiz için herhangi bir risk almadan manipüle edip test edebileceğiniz bir dosya oluşturacaktır .


16

Bir dosyanın üzerine yazmakla bir dosyaya yazmak arasında büyük bir fark vardır .

Bir şey yazdığınızda /dev/null , örneğin,

$ echo Hello > /dev/null

... sessizce atılır. Bunun için /dev/null, herkesin sahip olduğu yazma izinlerine ihtiyacınız var:

$ ls -l /dev/null 
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null

Ne zaman üzerine /dev/null size yaptıkları gibi mvkomuta, özel dosyanın yerini /dev/nullorada taşındı ne olursa olsun. Bunu yapma! Bunun için kök ayrıcalıklara ihtiyacınız olmasının nedeni, bir dosyanın üzerine yazmak için, dosyayı içeren dizine yazma iznine ihtiyacınız var , bu durumda /dev:

$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev

Geri yüklemek /dev/nulliçin komutları verin

$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3

(Ayrıca bkz. U&L StackExchange: Nasıl oluşturulur?/dev/null )


8

Komutu çalıştırdığınızda

$ sudo mv test_file /dev/null

Eğer var değiştirilen özel bir dosyayı /dev/nullmetin dosyası ile. Daha sonraki okuma denemeleri /dev/nullmetin dosyanızın içeriğini döndürür /dev/nullve normal şekilde kullanmaya çalışan programlar muhtemelen bozulur.

Cihaz dosyalarının değiştirilmesi veya silinmesi /dev/, süper kullanıcı ayrıcalıkları gerektirir; bu nedenle sudo olmayan denemeniz bir hatayla başarısız oldu.

/dev/nullManuel olarak geri yükleme hakkında bilgi için Benoit'in cevabını görün , ancak içeriğinin çoğu (tümü değilse) /dev/udev tarafından dinamik olarak yönetildiğinden, basit bir yeniden başlatmanın muhtemelen onu da düzelteceğinden şüpheleniyorum.


6

Yapmanız gerekenler hakkındaki sorunuzu yanıtlamak, bir dosyayı kaldırmak için yapmanız gerekenler:

rm test_file

Diğerlerinin de belirttiği gibi, / dev / null, programların çıktısı için bir varış noktasıdır.


2
Oy vermedi, ancak soru dosya kaldırma hakkında değil ... rmDosyaları / dizinleri kaldırmak için kullandığımızı biliyorum ... Sadece okudum /dev/nullve hakkında daha fazla şey anlamak için dosyaları taşımaya /dev/nullve görmeye çalıştım Etkisi .. Bu soru şu /dev/nullan okuyabildiğim bir sonucu olarak dosyaları taşıyarak neyi yanlış yaptığımı anlamakla ilgili … Soru, dosyaları sistemden nasıl kaldıracağımla ilgili değil… Umarım öyledir. temizle ... Ama cevabın hala hoş ve cevap olarak tutulacak kadar iyi ... :-)
— Aditya

7
Adil olmak, "Neyi yanlış yaptım" diye sormak, bunun yerine nelerin yapılması gerektiğini açıklama çağrıları yapıyor. Muhtemelen çoğu kullanıcı için önemsizdir ancak diğer cevapların hiçbiri bundan bahsetmemiştir.
— kapex
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.