В bash у вас есть эта удобная переменная: $ BASHPID, которая всегда возвращает PID запущенной в данный момент подоболочки. Как я могу получить PID подоболочки в ksh? Например, см. Код ниже:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Это выводит следующее:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329
То, что я хочу, это строка, начинающаяся с ****
вывода PID подоболочки, в случае примера это будет 5329.
источник
$(exec sh -c 'echo $PPID')
однако первоначальная простая командаsh -c 'echo $PPID'
дает третий PID. Так что спасибо за решение. Принятый.(sh -c 'echo $PPID')
чтобы избежать создания подоболочки. Контраст с(sh -c 'echo $PPID'; true)
. Эта оптимизация срабатывает только в том случае, если вы пытаетесь получить доступ$BASHPID
в качестве самой последней вещи перед выходом подоболочки, то есть только в тех случаях, когда вы ничего не можете сделать со значением. Таким образом, на практике вы можете заменить$BASHPID
на$(sh -c 'echo $PPID')
.sh -c 'echo $PPID'
.Вы можете достичь того, чего хотите, но вам нужно поместить run_something в отдельный скрипт. Я не совсем уверен, почему, но $$ не переоценивается, когда он используется в функции в том же скрипте, который его вызывает. Я предполагаю, что значение $$ назначается один раз после синтаксического анализа скрипта и перед его выполнением.
run_in_background.sh
run_something.sh
вывод
источник
источник
if [[ ${!KSH_VERSION} = .sh.version ]]; then
(только один=
) иelif [[ -z ${BASHPID+_} ]]; then
(избегайте использования неявных-n
в двойных квадратных скобках, старый pdksh не знал этого).После ответа @Gilles, с которым я столкнулся при решении другой проблемы, с которой я столкнулся, я собрал программу быстрого тестирования, которая подкрепляет теорию о том, что правильный ответ:
Я обнаружил, что бывают случаи, когда
exec
это не требуется, но я подтвердил, что это единственный способ получить правильный pid все время во всех оболочках, которые я пробовал. Вот мой тест:и его вывод
Подставьте ваш любимый снаряд в притоне:
sh
,bash
,mksh
,ksh
и т.д. ...Я не понимаю, почему случаи 2 и 3 дают разные результаты, и почему результаты для случая 3 отличаются между оболочками. Я попробовал
bash
,ksh
иmksh
на Arch Linux FWIW.источник
источник