9
votes

Lire une ligne avec "Lire" en bash, mais sans "alors que"

J'essayais de comprendre comment "tout en lisage" fonctionne dans Bash, et je suis arrivé à accrocher un comportement que je ne peux pas expliquer: xxx pré>

Ça fonctionne bien avec "tout en lisant": P>

root@antec:/# var=old_value
root@antec:/# echo "new_value" | while read var; do echo $var; done
new_value
root@antec:/# 


0 commentaires

4 Réponses :


7
votes

Je crois que c'est un problème de priorité, avec | avoir une priorité plus élevée que &&. Tout d'abord est regroupé comme suit: xxx p> second est regroupé comme suit: xxx


1 commentaires

Je n'aurais jamais pensé à ça! Merci



6
votes

Pourquoi pensez-vous que cela fonctionne dans le deuxième cas? Il ne met pas vraiment à jour var . faire echo $ var après la ligne avec pendant et voir.

Explication: tout ce qui vient après | est exécuté dans un sous-groupe qui a sa propre copie de var . L'original var n'est pas affecté dans les deux cas. Ce qui est écho dépend de la question de savoir si echo est appelé dans le même sous-compartiment que lue ou non.


1 commentaires

Le problème est de ne pas mettre à jour var dans la coque principale ou non, peut-être que je n'étais pas clair dans la question. J'étais intéressé par ce qui est écho, comme vous parlez de votre dernière phrase :)



1
votes

Vous n'avez pas besoin de pendant boucle: xxx


0 commentaires

2
votes

Je ne voulais pas imprimer la variable immédiatement, mais l'utiliser plus tard et que cela fonctionne:

var=old_value
tmp=$(echo "new_value")
read var <<<"$tmp"
echo $var
> new_value


0 commentaires