pgrep
и подоболочки могут иметь странные взаимодействия, но в этом случае это просто красная сельдь; в фактической причине отсутствуют двойные кавычки вокруг подстановки команд:
$ cat tst2
#!/bin/bash
pgrep tst | wc -l
echo "$(pgrep tst | wc -l)"
echo "$(pgrep tst)" | wc -l
$ ./tst2
1
2
2
В оригинальном сценарии происходит то, что в команде
echo $(pgrep tst) | wc -l
pgrep
печатает два идентификатора процесса (основная оболочка, в которой выполняется сценарий, и подоболочка, созданная для обработки части echo
конвейера). Он печатает каждый в отдельной строке, что-то вроде:
11730
11736
Подстановка команд фиксирует это, но поскольку она не заключена в двойные кавычки, новая строка между ними преобразуется в разрыв аргумента, поэтому все становится эквивалентным:
echo 11730 11736 | wc -l
В результате echo
печатает оба идентификатора в виде одной строки, а wc -l
правильно сообщает об этом.