Qu'est-ce que cela signifie:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
Je suis particulièrement intéressé par cette partie:
varible=$(...)
Je sais que les parenthèses sont utilisées pour exécuter un sous-processus, mais que faire si elles sont utilisées avec $
?
man bash
Réponses:
Dans le manuel Bash (
man bash
):(Cela est vrai pour tous les Bourne comme des coquilles, par exemple
sh
,ksh
,zsh
,bash
etc., etzsh
est également capable de capturer des données avec des caractères NUL intégrés de cette façon)La commande
attribuera le nom du répertoire où se trouve le script (tout en changeant toutes les barres obliques inverses en barres obliques) à la variable
basedir
. Toutes les erreurs, avertissements ou autres messages de diagnostic qui sont transmis au flux d'erreurs standard seront toujours affichés sur le terminal ($(...)
capture uniquement la sortie standard de la commande).Le shell commencera par exécuter la substitution de commande la plus interne:
La sortie de cela sera donnée sous forme de chaîne à
dirname
, et la sortie de celle-ci sera affectée à la variablebasedir
.Les guillemets doubles sont là pour vous assurer qu'aucun fractionnement de mot ou remplacement de nom de fichier ne sera effectué, sinon vous pouvez constater que le script échoue ou produire une sortie étrange lorsque
$0
(le nom du script, y compris le chemin utilisé pour l'exécuter) contient un espace ou un caractère de remplacement de nom de fichier (tel que?
ou*
).C'est en général une bonne idée de toujours citer les extensions (extensions variables, substitutions de commandes et extensions arithmétiques). Voir cette question et ses réponses pour une excellente explication de pourquoi c'est une bonne idée.
Si le script a été exécuté en tant que
puis
basedir
va obtenir la valeur de/usr/local/bin
.Ou, sur Cygwin:
puis
basedir
va obtenir la valeur dec:/Users/Me
. Dans ce cas, les doubles barres obliques inverses sur la ligne de commande servent simplement à échapper les barres obliques inverses simples du shell. La valeur réelle de$0
estc:\Users\Me\script.sh
.Une autre façon de faire la même chose sans utiliser
dirname
,echo
etsed
seraitla source
/bin/sh
de Solaris 10 ou antérieur) n'était pas compatible$(...)
.Cela signifie exécuter ce qui est à l'intérieur des parenthèses dans un sous - shell et renvoyer cela en tant que valeur , dans votre cas en l'assignant à
varible
.la source
La substitution de commande
varible=$(..)
appelée et cela ne signifie rien d'autre que d'exécuter une commande shell et de stocker sa sortie dans une variable ou de l'afficher à l'aide de la commande echo. Par exemple, affichez la date et l'heure:et pour le stocker dans une variable:
Pour plus d'informations: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
la source