45 votes

Que signifie /dev/null dans un Shell Shell ?

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

Cependant, je suis resté bloqué 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 que les lignes 2 et 3 ne sont pas nécessaires) ? cat ) ? Est-ce seulement pour d'autres distributions Linux ? Après avoir exécuté ce script en tant que root, la sortie que j'obtiens est la suivante Log files cleaned up. Mais /var/log contient encore tous les fichiers.

54voto

Eliah Kagan Points 111731

En supposant que les commandes aient réussi, /var/log/messages y /var/log/wtmp existent toujours mais sont désormais vierge .

Shell Redirection

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

command > file

Cela redirige command 's sortie standard a file .

  • file peut également être un nœud du dispositif .
  • Si file n'existe pas, il est créé en tant que fichier régulier .
  • Si file existe déjà en tant que fichier normal et n'est pas vide, il est écrasé. C'est typiquement le cas dans les commandes que vous avez exécutées, où vous avez redirigé la sortie de cat /dev/null a messages y 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 du type 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 de système de fichiers).

En >> L'opérateur de redirection est similaire, mais il ajoute à la fin des fichiers réguliers non vides au lieu de écrasement leur contenu. (Un autre opérateur de redirection est < . _command_ < _file_ utilise file como command 's entrée standard .)

En null Dispositif

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

  • /dev/null semble vide lorsqu'on le lit.
  • Écrire à /dev/null ne fait rien : les données écrites sur ce périphérique "disparaissent" simplement.

Souvent, la sortie standard d'une commande est réduite au silence en la redirigeant vers /dev/null et c'est peut-être l'élément le plus important. null L'utilisation la plus courante du périphérique dans les scripts Shell :

command > /dev/null

Vous utilisez /dev/null différemment. cat /dev/null produit le "contenu" de /dev/null c'est-à-dire que sa sortie est vierge. > messages (o > wtmp ) fait en sorte que cette sortie vide soit redirigée vers le fichier situé à droite de la balise > de l'opérateur.

Depuis messages y wtmp sont des fichiers ordinaires (et non, par exemple, des nœuds de périphériques), 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 produit aucune sortie, à gauche de > .

Une autre façon d'effacer ces fichiers serait d'exécuter le programme :

echo -n > messages
echo -n > wtmp

En -n est requis, ou echo rédige un nouvelle ligne caractère.

(Cette travaille toujours en bash . Et je croire la valeur par défaut sh dans toutes les distributions GNU/Linux et autres systèmes de type Unix couramment utilisés aujourd'hui prend en charge l'option -n dans son echo builtin. Mais jlliagre a raison que echo -n devrait être évité pour un Shell Shell vraiment portable, car il n'est pas nécessaire de le faire fonctionner. . C'est peut-être pour cela que le guide que vous utilisez enseigne le cat /dev/null ).

En echo -n est équivalente dans ses effets, mais constitue sans doute une meilleure solution, en ce sens qu'elle est plus simple.
cat /dev/null > _file_ ouvre trois "dossiers" :

  • En cat exécutable (généralement /bin/cat ), un fichier ordinaire.
  • En /dev/null dispositif.
  • file

En revanche, echo -n > _file_ s'ouvre uniquement file ( echo est une construction Shell).

Bien que l'on puisse s'attendre à ce que cela améliore les performances, ce n'est pas l'avantage - pas si l'on exécute simplement quelques commandes à la main, en tout cas. L'avantage est qu'il est plus facile de comprendre ce qui se passe.

La redirection et la commande triviale (blanc/vide).

_En tant que jlliagre a souligné_ (voir aussi Réponse de jlliagre ), il est possible de la raccourcir encore en omettant simplement la commande à gauche de > tout à fait. Bien qu'il ne soit pas possible d'omettre le côté droit d'un > o >> la commande vide est valide (c'est la commande que vous exécutez lorsque vous appuyez sur Enter sur une invite vide), et en omettant le côté gauche, vous ne faites que rediriger la sortie de cette commande.

  • Notez que cette sortie ne no contiennent une nouvelle ligne. Lorsque vous appuyez sur Enter à l'invite de commande - que vous ayez ou non tapé quelque chose - le Shell (en mode interactif) imprime une nouvelle ligne avant d'exécuter la commande émise. Cette nouvelle ligne ne fait pas partie de la sortie de la commande.

Redirection à partir de la commande vide (au lieu de la commande cat /dev/null o echo -n ) ressemble à ce qui suit :

> messages
> wtmp

43voto

Rinzwind Points 270388

cat listera le contenu d'un fichier arrivant après cat sur la sortie standard et l'option > l'envoie au fichier messages y wtmp où > signifie qu'il faut d'abord supprimer tout le contenu du fichier et >> signifie qu'il faut ajouter au fichier actuel. Dans ce cas, vous utilisez > pour que le fichier soit vide.

Et maintenant, le coup de pied au cul : /dev/null est un dispositif qui n'envoie "rien" aux deux fichiers qui se trouvent derrière le >.

Il y a une raison à cela : le fichier n'est PAS supprimé du système. Si vous vouliez rm puis faire un touch messages les permissions peuvent être erronées et si juste après le rm Si quelque chose voulait écrire dans le fichier, il n'y aurait plus rien et il y aurait une erreur. En fonction de la manière dont le logiciel est créé, il peut se bloquer.

13voto

pellea72 Points 323

Comme nous l'avons déjà répondu, ces deux lignes compensent le contenu de la /var/log/messages y /var/log/wtmp ou les créent dans le cas improbable où ils n'existeraient pas encore.

Cependant, elles sont basées sur une légende urbaine bien établie qui donne à l'homme le droit d'agir. /dev/null des pouvoirs "paranormaux".

En fait, il n'en a pas, donc cat /dev/null est un gaspillage de touches, de temps et de cycles de l'unité centrale, car il ne produit absolument rien. La réponse d'Eliah Kagan suggère une meilleure approche, qui consiste à utiliser la fonction echo -n au lieu de cela. C'est mieux mais ce n'est pas portable pour certains shells/OS où cela pourrait mettre le ' -n dans ces fichiers.

Vous pouvez aller plus loin et remplacer ces commandes par des commandes portables et plus simples :

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

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

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

6voto

g_p Points 17101

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

par exemple ls -l > demo.txt . Après l'exécution de cette commande, le fichier "demo.txt" contiendra la sortie ls -l commande.

La question suivante est de savoir ce qu'est ce /dev/null . /dev/null est le fichier nul est un fichier spécial qui ne contient rien.

Ainsi, lorsque vous exécutez des commandes

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

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

Vous n'êtes donc pas en train d'éclaircir votre /var/log mais vous effacez le contenu de ces deux fichiers.

1voto

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

Dans le cas contraire, ils auraient pu se contenter d'utiliser.

 > /var/log/messages.

Il existe d'autres façons de vider le contenu d'un fichier.

Comme.

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

Mais l'utilisation de ">" ou de "/dev/null" est la méthode la plus efficace.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X