Я прочитал статью Wikipedia о /dev/null
и играл вокруг движущимися файлами к /dev/null
.
Для этого я создал a 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
С тех пор это дало мне a Permission denied
Ошибка; я шел вперед и использовал sudo
поскольку я обычно делаю каждый раз, когда я встречаюсь с a Permission denied
ошибка.
$ sudo mv test_file /dev/null
За командой следуют и test_file
больше не присутствует в каталоге.
Однако в статье Wikipedia говорится, что не возможно восстановить что-либо перемещенное в /dev/null
и это дает EOF
к любому процессу, который пытается читать из него. Но, я могу читать из /dev/null
:
$ cat /dev/null
This is written by Aditya
Что я делал неправильно и как я фиксирую /dev/null
назад к нормальному? И почему я встречался Permission denied
ошибка во-первых?
/ dev / null
- это файл. Специальный файл. Файл устройства, например / dev / sda или / dev / tty, который обращается к части оборудования в вашей системе.
Единственная разница с / dev / null
заключается в том, что с ним не связано никакое оборудование. Любые данные, которые вы отправляете ему, автоматически удаляются. Как следующая команда:
echo "Hello World" > /dev/null
, которая ничего не печатает на вашем терминале, потому что вы отправляете вывод echo
в null, в пустоту, черную дыру, таким образом.
Но когда вы сделали 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
, но вы можете манипулировать и тестировать без какого-либо риска для вашей системы.
Существует большая разница между перезаписью файла и записью в файл.
Когда вы что-то пишете в / 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
)
Когда вы запускаете команду
$ sudo mv test_file /dev/null
, вы заменяете специальный файл / dev / null
на свой текстовый файл. Последующие попытки чтения из / dev / null
возвращают содержимое вашего текстового файла, и программы, которые пытаются использовать / dev / null
обычным способом, вероятно, сломаются.
Для замены или удаления файлов устройств в / dev /
требуются привилегии суперпользователя, поэтому ваша попытка, отличная от sudo, завершилась ошибкой.
См. Ответ Бенуа для получения информации о том, как восстановить / dev / null
вручную, но поскольку большая часть (если не все) содержимого / dev /
динамически управляется udev, я подозреваю, что простая перезагрузка, вероятно, тоже исправит это.
Чтобы ответить на ваш вопрос о том, что вы должны были сделать, чтобы удалить файл, вы делаете:
rm test_file
Как уже говорили другие, / dev / null является местом назначения для вывода программ.