Jak korzystać z polecenia watch z potokowym łańcuchem poleceń / programów


51

Zwykle użytkownik watchlinuksa narzędzie do powtarzania wyjścia polecenia co n sekund, jak wwatch df -h /some_volume/

Ale wydaje mi się, że nie jestem w stanie korzystać watchz szeregu poleceń takich jak:

$ watch ls -ltr|tail -n 1

Jeśli to zrobię, watchto naprawdę oglądam ls -ltri przekazuję wyjście, do tail -n 1którego nic nie wyprowadza.

Jeśli spróbuję:

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

dostaję

$ watch: syntax error near unexpected token `ls'

I którykolwiek z poniższych przypadków zawodzi z jakiegoś powodu:

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

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

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

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

I na koniec, jeśli to zrobisz:

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

Nie widzę żadnych zmian w danych wyjściowych w danym przedziale czasu, ponieważ polecenie wewnątrz $()jest uruchamiane tylko raz, a wynikowy ciąg wyjściowy jest zawsze drukowany („oglądany”) jako literał.

Jak więc sprawić, by watchpolecenie działało z szeregiem poleceń [innym niż umieszczanie ich w skrypcie]?


biegnij man watchi przewiń w dół do przykładów ...
don_crissti 25.10.16

Odpowiedzi:


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

1
Warto zwrócić uwagę na ogólne podejście, a watch sh -c 'command | etc'zwłaszcza na podejście wypróbowane w pytaniu.
sourcejedi

@sourcejedi Naprawdę nie wiem, dlaczego, ale to nie zawsze daje takie same wyniki.
Michael Mior


2

Jeśli chcesz również wyświetlić listę wszystkich plików w podkatalogach, możesz użyć polecenia find z opcją exec.

watchbędzie aktualizować co 30 sekund i findbędzie wyszukiwać wszystkie pliki * .log w bieżącym katalogu (łącznie z podkatalogami) i drukuje nazwy plików oraz ich ostatnie 10 wierszy:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.