Je veux juste comprendre la ligne de code suivante dans le shell. Il est utilisé pour obtenir le répertoire de travail actuel. Je sais que le $(variable)
nom renvoie la valeur à l'intérieur du nom de la variable, mais qu'est-ce qui est $(command)
censé renvoyer? Renvoie-t-il la valeur après l'exécution de la commande? Dans ce cas, nous pouvons utiliser `
pour exécuter la commande.
CWD="$(cd "$(dirname $0)"; pwd)"
La même sortie peut être extraite de la ligne de code suivante également dans une version différente du shell
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Je suis incapable de comprendre la signification de $(cd..
et $(dirname
.
Quelqu'un pourrait-il m'aider à comprendre comment cette commande est exécutée?
$()
vs``
: stackoverflow.com/questions/9449778/…Réponses:
L'utilisation de
$
similaires${HOME}
donne la valeur de HOME. L'utilisation de la$
même$(echo foo)
chose signifie exécuter tout ce qui se trouve à l'intérieur des parenthèses dans un sous-shell et le renvoyer comme valeur. Dans mon exemple, vous obtiendrezfoo
puisqueecho
écrirafoo
en standardla source
$(...)
est une meilleure façon d'écrire une commande que d'essayer d'utiliser des guillemets. Pensez à écrire: engcclib=$(dirname $(dirname $(which gcc)))/lib
utilisant des guillemets. Même avant d'entrer dans les difficultés de le faire dans Markdown, c'est plus difficile car vous devez échapper aux guillemets des commandes imbriquées, alors que vous ne le faites pas avec la$(...)
notation.$(echo foo)
crée une substitution de commande, pas un sous-shell. L'autre réponse actuelle a raison. Je pense que la substitution de commandes est exécutée dans un sous-shell, en quelque sorte, mais ce sont toujours des concepts différents.$(echo foo)
essaiera d' exécuter ce qui est retourné par les parenthèses, elle s'exécutera d'abord,echo foo
puis essaiera de s'exécuter,foo
ce qui donne une erreurRegardons différentes parties de la commande.
BASH_SOURCE
est une variable de tableau bash contenant les noms de fichiers source. Donc"${BASH_SOURCE[0]}"
je vous renvoie le nom du fichier de script.dirname
est un utilitaire fourni par GNU coreutils qui supprime le dernier composant du nom de fichier. Ainsi, si vous exécutez votre script en disantbash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
reviendrait.
. Si vous disiezbash ../foo
, il reviendrait..
; carbash /some/path/foo
il reviendrait/some/path
.Enfin, la commande entière
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
obtient le répertoire absolu contenant le script appelé.$(...)
permet la substitution de commande, c'est-à-dire permet à la sortie d'une commande de remplacer la commande elle-même et peut être imbriquée.la source
dirname
renvoie le chemin du fichier exécuté (relatif ou absolu au répertoire de travail actuel),cd
modifie le pwd dans ce répertoire etpwd
affiche le chemin absolu du répertoire de travail actuel. Mais pourquoi sont-ils rejoints&&
? Et que se passera-t-ilDIR
si l'cd
échec?&&
empêche lepwd
de s'exécuter en cas d'cd
échec, de sorte qu'ilDIR
sera vide plutôt que d'avoir un répertoire incorrect.