Я всегда думал /dev/null
как черная дыра, в способе, которым всеми данными я отправляю, там не отреагируется. Однако существует проблема с тем определением. Согласно Википедии:
/dev/null специальный файл, не каталог, таким образом, нельзя переместить файлы в него с Unix mv команда.
Таким образом после этого определения, почему может я mv
наполнить там? Например, я могу легко сделать:
# touch oi
# mv oi /dev/null
Что продолжается там?
При попытке переместить что-нибудь в/dev/null при простом пользователе (не корень), Вы получите a Permission denied
ошибка, потому что mv something /dev/null
на самом деле пытается удалить /dev/null
и затем переместитесь something
к какой /dev/null
был.
При попытке сделать это под корнем, это удалит /dev/null
(и затем переместите файл, обеспеченный Вами в, он - место)! Можно восстановить его путем перезагрузки или ввода следующего в корневой оболочке (на Linux): mknod /dev/null c 1 3; chmod a+w /dev/null
или в BSD: mknod /dev/null c 3 2; chmod a+w /dev/null
.
Вы не можете
# uname -sr
Linux 2.6.32-ARCH
# touch a
# mv a /dev/null
mv: inter-device move failed: `a' to `/dev/null'; unable to remove target: Permission denied
/dev/null
символьный специальный файл, что означает, что это - файл без содержания, который отмечен как способность получить и снизить потоки байтов к нему. То, что происходит с теми потоками, определяется их номерами устройств. В моей системе BSD в данный момент:
crw-rw-rw- 1 root wheel 3, 2 Jan 25 14:57 /dev/null
номера устройств 3,2 (главное число равняется 3, незначительное число равняется 2). Я могу создать другой /dev/null
как использование файлов mknod /dev/nil c 3 2
, где c означает, что я хочу символьный специальный файл, но в системах BSD, пара номера устройства динамично создается и не могла бы быть той же следующей начальной загрузкой.
Чтобы видеть, как эти факты применяются на практике:
sh-2.05b# mknod /dev/nil c 3 2 sh-2.05b# ls -l /dev/nil crw-r--r-- 1 root wheel 3, 2 Jan 25 15:14 /dev/nil sh-2.05b# echo abc > /dev/nil sh-2.05b# cat < /dev/nil sh-2.05b#
Linux использует главно-незначительную пару 1,3, таким образом, mknod /dev/null c 1 3
воссоздаст Ваш файл там.
Символьные специальные файлы похожи на большинство других файлов во многих отношениях и могут быть удалены, если у Вас есть полномочия. Используя mv
на файле устройств все равно, как будто Вы переместили регулярный файл, который будет означать, что Вы получаете абсолютно новый файл, который можно сказать путем рассмотрения inodes. Например (Mac OS на этот раз, но все *отклоняют, будет вести себя то же здесь):
helen:tmp cas$ touch abc def helen:tmp cas$ ls -i1 3775141 abc 3775142 def helen:tmp cas$ mv abc def helen:tmp cas$ ls -i1 3775141 def helen:tmp cas$ echo clobber > def helen:tmp cas$ ls -i1 3775141 def
Посмотрите как inode, связанный с именем файла def
измененный после того, как я использовал mv
, со старым файлом, просто будучи удаленным, но когда я записал вывод echo
в названный файл def
, inode остался тем же. Так Ваш mv
или перестанет работать, вероятно, если Вы не будете корнем, или удалите файл и положите новый файл под путь /dev/null
, который не является тем, для чего это символьное специальное предложение.
/dev/null похож на черную дыру и/или пустой файл. потрясающий! Можно вставить что-либо здесь и ничего не получить оттуда.