web-dev-qa-db-fra.com

Que signifie / dev / null dans un script shell?

J'ai commencé à apprendre le script bash en utilisant ce guide: http://www.tldp.org/LDP/abs/abs-guide.pdf

Cependant, je me suis retrouvé coincé au premier script:

cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Log files cleaned up."

Que font les lignes 2 et 3 dans Ubuntu (je comprends catname__)? Est-ce uniquement pour les autres distributions Linux? Après avoir exécuté ce script en tant que root, le résultat obtenu est Log files cleaned up. Mais /var/log contient toujours tous les fichiers.

38
rishiag

catlistera le contenu d'un fichier venant après catà la sortie standard et le > l'enverra au fichier messageset wtmpoù> signifie d'abord supprimer tout le contenu du fichier et >> signifiera ADD au fichier en cours. Dans ce cas, vous utilisez> pour que le fichier finisse par être vide.

Maintenant pour le kicker: /dev/null est un appareil qui envoie "rien" aux 2 fichiers derrière le>.

Il y a une raison de le faire comme ceci: le fichier n'est PAS supprimé du système. Si vous utilisez rmet faites ensuite un touch messages, les autorisations peuvent être erronées et si juste après le rmname__, quelque chose voudrait écrire dans le fichier, il disparaîtrait et la sortie disparaîtrait. Selon la manière dont le logiciel est créé, il peut se bloquer.

37
Rinzwind

En supposant que les commandes aboutissent, /var/log/messages et /var/log/wtmp existent toujours, mais sont maintenant blank.

Redirection de shell

> est un opérateur de redirection implémenté par le shell. Sa syntaxe est la suivante:

command > file

Ceci redirige commandsortie standard - vers file.

  • file peut également être un nœud de périphérique .
  • Si file n'existe pas, il est créé en tant que fichier normal .
  • Si file existe déjà en tant que fichier normal et n'est pas vide, il est écrasé. C'est généralement le cas dans les commandes que vous avez exécutées, où vous avez redirigé la sortie de cat /dev/null vers messages et wtmp.
  • Si file existe déjà en tant que lien symbolique -, la cible du lien est utilisée.
  • Si file existe déjà en tant que répertoire, vous obtiendrez une erreur telle que bash: file: Is a directory.

(Bien entendu, ces opérations peuvent échouer pour d'autres raisons, telles que l'absence de autorisations ou une erreur du système de fichiers.)

L'opérateur de redirection >> est similaire, mais ajoute à la fin des fichiers normaux non vides au lieu de écraser leur contenu. (Un autre opérateur de redirection est <. command < file utilise file comme command's entrée standard .)

Le périphérique null

/dev/null est un périphérique simple (implémenté dans le logiciel et ne correspondant à aucun périphérique matériel du système).

  • /dev/null semble vide lorsque vous le lisez.
  • L'écriture sur /dev/null ne fait rien: les données écrites sur ce périphérique "disparaissent".

Souvent, la sortie standard d'une commande est désactivée en la redirigeant vers /dev/null, ce qui est peut-être l'utilisation la plus courante du périphérique null dans les scripts Shell:

command > /dev/null

Vous utilisez /dev/null différemment. cat /dev/null renvoie le "contenu" de /dev/null, ce qui signifie que sa sortie est vide. > messages (ou > wtmp) fait que cette sortie vierge est redirigée vers le fichier situé à droite de l'opérateur >.

