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 cat
name__)? 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.
cat
listera le contenu d'un fichier venant après cat
à la sortie standard et le >
l'enverra au fichier messages
et wtmp
où> 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 rm
et faites ensuite un touch messages
, les autorisations peuvent être erronées et si juste après le rm
name__, 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.
En supposant que les commandes aboutissent, /var/log/messages
et /var/log/wtmp
existent toujours, mais sont maintenant blank.
>
est un opérateur de redirection implémenté par le shell. Sa syntaxe est la suivante:
command > file
Ceci redirige command
sortie standard - vers file
.
file
peut également être un nœud de périphérique .file
n'existe pas, il est créé en tant que fichier normal .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
.file
existe déjà en tant que lien symbolique -, la cible du lien est utilisée.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 .)
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./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).
>
.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":
cat
(généralement /bin/cat
), un fichier normal./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.
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.
La redirection à partir de la commande vide (au lieu de cat /dev/null
ou echo -n
) ressemble à ceci:
> messages
> wtmp
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."
>
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.
/ 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.