/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 , а это не то, для чего предназначен этот символ.