Que signifie en shell lorsque nous avons mis une commande à l'intérieur du signe du dollar et des parenthèses: $(commande)
Je veux juste comprendre la ligne de code suivante dans le shell. Il est utilisé pour obtenir le répertoire de travail courant. Je suis conscient que $(variable)
nom de retourner la valeur à l'intérieur le nom de la variable, mais qu'est-ce que $(command)
censé renvoyer? Est-il retourner la valeur après l'exécution de la commande? Dans ce cas, on peut utiliser `
pour exécuter la commande.
CWD="$(cd "$(dirname $0)"; pwd)"
Même résultat peut être pris à partir de la ligne suivante de code dans une version différente de la coquille
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Je suis incapable de comprendre le sens de $(cd..
et $(dirname
.
Quelqu'un pourrait-il m'aider à comprendre comment cette commande est exécutée?
- Et voici une question sur les avantages/inconvénients de
$()
vs``
: stackoverflow.com/questions/9449778/...
Vous devez vous connecter pour publier un commentaire.
L'utilisation de la
$
comme${HOME}
donne la valeur de la MAISON. L'utilisation de la$
comme$(echo foo)
moyens d'exécuter tout ce qui est à l'intérieur des parenthèses dans un shell interne est exécuté et le retour qu'en tant que valeur. Dans mon exemple, vous obtiendrezfoo
depuisecho
va écrirefoo
de standard$(...)
est une meilleure façon de rédiger une commande que d'essayer d'utiliser les guillemets. Envisager d'écrire:gcclib=$(dirname $(dirname $(which gcc)))/lib
utilisant des guillemets. Avant même de vous lancer dans les difficultés de le faire en Markdown, il est plus difficile parce que vous avez pour échapper à la backquotes de la imbriqués les commandes, alors que vous n'avez pas le$(...)
notation.$(echo foo)
crée une substitution de commande, pas un shell interne est exécuté. L'autre réponse actuelle obtient ce droit. Je pense que la substitution de commande est exécuté dans un shell interne est exécuté, en quelque sorte, mais ils sont encore des concepts différents.$(echo foo)
va essayer de exécuter ce qui est retourné dans les parenthèses, il va d'abord exécuterecho foo
alors essayez d'exécuterfoo
qui donne une erreurVoyons les différentes parties de la commande.
BASH_SOURCE
est un bash variable tableau contenant le nom des fichiers source. Donc"${BASH_SOURCE[0]}"
vous fera retourner le nom du fichier de script.dirname
est un utilitaire fourni par GNU coreutils que supprimer la dernier composant de nom de fichier. Ainsi, si vous exécutez votre script en disantbash foo
,"$( dirname "${BASH_SOURCE[0]}" )"
serait de retour.
. Si vous avez ditbash ../foo
, il retourne..
; pourbash /some/path/foo
il retourne/some/path
.Enfin, l'ensemble de la commande
"$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
obtient l'absolu d'un répertoire contenant le script invoqué.$(...)
permet la substitution de commande, c'est à dire permet à la sortie d'une commande à remplacer la commande elle-même et peuvent être imbriquées.dirname
retourne le chemin d'accès du fichier exécuté (relatif ou absolu vers le présent répertoire de travail),cd
modifications de la directive sur le détachement de ce répertoire, etpwd
affiche le chemin absolu du répertoire de travail courant. Mais pourquoi sont-ils rejoints par&&
? Et ce seraDIR
attente si lecd
échoue?pwd
de s'exécuter si lecd
échoue, tels queDIR
sera vide plutôt que d'avoir un mauvais répertoire.