Comment utiliser la commande watch avec une chaîne de commandes / programmes diffusée


52

J'utilise habituellement l' watchutilitaire linux pour regarder la sortie d'une commande plusieurs fois toutes les n secondes, comme danswatch df -h /some_volume/

Mais il semble que je ne sois pas capable d’utiliser watchune série de commandes comme:

$ watch ls -ltr|tail -n 1

Si je le fais, watchregarde vraiment ls -ltret la sortie est passée à tail -n 1qui ne sort rien.

Si j'essaye ceci:

$ watch (ls -ltr|tail -n 1)

Je reçois

$ watch: syntax error near unexpected token `ls'

Et l’un des problèmes suivants échoue pour une raison ou une autre:

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

Et enfin si fais ceci:

$ watch echo $(ls -ltr|tail -n 1)

Je ne vois aucun changement dans la sortie à l'intervalle donné, car la commande à l'intérieur $()est exécutée une seule fois et la chaîne de sortie résultante est toujours imprimée ("surveillée") en tant que littéral.

Alors, comment puis-je faire en sorte que la watchcommande fonctionne avec une chaîne de commandes canalisée [autre que de les insérer dans un script]?


courir man watchet faire défiler vers le bas pour des exemples ...
don_crissti

Réponses:


83
watch 'command | othertool | yet-another-tool'

1
Il serait peut-être intéressant de noter également l’approche générique, watch sh -c 'command | etc'notamment en ce qui concerne les approches testées dans la question.
sourcejedi

@ sourcejedi Je n'ai pas vraiment compris pourquoi, mais cela ne produira pas toujours les mêmes résultats.
Michael Mior

12
watch -n 1 "ls -lrt | tail -n20; date"

laissez-vous pipe et courir dans une rangée.


à quoi ça sert -n 1?
Nam G VU

2
@NamGVU: Lancer la commande toutes les 1 secondes
Duc Tran

2

Si vous souhaitez également répertorier tous les fichiers dans des sous-répertoires, vous pouvez utiliser la commande find avec l'option exec.

watchse mettra à jour toutes les 30 secondes et findrecherchera tous les fichiers * .log dans le répertoire courant (sous-répertoires inclus) et imprimera les noms de fichiers et leurs 10 dernières lignes:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.