Korn ShellでサブシェルのPIDを取得する方法($ BASHPIDと同じ)

Korn ShellでサブシェルのPIDを取得する方法($ BASHPIDと同じ)

Bashには$ BASHPIDという便利な変数があり、この変数は常に現在実行中のサブシェルのPIDを返します。 kshでサブシェルのPIDを取得するには?たとえば、次のコードを見てください。

#!/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

私が望むのは、****例5329でサブシェルのPIDで始まる行を出力することです。

ベストアンサー1

kshではこれは可能ではないと思います。外部プロセスの実行に関連するPOSIXソリューションがあります。

sh -c 'echo $PPID'

Linuxでもreadlink /proc/self動作しますが、何の利点もありません(少し速くなる可能性があります。BusyBoxのバリアントがありますが、そうでreadlinkない場合は便利ですが、$PPIDそうは思いません)。

シェルから値を取得するには、寿命の短いサブシェルでコマンドを実行しないように注意する必要があります。たとえば、コマンドオーバーライドで呼び出されたサブシェルの出力が表示されることがありますp=$(sh -c 'echo $PPID')(または一部のシェルはこの状況を最適化しない場合があります)。sh代わりに実行

p=$(exec sh -c 'echo $PPID')

おすすめ記事