@ cularis действительно должен получить кредит за это, так как он разместил его как комментарий (только), прежде чем у меня была возможность опубликовать его как ответ.
Видимо
pgrep bash | wc -l
не создает новый процесс bash;он может напрямую вызывать pgrep bash
и wc -l
из исходного процесса bash.
Но
echo `pgrep bash | wc -l`
создает создание нового процесса bash из-за канала(новый процесс - это самый простой способ управлять всеми перенаправлениями ввода-вывода и управления процессами, необходимыми для |
, вложенных в обратные ссылки).Таким образом, в этом случае pgrep bash
видит только что созданный процесс bash, используемый для обработки канала, в дополнение к исходному (интерактивному /) процессу, используемому для выполнения команды.
Попробуйте
pgrep bash
и
echo `pgrep bash | cat`
В очень быстром взгляде на документацию по bash (info bash
, раздел 3.5.4, Подстановка команд) я не вижу ничего, что говорит, когда он создает новый процесс и когдаэто не так.