2 votes

bash n'exécute pas les commandes dans un ordre séquentiel

J'ai un bash script qui contient ce qui suit :

MY_COMMAND="MY_PWD=`pwd`; export MY_PWD; MY_PWD_BASENAME=`basename $MY_PWD`; echo $MY_PWD_BASENAME"; export MY_COMMAND

Lorsque je source le script à partir du terminal, j'obtiens l'erreur suivante :

basename: missing operand
Try `basename --help' for more information.

Cela indique que les commandes dans MY_COMMAND ne sont pas exécutés dans un ordre séquentiel. Que se passe-t-il ici ?

5voto

hek2mgl Points 38787

La ligne suivante :

MY_COMMAND="MY_PWD=`pwd`; export MY_PWD; MY_PWD_BASENAME=`basename $MY_PWD`; echo $MY_PWD_BASENAME"

se pas exécuter les commandes suivantes (comme vous pouvez le penser) :

MY_PWD=`pwd`
export MY_PWD
MY_PWD_BASENAME=`basename $MY_PWD`
echo $MY_PWD_BASENAME"

Au lieu de cela, elle élargira le substitutions de commandes

`pwd`
`basename $MY_PWD`

et les remplacer par leurs résultats. Puisque $MY_PWD n'est pas défini, basename sera exécuté sans l'argument requis, comme :

basename

Cela conduit à l'erreur.


Correction : Je recommande d'utiliser $() à la place des backticks pour la substitution de la commande. L'un des avantages est que vous pouvez les imbriquer :

MY_COMMAND="MY_PWD=$(pwd); export MY_PWD; MY_PWD_BASENAME=$(basename "$(pwd)"); echo $MY_PWD_BASENAME"

Cependant, ce n'est que la correction de la syntaxe. En général, je recommande d'utiliser une fonction comme @chepner a suggéré

lib.sh

function basename_pwd() {
    basename "$(pwd)"
}

Utilisez la fonction :

#!/bin/bash
source "lib.sh"
basename_pwd

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X