Si je le fais: en touch file; mv file /dev/null
tant que root, /dev/null
disparaît. ls -lad /dev/null
résulte en aucun fichier ou répertoire. Cela casse les applications qui dépendent de /dev/null
SSH similaires et peuvent être résolues en faisant mknod /dev/null c 1 3; chmod 666 /dev/null
. Pourquoi le déplacement d'un fichier normal vers ce fichier spécial entraîne-t-il la disparition de /dev/null
?
Pour clarifier, c'était à des fins de test, et je comprends comment fonctionne la mv
commande. Ce que je suis curieux de savoir, c'est pourquoi ls -la /dev/null
avant de le remplacer par un fichier normal, la sortie attendue est affichée, mais ensuite cela montre que cela /dev/null
n'existe pas même si un fichier aurait été créé via la mv
commande d' origine et que la commande de fichier affiche du texte ASCII. Je pense que cela doit être une combinaison du ls
comportement de la commande en conjonction avec devfs
quand un fichier non spécial remplace un fichier caractère / spécial. C'est sur Mac OS X, les comportements peuvent varier sur d'autres OS.
/dev/null
.rm
commande.devfs
est drôle avec les fichiers normaux. Étrange, cependant, vous n'avez pas obtenu d'erreurmv
. Que diriez-vous de cette façontouch testfile; mv testfile /dev
:?mv
ne peut être atomique que sur le même système de fichiers.Réponses:
En regardant le code source de mv, http://www.opensource.apple.com/source/file_cmds/file_cmds-220.7/mv/mv.c :
Lors du premier passage dans la boucle while,
open(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
échouera avec EEXIST. Puis/dev/null
sera dissocié et la boucle répétée. Mais comme vous l'avez souligné dans votre commentaire, les fichiers normaux ne peuvent pas être créés/dev
, donc lors du prochain passage dans la boucle, celaopen(to, O_CREAT | O_EXCL | O_TRUNC | O_WRONLY, 0)
échouera toujours.Je déposerais un rapport de bogue avec Apple. Le
mv
code source est pratiquement inchangé par rapport à la version FreeBSD, mais comme le devfs d'OSX a ce comportement non-POSIX avec les fichiers normaux, Apple devrait corriger leurmv
.la source
Le déplacement d'un fichier vers l'emplacement d'un fichier déjà existant remplace le fichier existant. Dans ce cas, le
/dev/null
fichier de périphérique est remplacé, tout comme n'importe quel fichier normal. Pour éviter cela, utilisez l' option-i
(interactive, avertit avant d'écraser) ou-n
(pas de clober) pourmv
./dev/null
ne remplit sa fonction spéciale que comme un ensemble de bits, puis l'appareil est ouvert tel quel. Par exemple, lorsque l'>
opérateur shell est utilisé, le fichier est ouvert puis tronqué (non supprimé et remplacé, ce qui peut être ce que vous attendiez). Comme mentionné par casey, la bonne façon de supprimer un fichier est avecrm
ou même avecunlink
.la source
Umm, parce que vous écrasez le fichier spécial avec un fichier normal? À quoi vous attendiez-vous?
dev/null
n'est pas un répertoire, c'est un fichier pointant vers unnull
périphérique. Lorsque vous avezmv
quelque chose, vous supprimez l'original et le remplacez par ce que vous avez déplacé:la source
/dev/null
, c'est juste devenu le fichier que j'ai déplacé.