Разные результаты подстановки команд - PullRequest
0 голосов
/ 08 июля 2019

Почему при добавлении | wc -l результат изменяется следующим образом?

tst:

#!/bin/bash
pgrep tst | wc -l
echo $(pgrep tst | wc -l)
echo $(pgrep tst) | wc -l
$ ./tst
1
2
1

и даже

$ bash -x tst
+ wc -l
+ pgrep tst
0
++ pgrep tst
++ wc -l
+ echo 0
0
++ pgrep tst
+ echo

Ответы [ 2 ]

1 голос
/ 09 июля 2019

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 правильно сообщает об этом.

1 голос
/ 08 июля 2019

Подстановка команды вызывает дополнительный процесс с именем tst, который включен во входные данные для wc -l.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...