/ 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.