Почему выход 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.;-)