J'essaie d'écrire une fonction bash simple qui prend, comme arguments, un certain nombre de fichiers et / ou de répertoires. Cela devrait:
- Qualifiez entièrement les noms de fichiers.
- Triez-les.
- Supprimez les doublons.
- Imprimez tout ce qui existe réellement.
- Renvoie 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 en double). Si je décommente l' | sort -u
instruction comme indiqué, la sortie est correcte mais la valeur de retour est toujours 0
.
NB 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. C'est-à-dire, pourquoi l'ajout du tuyau semble-t-il arrêter le script d'incrémenter la variable r
?
Voici le script:
function uniqfile
{
local r=0
for arg in "$@"
do
readlink -e "$arg" || (( ++r ))
done #| sort -u ## remove that comment
return $r
}
for arg in "$@"
àfor arg
. "Si 'en MOTS ...;' n'est pas présent, alors 'in "$ @"' est supposé. " - aide pourRéponses:
Il s'agit d'un piège bash bien connu, en raison de cette fonctionnalité :
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:
la source
>(..command..)
construction. Je pense que je sais comment cela fonctionne, mais je pense que je devrais faire quelques lectures supplémentaires.Le
| sort -u
force le bit précédent (donc la boucle for entière) à s'exécuter dans un sous-processus (bash a besoin d'un 'STDOUT' pour rediriger vers lesort
'STDIN'. (Internet semble penserksh
etbash
gérer ce cas légèrement différemment .. premier ou dernier commande dans la séquence de tuyaux est placée dans un sous-shell?)Ce fil passe en revue un problème similaire et a une solution soignée à la fin: http://ubuntuforums.org/showthread.php?t=312017
extraitla source