При попытке переместить каталог test_dir
в / dev / null
, я получаю сообщение
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
Тогда почему люди говорят: «Не запускайте команду sudo mv ~ / dev / null
, она переместит ваш домашний каталог в дыру?»
Но / home
также является каталогом.
Потому что люди предполагают. Я был одним из тех людей , пока не проверил его .Легко понять, почему люди считают ... Это выглядит опасным ...
... но на самом деле вы не можете перемещать вещи в / dev / null
- это специальный файл, который просто поглощает редиректы (и отправляет их в небытие). Если вы попытаетесь переместить в него каталог, файловая система громко взорвется вам в лицо, и если вы попытаетесь переместить в него файл, вы, вероятно, в конечном итоге замените его.
Первая ссылка будет иметь дело с каталогами, но вот отдельный тест просто на перезапись его файлом. Как отмечает Рмано в комментариях, это, вероятно, то, что вам не следует делать без присмотра взрослых. Это связано с риском.
$ echo "this is my file" > test
$ cat test
this is my file
$ sudo mv test /dev/null
$ cat /dev/null
this is my file
# Fix this!
$ sudo rm /dev/null
$ sudo mknod -m 0666 /dev/null c 1 3
Все, что отправлено в / dev / null
, автоматически отбрасывается.
Если вы наберете:
echo "Hello World"
, вы получите Hello World
на экране.
Если вы наберете:
echo "Hello World" >/dev/null
, на экране ничего не появится.
Но в случае команды перемещения, команда mv
попытается заменить файл / dev / null на каталог , что невозможно. Поскольку в Linux все является файлом, / dev / null - это файл. Разумеется, специальный (файл устройства), специальный файл, позволяющий получить доступ к аппаратному обеспечению (например, дискам, разделам, звуковым картам, последовательным портам и т. Д.). В случае / dev / null он не связан с каким-либо оборудованием, поэтому отправленные на него данные автоматически отбрасываются. Вот почему «они», возможно, назвали это черной дырой.
Вы можете записывать файлы или другие входные потоки в / dev / null
, но не в каталоги. Если вы попытаетесь переместить каталог в / dev / null
, он выдаст сообщение об ошибке, поскольку / dev / null
не каталог, а файл.
Однако, поскольку вы хотите Поэкспериментируйте с / dev / null
, сначала вам предлагается узнать о последствиях перемещения файла для перезаписи / dev / null
и как выйти из этой ситуации:
Как предлагает @Rmano в ответ на этот вопрос, чтобы поэкспериментировать с / dev / null
, мы должны скорее создайте его копию, а затем проведите наши эксперименты. Итак, давайте создадим / tmp / null
и будем использовать его для наших экспериментов:
sudo mknod -m 0666 /tmp/null c 1 3
Теперь / tmp / null
- это наш / dev / null
для всех целей:
Давайте создадим test_file
и test_dir
внутри каталога с именем ask_ubuntu
.
$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file
Ниже показано содержимое ] каталог ask_ubuntu
:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya 0 Mar 18 17:10 test_file
Теперь попробуйте переместить наш test_file
в / tmp / null
и просмотрите содержимое ask_ubuntu
:
$ sudo mv test_file /tmp/null # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
команда выполнена успешно, и test_file
больше не доступен. Теперь попробуйте переместить test_dir
в / tmp / null
, но безуспешно:
$ sudo mv test_dir/ /tmp/null
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’
test_dir
все еще присутствует внутри ask_ubuntu
:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
Теперь давайте посмотрим, сможем ли мы восстановить наш test_file
из / tmp / null
:
$ cat /tmp/null
Let us test if we can recover our test_file.
Итак, он все еще там и / tmp / null
, который был перезаписан специальный файл и стал как любой другой нормальный файл. Мы можем восстановить наш файл, скопировав / tmp / null
, как и любой другой файл:
$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.
Файл восстановлен.
Если вы не создавали / tmp / null
и попробовал эти команды напрямую, используя / dev / null
; убедитесь, что вы восстановили файл (если нужно), запустив cp / dev / null our_test_file
; и восстановите / dev / null
для тех целей, которые он существует в нашей системе, выполнив как можно скорее следующие команды, указанные в связанном вопросе:
$ sudo rm /dev/null
$ sudo mknod /dev/null c 1 3
$ sudo chmod 666 /dev/null
Таким образом, невозможно переместите каталог в / dev / null
и, следовательно, нет вопроса о восстановлении каталога оттуда.
Что касается файлов, если вы непосредственно перемещаете файлы в / dev / null
, вы все равно можете восстановить его, как показано выше. Однако есть два исключения:
Во время выполнения sudo mv test_file / dev / null
и cp / dev / null our_test_file
, если какой-либо корневой сценарий в системе перезаписывает это можно сделать, запустив echo «Любой текст, который корневой скрипт хочет отправить в / dev / null»> / dev / null
(или другие подобные команды). Тогда у нас не будет простого способа восстановить наш файл.
Если вы перезагрузите систему между выполнением этих двух команд. / dev / null
создается повторно при загрузке, поэтому наш файл теряется при выключении компьютера.
Но если вы хотите восстановить входные потоки, такие как echo "Передайте эту строку в / dev / null "> / dev / null
, вы не можете восстановить это, поскольку / dev / null
- это специальный файл для удаления ненужных файлов и входных потоков, и, как упоминается в статье Википедии, это не так. не предоставляют никаких данных процессу, который читает из него.
/ dev / null
- это просто файл, это файл «специальных символов», но, тем не менее, он связан с правилами, которым должны следовать файлы. При этом вы никогда не сможете выполнить эту команду:
$ mv ~ /dev/null
Команда mv
не позволит этого, поскольку вы перемещаете каталог в файл, что просто не имеет смысла контекстно и mv
знает это.
$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’
Вы также не сможете скопировать на / dev / null
, учитывая, что это символьный файл, если вы попытаетесь скопировать на него обычный файл.
$ cp ~/bzip2_1.0.6-4_amd64.deb /dev/null
$ ls -l |grep null
crw-rw-rw- 1 root root 1, 3 Mar 16 14:25 null
Единственное, что вы можете сделать с этим файлом, это скопировать mv
поверх другого файла или удалить его.
$ mv /path/to/afile /dev/null
После этой команды / dev / null
будет обычным файлом .Наиболее опасный эффект этого изменения заключается в том, что / dev / null
должен никогда не выводить какие-либо данные, поэтому некоторые сценарии оболочки будут считать, что
`... < /dev/null`
эквивалентно слову " ничего". Несоблюдение этого предположения может привести к тому, что случайные данные (ну, данные, которые последний процесс записал в `/ dev / null ') будут вставлены в системные файлы по всей системе, что может привести к поломке и невозможности восстановления системы.