En utilisant une boucle while pour lire un fichier, arrête de lire le fichier au hasard au milieu [fermé]


1

J'ai une petite section de code qui lit un fichier, $ FUNCTION_FILE, qui contient une liste de noms de fonctions au format:

func1
func2
func3

Il lira une ligne, exécutera la fonction et répétera jusqu'à ce que le fichier soit terminé. Voici un extrait:

while read line; do
    LINE_NUMBER=`expr $LINE_NUMBER + 1`
    echo "LINE_NUMBER=$LINE_NUMBER"

    $func
done <$FUNCTION_FILE

Je me suis trouvé dans une situation où parfois cette section de code cesse de lire "$ FUNCTION_FILE" avant de terminer et continue avec le reste du script. Parfois, il ne lit que la première ligne et ignore le reste, parfois, la deuxième ligne seulement; Je ne vois jamais le message "LINE_NUMBER = $ LINE_NUMBER" pour les lignes suivantes.

En supposant que le fichier soit correct, quelles sont les causes possibles du problème que je vois?


Est-ce qu'une ligne contient exit?
Choroba

Vous nous demandez de déboguer du code arbitraire que nous ne pouvons pas voir? Tout peut arriver, cela dépend de ce qu’ils $funcsont. S'il vous plaît nous montrer les fonctions réelles que vous exécutez, il n'y a aucun moyen que nous pouvons aider autrement.
Terdon

Désolé d'être si cryptique. Je ne suis pas en mesure de divulguer le code réel, je cherche surtout à rassembler des informations sur les moyens utilisés par un script pour manipuler le stdin (comme le suggère la première réponse). Merci pour votre temps, je l'apprécie vraiment.
noisesolo

Réponses:


3

Est-ce que l'une de vos fonctions lit depuis stdin (ex: la readcommande)? Si tel est le cas, le reste de FUNCTION_FILE sera lu.

Changez la boucle while pour utiliser un descripteur de fichier différent:

line_num=0
while read -u3 line; do
    echo "LINE_NUMBER=$(( ++line_num ))"
    $func
done 3<"$function_file"

Sortez de l'habitude d'utiliser ALL_CAPS_VARIABLES. Un jour, vous utiliserez accidentellement "PATH" et interromprez votre script.


Merci pour la suggestion, je vais regarder plus en profondeur et voir si c'est le cas. Malheureusement, beaucoup de conventions sont victimes d'une base de code extrêmement ancienne et volumineuse, mais j'apprécie vraiment vos conseils et m'assurerai de les respecter dans le cadre de mes propres efforts.
noisesolo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.