web-dev-qa-db-fra.com

Qu'est-ce que cela signifie dans Shell lorsque nous plaçons une commande à l'intérieur des signes dollar et des parenthèses: $ (commande)

Je veux juste comprendre la ligne de code suivante dans Shell. Il est utilisé pour obtenir le répertoire de travail actuel. Je suis conscient que $(variable) name renvoie la valeur à l'intérieur du nom de la variable, mais qu'est-ce que $(command) est censé renvoyer? Renvoie-t-il la valeur après avoir exécuté 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 de Shell

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?

89
KItis

L'utilisation de $ Comme ${HOME} Donne la valeur de HOME. L'utilisation de $ Comme $(echo foo) signifie exécuter tout ce qui est à l'intérieur des parenthèses dans un sous-shell et le renvoyer sous forme de valeur. Dans mon exemple, vous obtiendrez foo car echo écrira foo dans la sortie standard

99
Eric Urban
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

Quelqu'un pourrait-il m'aider à comprendre comment cette commande est exécutée?

Regardons les différentes parties de la commande. BASH_SOURCE Est une variable de tableau bash contenant les noms de fichiers source. Donc "${BASH_SOURCE[0]}" Vous renverrait 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 disant bash foo, "$( dirname "${BASH_SOURCE[0]}" )" renverrait .. Si vous disiez bash ../foo, il renverrait ..; pour bash /some/path/foo retourne /some/path.

Enfin, toute la commande "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" obtient le répertoire absolu contenant le script appelé.

$(...) autorise 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.

20
devnull