Почему выход wc -l отличается, если выполняется в кавычках?

Я только что столкнулся с тем, что вывод wc -l отличается, когда вызывается напрямую или заключен в обратные кавычки. Например:

pgrep bash | wc -l

выдаст 1, так как запущен один процесс bash. Но заключив эту команду в кавычки

echo `pgrep bash | wc -l`

будет выводить 2. Я сначала подумал, обратные ходы откроет новый процесс Bash, но

echo `pgrep bash`

находит только тот же процесс, что и выше. То же самое при заключении команды в $():

echo $(pgrep bash | wc -l)

Это также выведет 2. Кто-нибудь знает, почему это так?

2 ответа

@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, Подстановка команд) Я не вижу ничего, что говорит, когда он создает новый процесс, а когда нет.

Спасибо за помощь ребята. Я на самом деле нашел лучшее решение. Вместо использования wc -l я должен был просто использовать аргумент -c, который выводит только количество совпадающих процессов. Что ж, опять RTFM.;-)

Другие вопросы по тегам