J'essaie d'écrire une simple fonction bash qui prend, comme arguments, un certain nombre de fichiers et/ou de répertoires. Il devrait :
- Qualifier entièrement les noms de fichiers.
- Triez-les.
- Supprimer les doublons.
- Imprimez tout ce qui existe réellement.
- 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)