2010-06-20 8 views
2

Le script de test suivant a un problème. Lorsque j'ajoute la ligne (sleep 5)& dans le script, la boucle while read ne lit pas toutes les lignes du fichier, mais imprime uniquement la première ligne. Mais lorsque je supprime le (sleep 5)& du script, le script imprime toutes les lignes comme définies dans le fichierlors de la lecture boucle + créer aproccess dans la boucle while

Pourquoi le (sleep 5)& provoque cela?

Et comment résoudre le problème? Je veux créer un nouveau processus (pour lequel le sommeil n'est qu'un exemple) dans la boucle while.

$ more test 

#!/bin/ksh 
while read -r line ; do 
echo $line 
(sleep 5)& 
RESULT=$! 
sleep 1 
kill $RESULT 
done < file 


$ more file 
123 aaa 
234 bbb 
556 ccc 
+0

Quelle version de ksh utilisez-vous? Je ne le vois pas sur ksh93t + comme Gilles l'a mentionné – tomkaith13

Répondre

0

Le code que vous fournissez exécute et imprime chaque ligne du fichier.

Puisque vous n'êtes pas en attente pour le processus enfant

(sleep 5) & 

, elle n'a aucun effet sur l'exécution du processus. Est-ce le code EXACT que vous avez écrit?

0

Cela semble être un bug dans une version spécifique de ksh. Je reçois le même effet de ksh 93s +, mais pas de bash, ash, pdksh, zsh ou ksh 93t +.

0

Ce script KornShell (ksh) fonctionne très bien pour moi avec cette version:

  • echo $KSH_VERSION
    • @(#)MIRBSD KSH R48 2013/08/16

soExample.ksh:

#!/bin/ksh 

#Initialize Variables 
file=file 
fileContent="123\taaa\n234\tbbb\n556\tccc" 

#Function to create File with Input 
#Params: 1}Directory 2}File 
createBlankFileHere(){ 
    echo "Entering createFileHere" 
    > ${1} 
    echo "Exiting createFileHere" 
} 

#Function to create File with Input 
#Params: 1}File 2}String to write to FileName 
createFileWithInputHere(){ 
    echo "Entering createFileWithInputHere" 
    > ${1} 
    #-e means 'enable interpretation of backslash escapes 
    echo -e ${2} >> ${1} 
    #print ${2} >> ${1} 
    echo "Exiting createFileWithInputHere" 
} 

#Function to 
#Params: 1} File 
readLine(){ 
    echo "Entering readLine" 
    while read -r line ; do 
    echo ${line} 
    (sleep 5)& 
    RESULT=${!} 
    sleep 1 
    kill ${RESULT} 
    done < ${1} 
    echo "Exiting readLine" 
} 

#----------- 
#---Main---- 
#----------- 
echo "Starting: ${PWD}/${0} with Input Parameters: {1: ${1} {2: ${2} {3: ${3}" 
createFileWithInputHere ${file} ${fileContent} #function call# 
readLine ${file} #function call# 
echo "Exiting: ${PWD}/${0}" 

soExample.ksh Sortie:

[email protected] /tmp 
$ ksh soExample.ksh 
Starting: /tmp/soExample.ksh with Input Parameters: {1: {2: {3: 
Entering createFileWithInputHere 
Exiting createFileWithInputHere 
Entering readLine 
123 aaa 
234 bbb 
556 ccc 
Exiting readLine 
Exiting: /tmp/soExample.ksh 
Questions connexes