7

Я всегда думал о /dev/null как о черной дыре, так как все данные, которые я отправляю туда, не будут возвращены. Однако есть проблема с этим определением. Согласно Википедии:

/dev/null - это специальный файл, а не каталог, поэтому в него нельзя переместить файлы с помощью команды Unix mv.

Итак, следуя этому определению, почему я могу там что-то mv ? Например, я могу легко сделать:

# touch oi
# mv oi /dev/null

Что там происходит?

7 ответов7

8

Если вы попытаетесь что-то переместить в /dev /null под обычным пользователем (не root), вы получите ошибку « 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 .

5

Когда вы делаете это:

# mv oi /dev/null

Вы на самом деле делаете эквивалент следующего

# rm /dev/null
# mv oi /dev/null
3

Ты не можешь

# 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
2

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

0

Зачем mv файл в /dev/null (даже если это возможно), когда вы можете просто удалить его?

Конечно, /dev/null более полезен и предназначен для назначения выходных данных?

0

Shell Scripting - это общее использование:

cat somefile >/dev/null 2>&1

Иногда вы не хотите видеть / показывать ошибки и т.д.

-1

/dev/null похож на черную дыру и / или пустой файл. потрясающий! Вы можете положить что-нибудь сюда и ничего не получить оттуда.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .