J'ai lu le article de Wikipedia sur /dev/null
et je jouais en déplaçant des fichiers vers /dev/null
.
Pour cela, j'ai créé un test_file
et y ai ajouté du contenu:
$ touch test_file
$ echo "This is written by Aditya" > test_file
$ cat test_file
This is written by Aditya
Ensuite, j'ai essayé de déplacer le fichier vers /dev/null
:
$ mv test_file /dev/null
mv: inter-device move failed: ‘test_file’ to ‘/dev/null’; unable to remove target: Permission denied
Depuis, cela m'a donné une Permission denied
Error; Je suis allé de l'avant et utilisé Sudo
comme je le fais normalement chaque fois que je rencontre une erreur Permission denied
.
$ Sudo mv test_file /dev/null
La commande a réussi et test_file
n'est plus présent dans le répertoire.
Cependant, l'article de Wikipedia indique qu'il n'est pas possible de récupérer quoi que ce soit déplacé vers /dev/null
et donne un EOF
à tout processus qui tente de le lire. Mais je peux lire à partir de /dev/null
:
$ cat /dev/null
This is written by Aditya
Qu'est-ce que j'ai mal fait et comment corriger /dev/null
de nouveau à la normale? Et pourquoi ai-je rencontré l'erreur Permission denied
en premier lieu?
/dev/null
est un fichier. Un fichier spécial. Un fichier de périphérique tel que/dev/sda ou/dev/tty qui communique avec un élément matériel de votre système.
La seule différence avec /dev/null
est qu'aucun matériel n'y est associé. Toutes les données que vous lui envoyez sont éliminées en silence. Comme la commande suivante:
echo "Hello World" > /dev/null
ce qui n'imprimera rien sur votre terminal car vous envoyez la sortie de echo
à null, au vide, un trou noir donc.
Mais lorsque vous avez utilisé mv test_file /dev/null
, vous avez remplacé le fichier spécial /dev/null
par un fichier texte normal contenant une copie du contenu de votre test_file
. En d'autres termes, vous avez perdu votre /dev/null
.
Maintenant, ce que vous devez faire est (pour le reconstruire):
Sudo rm /dev/null
Sudo mknod -m 0666 /dev/null c 1 3
Vous devriez le reconstruire car beaucoup de scripts envoient par défaut la sortie à /dev/null
. Si /dev/null
n'est plus un trou noir mais un fichier texte standard, il peut grossir, grossir et remplir votre système de fichiers. Et je suis sûr que vous voulez éviter cela.
Et beaucoup plus dangereux, beaucoup de scripts supposent que lire dans /dev/null
ne lira rien; briser cette hypothèse peut entraîner des ordures aléatoires écrites dans des fichiers tout autour de votre système ... pratiquement impossible à corriger.
Et rappelez-vous que Linux est multi-tâches: pendant que vous jouez avec /dev/null
, de nombreux processus sont en cours d'exécution et peuvent causer des ravages même pendant une "fenêtre d'opportunité" de quelques secondes.
Si vous voulez jouer avec /dev/null
, vous pouvez en créer une copie et l’essayer:
Sudo mknod -m 0666 /tmp/null c 1 3
Crée un fichier /tmp/null
qui fonctionne exactement de la même manière que /dev/null
mais que vous pouvez manipuler et tester sans aucun risque pour votre système.
Il y a une grande différence entre écraser un fichier et écrire dans un fichier.
Lorsque vous écrivez quelque chose dans /dev/null
, par exemple,
$ echo Hello > /dev/null
... il est jeté silencieusement. Pour cela, vous devez disposer d'autorisations d'écriture sur /dev/null
, dont tout le monde dispose:
$ ls -l /dev/null
crw-rw-rw- 1 root root 1, 3 Mar 18 13:17 /dev/null
Lorsque vous écrasez /dev/null
, comme vous l'avez fait avec la commande mv
, vous remplacez le fichier spécial /dev/null
par tout ce que vous y avez déplacé. Ne faites pas cela! La raison pour laquelle vous aviez besoin de privilèges root pour le faire est que, pour écraser un fichier, vous avez besoin d'autorisations en écriture dans le répertoire contenant le fichier , dans ce cas /dev
:
$ ls -ld /dev
drwxr-xr-x 16 root root 4640 Mar 18 13:17 /dev
Pour restaurer /dev/null
, lancez les commandes
$ Sudo rm /dev/null
$ Sudo mknod -m 0666 /dev/null c 1 3
(Voir aussi & L StackExchange: Comment créer /dev/null
)
Lorsque vous exécutez la commande
$ Sudo mv test_file /dev/null
vous avez remplacé le fichier spécial /dev/null
avec votre fichier texte. Les tentatives ultérieures de lecture à partir de /dev/null
renvoient le contenu de votre fichier texte et les programmes qui tentent d’utiliser /dev/null
de manière normale s’arrêteront probablement.
Le remplacement ou la suppression de fichiers de périphérique dans /dev/
requiert des privilèges de superutilisateur. C'est pourquoi votre tentative non-Sudo a échoué avec une erreur.
Voir la réponse de Benoit pour des informations sur la façon de restaurer /dev/null
manuellement, mais étant donné que la plupart (sinon la totalité) du contenu de /dev/
est géré de manière dynamique par udev, je suspecte qu'un simple redémarrage le résoudra probablement aussi.
Pour répondre à votre question sur ce que vous auriez dû faire, pour supprimer un fichier, vous procédez comme suit:
rm test_file
Comme d'autres l'ont déjà indiqué,/dev/null est une destination pour la sortie des programmes.