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

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

pgrep bash | wc -l

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

echo `pgrep bash | wc -l`

, то получится 2. Сначала я подумал, что backticks откроет новый процесс bash, но

echo `pgrep bash`

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

echo $(pgrep bash | wc -l)

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

Ответы [ 2 ]

1 голос
/ 24 августа 2011

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

0 голосов
/ 24 августа 2011

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

...