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