En bash, vous avez cette variable pratique: $ BASHPID qui retourne toujours le PID du sous-shell en cours d'exécution. Comment puis-je obtenir le PID d'un sous-shell en ksh? Par exemple, voyez le code ci-dessous:
#!/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 $!"
Cela génère les éléments suivants:
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
Ce que je veux, c'est la ligne commençant par ****
sortir le PID du sous-shell, dans le cas de l'exemple qui serait 5329.
la source
$(exec sh -c 'echo $PPID')
Cependant, la commande simple initialesh -c 'echo $PPID'
donne un troisième PID. Merci donc pour la solution. Accepté.(sh -c 'echo $PPID')
pour éviter de créer un sous-shell. Contraste avec(sh -c 'echo $PPID'; true)
. Cette optimisation n'intervient que si vous essayez d'accéder$BASHPID
comme la dernière chose avant la fin du sous-shell, c'est-à-dire uniquement dans les cas où vous ne pouvez rien faire avec la valeur. Donc, en pratique, vous pouvez remplacer$BASHPID
par$(sh -c 'echo $PPID')
.sh -c 'echo $PPID'
.Vous pouvez réaliser ce que vous voulez, mais vous devez mettre run_something dans un script séparé. Je ne sais pas exactement pourquoi, mais $$ n'est pas réévalué lorsqu'il est utilisé dans une fonction du même script qui l'appelle. Je suppose que la valeur de $$ est attribuée une fois après l'analyse du script et avant son exécution.
run_in_background.sh
run_something.sh
production
la source
la source
if [[ ${!KSH_VERSION} = .sh.version ]]; then
(un seul=
) etelif [[ -z ${BASHPID+_} ]]; then
(éviter d'utiliser l'implicite-n
entre crochets doubles, l'ancien pdksh ne le savait pas).Suite à la réponse de @Gilles que j'ai rencontrée tout en résolvant un autre problème que j'avais, j'ai élaboré un programme de test rapide qui sous-tend la théorie selon laquelle la bonne réponse est:
J'ai trouvé qu'il y a des moments où ce
exec
n'est pas nécessaire mais j'ai confirmé que son utilisation est le seul moyen d'obtenir le bon pid tout le temps dans tous les shells que j'ai essayés. Voici mon test:et sa sortie
Remplacez votre coque préférée dans le tralala:
sh
,bash
,mksh
,ksh
, etc ...Je ne comprends pas pourquoi les cas 2 et 3 donnent des résultats différents, ni pourquoi les résultats du cas 3 diffèrent entre les obus. J'ai essayé
bash
,ksh
etmksh
sur Arch Linux FWIW.la source
la source