Почему "pgrep -f bash" испускает два числа вместо одного? - PullRequest
0 голосов
/ 18 ноября 2018

Когда я запускаю этот скрипт в оболочке:

printf "Current bash PID is `pgrep -f bash`\n"

с помощью этой команды:

$ bash script.sh

Я получаюобратно эти выходные данные:

Current bash PID is 5430
24390

Каждый раз, когда я запускаю его, я получаю другое число:

Current bash PID is 5430
24415

Где находится второйлиния, идущая от?

1 Ответ

0 голосов
/ 18 ноября 2018

При использовании обратных галочек (или более современного синтаксиса $(...) для подстановки команд) вы создаете подоболочку. Это fork() независимая копия процесса оболочки, имеющая собственный PID, поэтому pgrep находит две отдельные копии оболочки. (Более того, pgrep может находить копии bash, работающие в системе, совершенно не связанные с текущим сценарием).


Если вы хотите найти PID текущей копии bash, вы можете просто найти его напрямую (printf лучше, чем echo, когда содержимое может содержать обратную косую черту или если поведение echo -n или нестандартное расширение bash echo -e необходимо, но ни одна из этих вещей здесь не подходит, поэтому echo хорошо):

echo "Current bash PID is $$"

Обратите внимание, что даже при выполнении в подоболочке $$ расширяется до PID родительской оболочки. В bash 4.0 или новее вы можете использовать $BASHPID для поиска текущего PID даже в подоболочке.


См. Связанный вопрос Bash - два процесса для одного скрипта

...