Puisque messages et wtmp sont des fichiers normaux (plutôt que, par exemple, des nœuds de périphérique), ils sont transformés en fichiers vierges (c'est-à-dire, vidés).

Vous pouvez utiliser n’importe quelle commande qui ne fait rien et ne génère aucun résultat, à gauche de >.

Une autre façon d'effacer ces fichiers serait de lancer:

echo -n > messages
echo -n > wtmp

L'indicateur -n est requis ou echo écrit un caractère nouvelle ligne .

(Ceci fonctionne toujours dans bash. Et je crois que la valeur par défaut sh dans chaque distribution GNU/Linux et les autres systèmes de type Unix couramment utilisés prend en charge le drapeau -n dans sa version intégrée echo. Mais jlliagre est right que echo -n devrait être évité pour un script Shell vraiment portable, car il n’est pas nécessaire de travailler . Peut-être que c’est pourquoi le guide que vous utilisez enseigne la méthode cat /dev/null à la place.)

La méthode echo -n a des effets équivalents, mais constitue sans doute une meilleure solution, car elle est plus simple.
cat /dev/null > file ouvre trois "fichiers":

  • L’exécutable cat (généralement /bin/cat), un fichier normal.
  • Le périphérique /dev/null.
  • file

En revanche, echo -n > file n’ouvre que file (echo est un environnement intégré au shell).

Quoiqu'il en soit, cela devrait améliorer les performances, mais ce n'est pas l'avantage - pas lorsque vous exécutez simplement quelques commandes à la main. Au lieu de cela, l'avantage est qu'il est plus facile de comprendre ce qui se passe.

Redirection et la commande trivial (vide/vide).

Comme jlliagre a souligné (voir aussi réponse de jlliagre ), ceci peut être abrégé davantage en omettant simplement la commande à gauche de > tout à fait. Bien que vous ne puissiez pas omettre le côté droit d'une expression > ou >>, la commande vide est valide (c'est la commande que vous exécutez lorsque vous appuyez simplement sur Enter sur une invite vide), et en omettant le côté gauche, vous redirigez simplement la sortie de cette commande.

  • Notez que cette sortie pas contient une nouvelle ligne. Quand vous appuyez sur Enter sur une invite de commande - que vous ayez ou non tapé quelque chose - le Shell (s'exécutant de manière interactive) imprime une nouvelle ligne avant d'exécuter la commande émise. Cette nouvelle ligne ne fait pas partie de la sortie de la commande.

La redirection à partir de la commande vide (au lieu de cat /dev/null ou echo -n) ressemble à ceci:

> messages
> wtmp
49
Eliah Kagan

Comme déjà répondu, ces deux lignes effacent le contenu des fichiers /var/log/messages et /var/log/wtmp ou les créent dans le cas peu probable où ils n'existeraient pas.

Cependant, ils sont basés sur une légende urbaine bien établie qui donne à /dev/null des pouvoirs "paranormaux".

En fait, il n'en a aucun, donc cat /dev/null est une perte de frappe au clavier, de temps et de cycles de la CPU car il ne génère absolument rien. La réponse d'Eliah Kagan suggère la meilleure approche qui utilise plutôt echo -n. C'est mieux mais pas portable pour certains shells/OS où il pourrait mettre la chaîne '-n' dans ces fichiers.

Vous pouvez aller plus loin et remplacer ces commandes par le portable et le plus simple:

cd /var/log
: > messages
: > wtmp
echo "Log files cleaned up."

Avec la plupart des shells (mais pas ceux basés sur csh), vous pouvez aller encore plus loin et supprimer la commande no-op ':':

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
12
jlliagre

> est l'opérateur de redirection en sortie. Il redirigera la sortie de la commande vers le fichier mentionné après celle-ci au lieu du périphérique de sortie standard, tronquant ou écrasant le contenu du fichier.

par exemple ls -l > demo.txt. Après avoir exécuté cette commande, "demo.txt" contiendra la commande ls -l en sortie.

La chose suivante est alors: /dev/null./dev/null est le fichier null Is est un fichier spécial qui ne contient rien.

Alors, quand vous exécutez des commandes

cat /dev/null > messages
cat /dev/null > wtmp

il efface le contenu des fichiers "messages" et "wtmp" en écrasant le caractère EOF (End Of File).

Donc, ici, vous n'effacez pas votre répertoire /var/log, mais vous effacez le contenu de ces deux fichiers.

5
g_p

/ dev/null est comme un trou noir. Les écritures effectuées dans/dev/null sont ignorées. Dans ce script, ils utilisent/dev/null pour vider le fichier journal des messages.

Sinon, ils auraient pu simplement utiliser.

 > /var/log/messages.

Il existe d'autres moyens de vider le contenu d'un fichier.

Comme.

     truncate  -s  0  /var/log/messages
     cp  /dev/null  /var/log/messages

Mais utiliser ">" ou "/ dev/null" est un moyen efficace.

0