Comment créer un nouveau processus d'arrière-plan dans une boucle KSH «en lecture»?

0

Le script de test suivant a un problème. Quand j'ajoute la ligne (sleep 5 ) & dans le script, la boucle "While read" ne lit pas toutes les lignes du fichier, mais affiche uniquement la première ligne.

Mais quand je retire le ( sleep 5 ) & à partir du script, le script imprime toutes les lignes telles que définies dans le fichier.

Pourquoi le ( sleep 5 ) & provoque cela?

Et comment résoudre le problème? Je veux créer un nouveau processus (pour lequel le sleep est juste un exemple) dans la boucle while:

$ more test 
#!/bin/ksh  
while read -r line ; do
    echo Read a line:
    echo $line

    ( sleep 5 )&
    RESULT=$!
    echo Started background sleep with process id $RESULT

    sleep 1
    echo Slept for a second

    kill $RESULT 
    echo Killed background sleep with process id $RESULT
done < file
echo Completed 

Sous Linux, lors de l’utilisation du contenu suivant de file:

$ more file 
123 aaa 
234 bbb 
556 ccc

...fonctionnement ./test me donne juste:

Read a line:
123 aaa
Started background sleep with process id 4181
Slept for a second 
Killed background sleep with process id 4181
Completed
yael
la source
2
Vous avez été invité plusieurs fois à formater correctement vos messages. Utilisez le 101010 bouton ou indenter chaque ligne de code quatre espaces, s'il vous plaît. En outre, vous devez marquer certaines réponses comme acceptées.
Dennis Williamson
2
Cela fonctionne très bien pour moi.
Dennis Williamson
3
Je viens d'annuler Yael, n'annule pas les éditions faites par d'autres personnes si cela améliore le formatage. C'est considéré comme impoli, obstiné et enfantin. Si vous n'aimez pas les personnes qui modifient vos messages, ce site peut ne pas vous intéresser.
BloodPhilia
1
Est-ce que le tiens ? Vous ne nous donnez pas cette information ... :-( (Comme je l'ai écrit: j'ai testé sur un Mac, qui intègre également KSH.)
Arjan
1
J'ai démarré une machine Ubuntu 9.10, mais KSH n'est pas installé sur cette machine. Utiliser le shell Bash par défaut ne me pose aucun problème non plus sur cette machine Ubuntu. Impair.
Arjan

Réponses:

1

Dans le changelog Ksh pour ksh93s:

06-10-23 Un bug dans lequel la valeur de $! a été affecté par un travail en arrière-plan démarré depuis un sous-shell a été corrigé.

Si votre version de ksh est plus ancienne que celle-ci (vous devriez mentionner la version dans votre question!), Vous êtes peut-être en train d'observer ce bogue.

Gilles
la source