Que signifie ce qui suit?
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-process, mais que faire si elles sont utilisées avec $
?
Du manuel Bash ( man bash
):
Substitution de command La substitution de command permet la sortie d'une command pour replace le nom de la command. Il y a deux forms: $ (command) ou `command` Bash effectue l'expansion en exécutant la command dans un sous-shell environnement et replace la substitution de command par la norme sortie de la command, avec toutes les nouvelles lignes de fin supprimées. Intégré les nouvelles lignes ne sont pas supprimées, mais elles peuvent être supprimées pendant le mot scission. La substitution de la command $ (file cat) peut être remplacée par la command équivalent mais plus rapide $ (<file).
(Ceci est valable pour tous les shells de type Bourne, par exemple sh
, ksh
, zsh
, bash
etc. et zsh
est également capable de capturer des données avec des caractères NUL incorporés de cette manière)
La command
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
affectera le nom du directory où se trouve le script (tout en changeant toutes les barres obliques inverses en barres obliques) à la base basedir
. Toutes les erreurs, avertissements ou autres messages de diagnostic envoyés au stream d'erreur standard seront toujours affichés sur le terminal ( $(...)
ne capturant que la sortie standard de la command).
Le shell commencera par l'exécution de la substitution de command la plus interne:
echo "$0" | sed -e 's,\\,/,g'
La sortie de celui-ci sera donnée sous forme de string à dirname
, et la sortie de celle-ci sera assignée à la variable basedir
.
Les guillemets sont là pour s'assurer qu'aucun mot de scission ou de nom de file ne sera fait, sinon vous risquez de constater que le script échoue ou produit une sortie étrange quand $0
(le nom du script incluant le path utilisé pour l'exécuter) contient un un caractère d'espace ou un caractère de nom de file (par exemple ?
ou *
).
C'est généralement une bonne idée de toujours citer les expansions (expansions variables, substitutions de commands et expansions arithmétiques). Voir cette question et ses réponses pour une excellente explication de la raison pour laquelle c'est une bonne idée.
Si le script a été exécuté comme
$ /usr/local/bin/script.sh
alors basedir
obtiendra la valeur de /usr/local/bin
.
Ou, sur Cygwin:
$ bash c:\\Users\\Me\\script.sh
alors basedir
obtiendra la valeur de c:/Users/Me
. Les doubles barres obliques inverses sur la command line dans ce cas sont juste pour échapper aux antislashs uniques du shell. La valeur réelle de $0
est c:\Users\Me\script.sh
.
Une autre façon de faire la même chose sans utiliser dirname
, echo
et sed
serait
basedir="${0//\\//}" basedir="${basedir%/*}"
Cela signifie exécuter ce qui est à l'intérieur des parenthèses dans un sous – shell et le renvoyer en tant que valeur , dans votre cas l'assignant à varible
.
Le varible=$(..)
appelé Substitution de commands et cela ne signifie rien d'autre que d'exécuter une command shell et de stocker sa sortie dans une variable ou l'afficher en utilisant la command echo. Par exemple, affichez la date et l'heure:
echo "Today is $(date)"
et pour le stocker à une variable:
SERVERNAME=$(hostname)
Pour plus d'informations: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/