Skip to content

Bash : dirigez la sortie « trouver » dans « readarray »

Solution:

Lors de l’utilisation d’un pipeline, bash exécute les commandes dans des sous-shells. Par conséquent, le tableau est rempli, mais dans un sous-shell, de sorte que le shell parent n’y a pas accès.

Utiliser la substitution de processus :

readarray FILES < <(find)

Notez que cela ne fonctionne pas pour les fichiers avec des nouvelles lignes dans leurs noms. Si cela peut être le cas, vous avez besoin d’une syntaxe plus élaborée :

readarray -d '' < <(find -print0)

La bonne solution est :

unset a; declare -a a
while IFS= read -r -u3 -d $'' file; do
    a+=( "$file" )        # or however you want to process each file
done 3< <(find /tmp -type f -print0)

C’est similaire à ce que Greg’s BashFAQ 020 explique en détail et cette réponse couvre.

N’a aucun problème avec les fichiers nommés impairs (qui ne contiennent pas de NUL dans le nom), avec des espaces ou des nouvelles lignes. Et le résultat est défini dans un tableau, ce qui le rend utile pour un traitement ultérieur.

readarray peut également lire à partir de stdin

readarray FILES <<< "$(find . -name "file*")"; echo "${#FILES[@]}"


Tags : / /

Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.