2017-07-03 2 views
0

J'ai function que wait s pour la donnée pids:Attribution d'une variable l'état de sortie de commande `wait` d'une fonction

waitpid() { 
    wait "[email protected]"; 
} 

je peux wait pour job s ainsi:

sleep 5 & 
spid=$! 
waitpid $spid 
echo $? 
0 

Cela fonctionne. Cependant, je veux saisir l'output du function dans une variable:

sleep 5 & 
spid=$! 
spid_status=$(waitpid $spid) 
echo $? 
255 
[1]+ Done     sleep 5 

Cela ne fonctionne pas, comme $() commence une nouvelle subshell et wait n'est pas en mesure d'attendre des coquillages qui ne sont pas des enfants de son posséder.

Y at-il une solution de contournement à cela? Je voudrais avoir une fonction qui wait s pour subshell s à la fin et return est tout l'état de sortie comme ceci:

waitpids() { 
    local pids_status 
    for pid in "[email protected]"; do 
    wait "$pid"; 
    pids_status+=($?) 
    done 
    echo "$pids_status[@]}" 
} 

Répondre

1

Pour éviter de créer un sous-shell que vous auriez à utiliser une redirection au lieu. Le plus simple est probablement de créer un fichier temporaire pour contenir les données:

trap 'rm -f "$stdout"' EXIT # Optional 
stdout="$(mktemp)" 
waitpid > "$stdout" 
spid_status=$? 
+0

Pouvez-vous expliquer ce que fait la première ligne? Le fichier temporaire "$ stdout" sera-t-il annulé à la fin du travail? – kaligne

+0

Il sera supprimé. C'est utile si tout le traitement de ce fichier se passe dans le même script, et vous ne voulez pas manquer d'espace disque. – l0b0