Погуглил заранее, поискал сейчас по форуму, пообщался с компетентным товарищем -- не помогло-с.
Есть простая процедура/функция, ищущая среди процессов уже запущенные копии, и считающая их.
Если первой строкой указан интерпретатор, то из переменной возвращается неверное значение, если интерпретатор не указан -- всё нормально.
CHECKPROC()
{
i=`ps ax | grep -c "$0"`
#i=$(ps ax | grep -c $0 ) дает тот же результат
ps ax | grep -c $0
echo variable is $i
}
CHECKPROCK
Нет в первой строчке указания на интерпретатор -- возвращает всё как положено
2
variable is 2
Первой строчкой идёт #!/bin/bash или #!/bin/sh
2
variable is 3
Баш 4.3.11, товарищ запускал на 5.1.16 и 4.4.20.
Куды смотреть, что неправильно делаю?
АП0. Оно не меняет оболочку?
При вписанном #!/bin/sh первой строкой без пробелов запуск echo $SHELL из скрипта возвращает /bin/bash
...меняет, через процессы видно, SHELL -- переменная окружения.
АП1.
В ответ на сообщения valrust об особенностях запуска скрипта с shebang и без него.
Только сейчас догнал, почему греп возвращает сам себя без shebang.
Действительно в списке процессов запускается bash без параметров.
И т.о. логично, что pgrep -c $0 возвращает 0 при любом количестве запущенных процессов, зато количество bash растёт.
Решение задачи "проверить, не работают ли другие копии скрипта" более надежно решаются через lsof -R /path/to/script.sh