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]?

Tulains Córdova
la source
courir man watchet faire défiler vers le bas pour des exemples ...
don_crissti

Réponses:

83
watch 'command | othertool | yet-another-tool'
DopeGhoti
la source
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.

Soft Dot IE
la source
à 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 {} \; '
yoyomanYo
la source