/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
для файла устройства аналогично тому, как если бы вы переместили обычный файл, это будет означать, что вы получите совершенно новый файл, о котором вы можете узнать, посмотрев на иноды. Например (на этот раз Mac OS, но все * nixes будут вести себя одинаково):
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
Посмотрите, как изменился индекс, связанный с именем файла def
после того, как я использовал mv
, при этом старый файл просто удалялся, но когда я записал вывод echo
в файл с именем def
, индекс остался прежним. Таким образом, ваш mv
либо потерпит неудачу, скорее всего, если вы не являетесь пользователем root, либо удалите файл и поместите новый файл в путь /dev/null
, а это не то, для чего предназначен этот символ.