Que signifie / dev / null dans un script shell? [dupliquer]

35

J'ai commencé à apprendre le script bash en utilisant ce guide: lien

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 cat )? Est-ce seulement 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.

    
posée rishiag 22.08.2014 - 19:18
la source

5 réponses

34

cat listera le contenu d'un fichier après cat à la sortie standard et > l'enverra au fichier messages et wtmp où & gt; signifie d'abord supprimer tous les contenus du fichier et & gt; & gt; signifierait ajouter au fichier actuel. Dans ce cas, vous utilisez & gt; le fichier sera donc vide.

Maintenant, pour le kicker: /dev/null est un périphérique qui n'envoie "rien" aux 2 fichiers derrière le fichier & gt ;.

Il y a une raison de le faire comme ceci: le fichier n'est PAS supprimé du système. Si rm le faisait, puis si touch messages les autorisait peut-être mal et si juste après que quelque chose de rm veuille écrire dans le fichier, il disparaitrait et une erreur se produirait. Selon la façon dont le logiciel est créé, il pourrait tomber en panne.

    
réponse donnée Rinzwind 22.08.2014 - 19:46
la source
44

En supposant que les commandes ont réussi, /var/log/messages et /var/log/wtmp existent toujours mais sont maintenant vide .

Redirection de shell

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

command > file

Ceci redirige les sorties standard de command vers file .

  • file peut également être un noeud de périphérique .
  • Si file n'existe pas, il est créé en tant que fichier régulier .
  • Si file existe déjà sous forme de 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à sous forme de lien symbolique , la cible du lien est utilisée .
  • Si file existe déjà en tant que répertoire, vous obtiendrez une erreur comme bash: file: Is a directory .

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

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

Le périphérique command

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

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

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

command > /dev/null

Vous utilisez null différemment. /dev/null affiche le "contenu" de cat /dev/null , c'est-à-dire que sa sortie est vide. /dev/null (ou > messages ) provoque la redirection de cette sortie vide vers le fichier situé à droite de l'opérateur > wtmp .

Puisque > et messages 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 vides).

Vous pouvez utiliser n'importe quelle commande qui ne fait rien et ne produit aucune sortie, à gauche de wtmp .

Une autre façon de supprimer ces fichiers serait d’exécuter:

echo -n > messages
echo -n > wtmp

L’indicateur > est obligatoire ou -n écrit un caractère newline .

(Cela fonctionne toujours dans echo . Et je pense que la valeur par défaut de bash dans toutes les distributions GNU / Linux et autres systèmes de type Unix couramment utilisés actuellement l'indicateur sh dans son -n intégré, mais jlliagre a raison que echo devrait être évité pour un script shell véritablement portable, car il n'est pas obligé de fonctionner . C'est peut-être pourquoi le guide que vous utilisez enseigne plutôt la méthode echo -n .)

La méthode cat /dev/null est équivalente dans ses effets, mais c'est sans doute une meilleure solution, car elle est plus simple.
echo -n ouvre trois "fichiers":

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

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

Bien que l’on puisse s’attendre à ce que cela améliore les performances, ce n’est pas l’avantage - pas quand on exécute quelques commandes à la main, de toute façon. 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 la réponse de jlliagre ), cela peut être raccourci simplement omettre la commande à gauche de echo 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 Entrée à l'invite vide). En omettant le côté gauche, vous ne faites que rediriger la sortie de cette commande.

  • Notez que cette sortie ne contient pas de nouvelle ligne.Lorsque vous appuyez sur Entrez à l'invite de commande - que vous ayez tapé quelque chose ou non - le shell (exécuté de manière interactive) imprime une nouvelle ligne avant d'exécuter la commande. Cette nouvelle ligne ne fait pas partie de la sortie de la commande.

La redirection depuis la commande vide (au lieu de >> ou cat /dev/null ) ressemble à:

&gt messages
&gt wtmp
    
réponse donnée Eliah Kagan 22.08.2014 - 20:05
la source
11

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 improbable où elles n'existent pas encore.

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

Il n'y en a aucun, donc cat /dev/null est une perte de frappes, de temps et de cycles CPU car il ne produit 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 plus loin et supprimer la commande no-op ' : ':

cd /var/log
> messages
> wtmp
echo "Log files cleaned up."
    
réponse donnée jlliagre 23.08.2014 - 10:47
la source
5

> est un opérateur de redirection de sortie. Il redirigera le résultat de la commande vers le fichier mentionné après celui-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 avoir exécuté cette commande, "demo.txt"  contiendra la commande ls -l de la sortie.

Maintenant, la prochaine chose est ce qui est ce /dev/null . /dev/null est le fichier nul Is est un fichier spécial qui ne contient rien.

Donc, 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).

Ici, vous ne videz pas votre répertoire /var/log , mais vous effacez le contenu de ces deux fichiers.

    
réponse donnée g_p 22.08.2014 - 19:46
la source
0

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

Sinon, ils auraient simplement pu 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 en utilisant "& gt;" ou "/ dev / null" est le moyen efficace.

    
réponse donnée MUTHUKUMAR SUBRAMANIAM 11.09.2016 - 19:40
la source

Lire d'autres questions sur les étiquettes