web-dev-qa-db-fra.com

Enregistrer le résultat de find en tant que variable dans un script Shell

Je veux trouver le chemin d'accès à un fichier et enregistrer cette sortie dans une variable d'un script Shell. Plus précisément, dans le shell bash, si j'écris

GCC_VERSION="find *-gcc"

Ensuite

echo ${GCC_VERSION}

Impressions

find some-gcc

Comment obtenir que la variable GCC_VERSION ne contienne que la sortie de find? C’est comment enregistrer la sortie de la commande find *-gcc dans la variable GCC_VERSION afin que

echo ${GCC_VERSION}

empreintes

some-gcc
3
bremen_matt

Tout d’abord, votre commande find est incorrecte. Si vous souhaitez rechercher tous les fichiers se terminant par -gcc dans le répertoire en cours, procédez comme suit:

$ find . -type f -name "*-gcc"

Pour enregistrer la sortie de find en GCC_VERSION, utilisez process substitution :

$ GCC_VERSION=$(find . -type f -name "*-gcc")

Notez que plusieurs fichiers peuvent se terminer par -gcc. Vous devez donc inclure un nom de variable entre guillemets:

$ echo "$GCC_VERSION"
./mipsel-linux-gnu-gcc
./aarch64-linux-gnu-gcc
./mips-linux-gnu-gcc
./arm-linux-gnueabihf-gcc
9

Vous devez utiliser les tiques de retour

VARIABLE=`Command`

ou mieux la syntaxe de substitution de commande new-style recommandée

VARIABLE=$(Command)

Bien que les deux formulaires soient pris en charge, l’incorporation de scripts dans le premier comporte des limitations.

Une citation de Spécifications du groupe ouvert Open Edition, édition 7, édition 2018 :

La forme de substitution de commande "$ ()" résout un problème de comportement incohérent lors de l'utilisation de citations arrières. Par exemple:

                Command               Output
                echo '\$x'              \$x
                echo `echo '\$x'`       $x
                echo $(echo '\$x')      \$x

De plus, la syntaxe backcoted comporte des restrictions historiques sur le contenu de la commande incorporée. Alors que le nouveau formulaire "$ ()" peut traiter n’importe quel type de script incorporé valide, le formulaire avec rétro-notation ne peut pas gérer certains scripts valides incluant des guillemets. Par exemple, ces scripts incorporés par ailleurs valides ne fonctionnent pas dans la colonne de gauche, mais fonctionnent à droite:

echo `                        echo $(
cat <<\eof                    cat <<\eof 
a here-doc with `             a here-doc with )
eof                           eof
`                             )

... fin de citation.

2
variona