En essayant de déplacer un répertoire test_dir
vers /dev/null
, je reçois le message
mv: cannot overwrite non-directory ‘/dev/null’ with directory ‘test_dir/’
Alors pourquoi les gens disent-ils "N'exécutez pas la commande Sudo mv ~ /dev/null
, elle déplacera votre répertoire personnel dans un trou?"
Mais /home
est aussi un répertoire.
Parce que les gens assument. J'étais une de ces personnes jusqu'à ce que je teste . Il est facile de comprendre pourquoi les gens supposent ... Cela semble dangereux ...
... mais vous ne pouvez pas réellement déplacer des éléments vers /dev/null
- C'est un fichier spécial qui absorbe uniquement les redirections (et les envoie dans le néant). Si vous essayez de déplacer un répertoire vers celui-ci, le système de fichiers exploserait verbalement sur votre visage et si vous essayez de déplacer un fichier dessus, vous finirez probablement par le remplacer.
Le premier lien traitera des répertoires, mais voici un test séparé juste pour le remplacer par un fichier. Comme Rmano le souligne dans les commentaires, il s’agit probablement d’une chose à ne pas faire sans la surveillance d’un adulte. Il y a un risque impliqué.
$ echo "this is my file" > test
$ cat test
this is my file
$ Sudo mv test /dev/null
$ cat /dev/null
this is my file
# Fix this!
$ Sudo rm /dev/null
$ Sudo mknod -m 0666 /dev/null c 1 3
/dev/null
est juste un fichier, c'est un fichier "caractère spécial" mais ce n'est pas moins lié par les règles que les fichiers doivent suivre. Cela étant dit, vous ne pourrez jamais exécuter cette commande:
$ mv ~ /dev/null
La commande mv
n'autorisera pas cela car vous déplacez un répertoire dans un fichier, cela n'a pas de sens contextuellement et mv
le sait.
$ mkdir dir
$ touch afile
$ mv dir afile
mv: cannot overwrite non-directory ‘afile’ with directory ‘dir’
Vous ne pouvez pas copier non plus sur /dev/null
, étant donné qu'il s'agit d'un fichier de caractères, si vous essayez de copier un fichier normal dessus.
$ cp ~/bzip2_1.0.6-4_AMD64.deb /dev/null
$ ls -l |grep null
crw-rw-rw- 1 root root 1, 3 Mar 16 14:25 null
La seule chose que vous puissiez faire avec ce fichier est de copier mv
dans un autre fichier ou de le supprimer.
$ mv /path/to/afile /dev/null
Après cette commande, /dev/null
est un fichier normal. L'effet le plus dangereux de ce changement est que /dev/null
est supposé jamais générer toutes les données. Par conséquent, un certain nombre de scripts Shell suppose que
`... < /dev/null`
est équivalent à dire "rien". Si cette hypothèse est brisée, des données aléatoires peuvent être insérées (ainsi, les données écrites par le dernier processus dans `/ dev/null ') insérées dans des fichiers système répartis dans tout le système, ce qui pourrait conduire à un système totalement inutilisable et irrécupérable.
Vous pouvez écrire des fichiers ou d’autres flux d’entrée dans /dev/null
, mais pas dans des répertoires. Si vous essayez de déplacer un répertoire vers /dev/null
, une erreur sera signalée car /dev/null
n'est pas un répertoire mais un fichier.
Toutefois, puisque vous souhaitez expérimenter avec /dev/null
, vous devez d’abord connaître les conséquences du déplacement d’un fichier pour écraser /dev/null
et savoir comment remédier à cette situation:
Comme suggéré par @ Rmano dans cette réponse à cette question, afin d'expérimenter avec /dev/null
, nous devrions plutôt en créer une copie puis faire notre expérimentation. Créons donc /tmp/null
et utilisons-le à des fins d'expérimentation:
Sudo mknod -m 0666 /tmp/null c 1 3
Désormais, /tmp/null
est notre /dev/null
à toutes fins utiles:
Créons un test_file
et un test_dir
dans un répertoire appelé ask_ubuntu
.
$ mkdir ask_ubuntu
$ cd ask_ubuntu
$ touch test_file
$ mkdir test_dir
$ echo "Let us test if we can recover our test_file." > test_file
Ce qui suit montre le contenu du répertoire ask_ubuntu
:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:10 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
-rw-r--r-- 1 aditya aditya 0 Mar 18 17:10 test_file
Maintenant, essayez de déplacer notre test_file
dans /tmp/null
et de voir le contenu de ask_ubuntu
:
$ Sudo mv test_file /tmp/null # This succeeds
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
La commande réussit et test_file
n'est plus disponible. Maintenant, essayez de déplacer test_dir
vers /tmp/null
qui ne réussit pas:
$ Sudo mv test_dir/ /tmp/null
mv: cannot overwrite non-directory ‘/tmp/null’ with directory ‘test_dir/’
test_dir
est toujours présent dans ask_ubuntu
:
$ ls -la
total 12
drwxr-xr-x 3 aditya aditya 4096 Mar 18 17:12 .
drwxr-xr-x 4 aditya aditya 4096 Mar 18 17:10 ..
drwxr-xr-x 2 aditya aditya 4096 Mar 18 17:10 test_dir
Voyons maintenant si nous pouvons récupérer notre test_file
à partir de /tmp/null
:
$ cat /tmp/null
Let us test if we can recover our test_file.
Donc, il est toujours là et /tmp/null
qui était un fichier spécial a été écrasé et il est devenu comme tout autre fichier normal. Nous pouvons récupérer notre fichier en copiant /tmp/null
comme n'importe quel autre fichier:
$ cp /tmp/null our_test_file
$ cat our_test_file
Let us test if we can recover our test_file.
Fichier récupéré.
Si vous n'avez pas créé /tmp/null
et essayé ces commandes directement à l'aide de /dev/null
; assurez-vous de récupérer le fichier (si vous en avez besoin) en exécutant cp /dev/null our_test_file
; et restaurez /dev/null
aux fins pour lesquelles il existe sur notre système en lançant les commandes suivantes comme indiqué dans la question liée dès que possible:
$ Sudo rm /dev/null
$ Sudo mknod /dev/null c 1 3
$ Sudo chmod 666 /dev/null
Donc, il est impossible de déplacer un répertoire vers /dev/null
et il n’est donc pas question de récupérer le répertoire à partir de là.
En ce qui concerne les fichiers, si vous déplacez directement les fichiers vers /dev/null
, vous pouvez toujours les récupérer comme indiqué ci-dessus. Cependant, il y a deux exceptions:
Pendant la période où vous exécutez Sudo mv test_file /dev/null
et cp /dev/null our_test_file
, si un script racine du système l’écrase en exécutant echo "Whatever text the root script wants to send to /dev/null" > /dev/null
(ou d’autres commandes similaires). Ensuite, nous n'avons pas de moyen facile de récupérer notre fichier.
Si vous redémarrez le système entre l'exécution de ces deux commandes. /dev/null
est recréé au démarrage, ainsi notre fichier est perdu lorsque nous éteignons l'ordinateur.
Mais si vous souhaitez récupérer des flux d'entrée tels que echo "Stream this line to /dev/null" > /dev/null
, vous ne pouvez pas récupérer ce fichier, car /dev/null
est un fichier spécial permettant de supprimer les fichiers et flux d'entrée non sollicités et, comme le mentionne l'article de Wikipedia, il ne fournit aucune donnée à un processus qui le lit. .
Référence: Article Wikipedia sur /dev/null
Tout ce qui est envoyé à /dev/null
est éliminé en silence. Si vous tapez:
echo "Hello World"
vous obtenez Hello World
à l'écran. Si vous tapez:
echo "Hello World" >/dev/null
vous n'obtenez rien à l'écran.
Mais dans le cas de la commande move, la commande mv
tente de remplacer le fichier/dev/null par le répertoire, ce qui n’est pas possible. Comme tout est un fichier sous Linux,/dev/null est un fichier. Un fichier spécial bien sûr (un fichier de périphérique), un fichier spécial permettant d’accéder à du matériel (comme des disques, des partitions, des cartes son, des ports série, ...). Dans le cas de/dev/null, celui-ci n'est lié à aucun matériel, les données qui lui sont envoyées sont donc ignorées. C'est pourquoi "ils" ont peut-être appelé cela un trou noir.