2017-03-23 8 views
0

Je souhaite lire chaque ligne d'une entrée. Chaque ligne est lue avec succès dans une boucle while. Cependant, la boucle se termine par l'état 1:bash ligne de lecture quitte 1

$ incr=0 
$ while IFS='' read -r line || [[ -n "$line" ]] ; do  
    incr=$((incr+1));  
    echo "$incr: $line"; 
done < <(echo -e "one \ntwo\tthree\nfour") 
1: one 
2: two three 
3: four 

$ echo "status ${PIPESTATUS[@]}" 
status 1 

Pourquoi puis-je obtenir un état de sortie différent de 0?

Répondre

1

1 semble être le statut de sortie de la commande ([[ -n "$line" ]]) qui a provoqué la fermeture de la boucle while en premier lieu. Il est possible que ce soit un bug dans bash, ou au moins une différence non documentée dans quelle (s) commande (s) $? vs PIPESTATUS.

Vous pouvez observer la même différence dans une commande beaucoup plus simple:

$ while false; do echo foo; done 
$ printf '%s\n' "$?" "${PIPESTATUS[@]}" 
0 
1 
+0

Voulez-vous dire qu'une boucle while sort toujours avec un statut différent de 0? Je viens de le remarquer. Sauf si vous l'entrez au moins une fois et quittez avec une pause. – kaligne

+0

De la page de manuel: "La sortie statut des commandes while et until est le statut de sortie de la dernière commande do do list exécutée, ou zéro si aucune commande n'a été exécutée." ('list' ici est le corps de la boucle). 'PIPESTATUS' semble ramasser le statut de sortie de la * condition * à la place, et il n'est pas clair pour moi si c'est un bug ou une attente non documentée. – chepner