GNU/Linux >> Tutoriels Linux >  >> Linux

La tuyauterie pour la sortie de boucle empêche la modification de la variable locale ?

J'essaie d'écrire une simple fonction bash qui prend, comme arguments, un certain nombre de fichiers et/ou de répertoires. Il devrait :

  1. Qualifier entièrement les noms de fichiers.
  2. Triez-les.
  3. Supprimer les doublons.
  4. Imprimez tout ce qui existe réellement.
  5. Renvoyer le nombre de fichiers inexistants.

J'ai un script qui fait presque ce que je veux, mais tombe sur le tri. La valeur de retour du script tel qu'il est est correcte, mais la sortie ne l'est pas (non triée et doublons). Si je décommente le | sort -u comme indiqué, la sortie est correcte mais la valeur de retour est toujours .

N.B. Des solutions plus simples pour résoudre le problème sont les bienvenues, mais la question est vraiment de savoir pourquoi cela se produit dans le code que j'ai. Autrement dit, pourquoi l'ajout du tube empêche-t-il apparemment le script d'incrémenter la variable r ?

Voici le script :

function uniqfile
{
    local r=0 

    for arg in "[email protected]"
    do  
        readlink -e "$arg" || (( ++r ))

    done #| sort -u    ## remove that comment

    return $r
}

Réponse acceptée :

C'est un piège bash bien connu, en raison de cette fonctionnalité :

Chaque commande d'un pipeline est exécutée en tant que processus distinct (c'est-à-dire dans un sous-shell).

afin que les variables modifiées soient locales au sous-shell et non visibles une fois de retour dans le parent.

Pour éviter cela, reformulez votre code pour éviter le pipeline, avec une substitution de processus :

 for arg in "[email protected]"
    do  
        readlink -e "$arg" || (( ++r ))

    done > >(sort -u)

Linux
  1. Bash for loop Exemples

  2. Code de retour de sed pour aucune correspondance

  3. Couleur différente pour la commande et la sortie

  4. Comment trier cette sortie 1,10,11..2

  5. Boucle for imbriquée

Bash For Loop Guide et exemples

Bash pour la boucle

Comment trier la sortie par taille ?

Paralléliser une boucle Bash For ?

Comprendre la boucle for dans les scripts shell

La boucle Bash FOR expliquée et simplifiée