Почему я могу переместить вещи в/dev/null несмотря на него являющийся псевдоустройством, представленным файлом?

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

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

Таким образом после этого определения, почему может я mv наполнить там? Например, я могу легко сделать:

# touch oi
# mv oi /dev/null

Что продолжается там?

7
задан 02.05.2016, 20:17

7 ответов

При попытке переместить что-нибудь в/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.

8
ответ дан 07.12.2019, 14:34

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

# mv oi /dev/null

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

# rm /dev/null
# mv oi /dev/null
5
ответ дан 07.12.2019, 14:34

Вы не можете

# 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
3
ответ дан 07.12.2019, 14:34

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

2
ответ дан 07.12.2019, 14:34

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

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

0
ответ дан 07.12.2019, 14:34

Сценарии Shell являются общим использованием:

cat somefile >/dev/null 2>&1

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

0
ответ дан 07.12.2019, 14:34

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

-1
ответ дан 07.12.2019, 14:34

Теги

Похожие вопросы