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
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
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.