Почему wc получает неправильный результат с выходом из ps

Чтобы вывести все строки в файл /tmp/ps.txt

 $ ps -e >/tmp/ps.txt 

Считать это с помощью wc -l

 $ wc -l /tmp/ps.txt 172 

Считать это без экспорта файла.

 $ ps -e | wc -l 173 

Почему ps -e | wc -l ps -e | wc -l получить еще одну строку?

Я не думаю, что ctrl-d имеет правильное объяснение для моего вопроса.

 $ echo "test" | wc -l 1 

Пожалуйста, попробуйте в своем терминале, это даст 2, как сказал бы ctrl-d .

Ответ ctrl-d правильный.

Вы, кажется, не поняли, для чего предназначена команда ps . Он перечисляет процессы в вашей системе.

Когда вы запускаете команду ps , этот исполняемый экземпляр сам по себе является процессом.

Когда вы запускаете команду wc , это также процесс.

Если вы вставляете некоторые cat команды в конвейер, каждый из них также является процессом, и каждый из них заставит ps выводить еще одну строку информации:

 [vagrant@localhost ~]$ ps | wc -l 4 [vagrant@localhost ~]$ ps | cat | wc -l 5 [vagrant@localhost ~]$ ps | cat | cat | wc -l 6 [vagrant@localhost ~]$ ps | wc -l 4 [vagrant@localhost ~]$ ps PID TTY TIME CMD 22912 pts/0 00:00:00 bash 29651 pts/0 00:00:00 ps [vagrant@localhost ~]$ 

Тот факт, что echo "test" | wc -l echo "test" | wc -l показывает «1» совершенно не имеет значения.

Дополнительная строка – это программа wc, которая работает. Он выполняется одновременно с ps, а не после этого.