результат подстановки команды bash не согласован

#bash

#bash

Вопрос:

У меня есть скрипт.

cat /root/test/ddd.sh

 #!/bin/bash
s=/root/test/ddd.sh
ps -ef | grep $s | grep -v grep
result=$(ps -ef | grep $s | grep -v grep | wc -l)
echo $result
  

когда я ее выполняю, результат странный, он показывает, что совпадают две строки.

 [root@l2 test]# /root/test/ddd.sh
root     15361 15032  0 09:52 pts/18   00:00:00 /bin/bash         /root/test/ddd.sh
2
  

Ответ №1:

Это потому, что вы используете подоболочку. То есть $(...) фрагмент вызывает bash fork , тем самым создавая два (почти) идентичных процесса. Под идентичным я подразумеваю в основном все, кроме идентификатора процесса, идентификатора родительского процесса, кода возврата из fork , и я не могу придумать ничего другого. Но одна вещь, которая точно остается неизменной, — это командная строка. Оба они будут « /bin/bash /root/test/ddd.sh «. Итак, внутри result=$(...) будет ровно один дополнительный процесс, который соответствует.

Вы можете убедиться в этом, например, удалив | wc -l фрагмент в конце вашего $(...) и, чтобы сделать его более читаемым, заключите аргумент echo в кавычки:

 result="$(ps -ef | grep $s | grep -v grep)"
echo "$result"
  

Здесь вы увидите, что есть два bash, и PPID одного является PID другого, показывая связь родитель-потомок.