Если я делаю: touch file; mv file /dev/null
как root, /dev/null
исчезает. ls -lad /dev/null
в результате нет такого файла или каталога. Это ломает приложения, которые зависят от /dev/null
подобного SSH и могут быть решены путем mknod /dev/null c 1 3; chmod 666 /dev/null
. Почему перемещение обычного файла в этот специальный файл приводит к исчезновению /dev/null
?
Чтобы уточнить, это было в целях тестирования, и я понимаю, как mv
работает команда. Что меня интересует, так это то, почему ls -la /dev/null
перед заменой его обычным файлом отображается ожидаемый результат, но впоследствии он показывает, что /dev/null
его не существует, даже если файл был предположительно создан с помощью исходной mv
команды, а команда file показывает текст ASCII. Я думаю, что это должно быть сочетание ls
поведения команды в сочетании с тем, devfs
когда не специальный файл заменяет символ / специальный файл. Это на Mac OS X, поведение может отличаться на других ОС.
/dev/null
.rm
команда.devfs
смешно с обычными файлами. Странно, вы не получили ошибку,mv
хотя. Как об этом пути:touch testfile; mv testfile /dev
?mv
может быть атомарным только в одной файловой системе.Ответы:
Глядя на исходный код для mv, http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
При первом прохождении цикла while
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
произойдет сбой EEXIST. Затем/dev/null
будет отключен, и цикл повторяется. Но, как вы указали в своем комментарии, обычные файлы не могут быть созданы/dev
, поэтому при следующем прохождении циклаopen(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
все равно произойдет сбой.Я бы подал отчет об ошибке в Apple.
mv
Исходный код в основном не отличается от версии FreeBSD, а потому , что DevFS OSX имеет такое поведение не-POSIX с обычными файлами, Apple должна исправить ихmv
.источник
Перемещение файла в местоположение уже существующего файла заменяет существующий файл. В этом случае
/dev/null
файл устройства заменяется, как и любой обычный файл. Чтобы избежать этого, используйте параметр-i
(интерактивный, предупреждает перед перезаписью) или-n
(без расширения) дляmv
./dev/null
только выполняет свою специальную функцию в качестве набора битов, затем устройство открывается как есть. Например, когда используется>
оператор оболочки, файл открывается, затем усекается (не удаляется замененный, что может быть тем, что вы ожидали). Как упомянул Кейси, правильный способ удаления файла - сrm
или даже сunlink
.источник
Хм, потому что вы перезаписали специальный файл обычным? Чего ты ожидал?
dev/null
это не каталог, это файл, указывающий наnull
устройство. Когда выmv
что-то делаете, вы удаляете оригинал и заменяете его тем, что вы переместили:источник
/dev/null
, это просто файл, который я переместил.