Я можу читати з / dev / null; як це виправити?


80

Я читав статтю у Вікіпедії/dev/null та грав у неї, переміщуючи файли в /dev/null.

Для цього я створив test_fileі помістив у нього деякий вміст:

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

Після цього я спробував перемістити файл у /dev/null:

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

Оскільки це призвело до Permission deniedпомилки; Я пішов вперед і використовував так, sudoяк зазвичай роблю, коли стикаюся з Permission deniedпомилкою.

$ sudo mv test_file /dev/null

Команда вдалася і test_fileїї більше немає в каталозі.

Однак у статті Вікіпедії сказано, що відновити щось, що перемістилося, неможливо, /dev/nullі це дає EOFбудь-який процес, який намагається прочитати з нього. Але я можу прочитати з /dev/null:

$ cat /dev/null
This is written by Aditya

Що я зробив неправильно і як виправити /dev/nullнормальний стан? І чому я Permission deniedвперше зіткнувся з помилкою?

Відповіді:


147

/dev/null- файл. Спеціальний файл. Файл пристрою на зразок / dev / sda або / dev / tty, який спілкується з обладнанням у вашій системі.

Єдина відмінність у /dev/nullтому, що жодне обладнання не пов'язане з ним. Будь-які дані, які ви надсилаєте до нього, мовчки відкидаються. Як і наступна команда:

echo "Hello World" > /dev/null

який нічого не надрукує на вашому терміналі, тому що ви надсилаєте висновок echonull, до пустоти, чорної діри.

Але коли ви це зробили, mv test_file /dev/nullви замінили спеціальний файл /dev/nullзвичайним текстовим файлом, зберігаючи його копію test_file. Іншими словами, ви втратили своє /dev/null.

Тепер, що вам потрібно зробити (це реконструювати):

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

Ви повинні реконструювати його, оскільки багато сценаріїв за замовчуванням надсилають вихід /dev/null. Якщо /dev/nullце вже не чорна діра, а звичайний текстовий файл, він може рости, рости та заповнювати вашу файлову систему. І я впевнений, що ви хочете цього уникнути.

І набагато небезпечніше, що багато сценаріїв припускають, що з /dev/nullчитання нічого не буде читати; порушення цього припущення може призвести до випадкового сміття, записаного у файлах по всій вашій системі ... практично неможливо виправити.

І пам’ятайте, що Linux є багатозадачним: під час гри ви працюєте /dev/null, безліч процесів працює і може спричинити хаос навіть протягом декількох секунд «вікна можливостей».

Якщо ви хочете пограти з /dev/nullвами, ви можете створити копію та експериментувати з нею:

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

Створиться /tmp/nullфайл, який працює точно так само, /dev/nullале цим ви можете маніпулювати та перевіряти без будь-якого ризику для вашої системи.


16

Існує велика різниця між перезаписом файлу і записом у файл.

Коли ви щось пишете /dev/null , наприклад,

$ echo Hello > /dev/null

... вона мовчки відкидається. Для цього вам потрібно дозволити на написання /dev/null, на які кожен має:

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

Коли ви перезаписуєте /dev/null , як це зробили з mvкомандою, ви замінюєте спеціальний файл /dev/nullтим, що ви перемістили туди. Не робіть цього! Причина, для якої вам потрібні були привілеї root, полягає в тому, що для перезапису файла потрібні дозволи на запис у каталог, який містить файл , у цьому випадку /dev:

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

Щоб відновити /dev/null, видайте команди

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

(Також див. U&L StackExchange: Як створити/dev/null )


8

При запуску команди

$ sudo mv test_file /dev/null

ви замінили спеціальний файл /dev/nullтекстовим файлом. Подальші спроби зчитування з /dev/nullповернення вмісту вашого текстового файлу та програм, які намагаються використовувати /dev/nullзвичайним способом, ймовірно, зламаються.

Заміна або видалення файлів пристрою /dev/вимагає привілеїв суперпользователя, через що ваша помилка не використовувалась із помилкою.

Дивіться відповідь Бенуа для інформації про те, як відновити /dev/nullвручну, але оскільки більшість (якщо не весь) вмісту /dev/динамічно управляється udev, я підозрюю, що просте перезавантаження, ймовірно, це теж виправить.


6

Щоб відповісти на запитання про те, що ви повинні зробити, щоб видалити файл, зробіть:

rm test_file

Як заявили інші, / dev / null є пунктом для виведення програм.


2
Я не сказав, але питання не в тому, щоб видалити файл ... Я знаю, ми використовуємо rmдля видалення файлів / каталогів ... Я просто читав про це /dev/null, аби зрозуміти більше про нього, я спробував перемістити файли /dev/nullі побачити ефект .. Це питання стосується розуміння того, що я зробив неправильно, переміщуючи файли /dev/null, в результаті чого я можу прочитати з нього зараз ... Питання не в тому, як видалити файли з системи ... Я сподіваюся, що це зрозуміло ... Але ваша відповідь все-таки вітається і досить гарна, щоб залишатися як відповідь ... :-)
Aditya

7
Чесно кажучи, запитую "Що я зробив не так", закликаючи пояснити, що слід було зробити замість цього. Це, мабуть, банально для більшості користувачів, але жоден з інших відповідей навіть не згадував про це.
kapex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.