что я делаю не так?
Оболочка разбирает |
как трубу. Поэтому, когда оболочка видит:
watch ls -a | wc -l
Она анализирует ее как две команды с выходом одной команды, перенаправленным на другую:
( watch ls -a ) | ( wc -l )
Она запускает команду watch
с двумя аргументами ls
и -a
и команда wc
с одним аргументом -l
. Поскольку watch ls -a
никогда не заканчивается, а wc -l
выводится только после завершения ввода, вы ничего не распечатываете. wc -l
ожидает печати всех строк ввода, что никогда не происходит.
Поскольку watch
внутренне вызывает оболочку, вы можете:
watch 'ls -a | wc -l'
При этом запускается одна команда watch
с одним аргументом ls -a | wc -l
. watch
внутренне порождает оболочку и передает ей строку ls -a | wc -l
. Затем эта внутренняя оболочка порождает два новых процесса ls -a
и wc -l
с подключенным входом / выходом.