mv файл к/dev/null повреждает dev/null

"Большая часть минималистического" пути состояла бы в том, чтобы использовать легкий screenlocker как slock или i3lock и иметь профиль для Вашего второго пользователя, который запускает их сессию с другого TTY:

if [ $(tty) = "/dev/tty2" ]; then
    exec startx -- vt2 &>/dev/null
    logout
fi

Необходимо было бы затем просто заблокировать сессию (связать slock к keybind или имеют триггер xautolock это после периода неактивности), и переключитесь на TTY2 и запустите сессию для User2.

25
04.03.2014, 00:48
3 ответа
[1120907]Глядя на исходный код mv, [1121315]http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c[1121316] :


При первом проходе через цикл while, [1121317]open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)[1121318] с EEXIST произойдет сбой. Затем [1121319]/dev/null[1121320] будет разблокирован, и цикл повторится. Но, как вы указали в своём комментарии, обычные файлы невозможно создать в [1121321]/dev[1121322], поэтому при следующем проходе по циклу [1121323] open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)[1121324] всё равно произойдёт сбой.

Я бы отправил отчёт об ошибке в Apple. Исходный код [1121325]mv[1121326] в основном не изменился по сравнению с версией FreeBSD, но так как у devfs OSX есть такое не-POSIX поведение с обычными файлами, Apple должна исправить их [1121327]mv[1121328].[1120912].

16
27.01.2020, 19:40

Ммм, потому что вы перезаписываете специальный файл обычным? Чего вы ожидали? dev / null - это не каталог, это файл, указывающий на устройство null . Когда вы mv что-то в нем, вы удаляете оригинал и заменяете его тем, что вы переместили:

$ file /dev/null 
/dev/null: character special 
$ sudo mv file /dev/null 
$ file /dev/null 
/dev/null: ASCII text
10
27.01.2020, 19:40

При перемещении файла в местоположение уже существующего файла существующий файл заменяется. В этом случае файл устройства / dev / null заменяется, как и любой обычный файл. Чтобы избежать этого, используйте параметр -i (интерактивный, предупреждает перед перезаписью) или -n (без клобера) для mv .

/ dev / null выполняет только свою специальную функцию как битовое ведро, после чего устройство открывается как есть. Например, когда используется оператор оболочки > , файл открывается, а затем усекается (не удаляется и не заменяется, что может быть именно тем, что вы ожидали). Как упоминал Кейси, правильный способ удалить файл - использовать rm или даже unlink .

12
27.01.2020, 19:40

Теги

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