Qu'est-ce que $ () dans une commande?

18

Que $()contiennent les commandes du shell Linux?

Par exemple:

chmod 777 $(pwd)
Sudoer
la source
1
Notez qu'il n'y a rien de tel que la commande shell de ligne . Il existe un certain nombre d'applications shell disponibles pour Linux.
Stéphane Chazelas

Réponses:

21

C'est très similaire aux backticks ''.

Cela s'appelle la substitution de commandes ( spécification posix ) et il appelle un sous-shell. La commande entre les accolades $()ou entre les pointes (``) est exécutée dans un sous-shell et la sortie est ensuite placée dans la commande d'origine.

Contrairement aux backticks, le $(...)formulaire peut être imbriqué. Vous pouvez donc utiliser la substitution de commandes dans une autre substitution.

Il existe également des différences dans les caractères d'échappement au sein de la substitution. Je préfère la $(...)forme.

le chaos
la source
4
les backticks peuvent également être imbriqués. Notez que les caractères de fin de ligne sont supprimés de la sortie de la commande.
Stéphane Chazelas
2
@ StéphaneChazelas comment imbriquer des backticks? Vous voulez dire par fuite échappée?
chaos
3
Oui: comme avececho `echo \`echo foo\`` bar
Stéphane Chazelas
1
Une référence officielle disant que les backticks sont dépréciés?
vinc17
1
Trouvé cette réponse: unix.stackexchange.com/questions/126927/… semble qu'ils ne sont pas obsolètes. Changé ma réponse, merci
chaos
5

Dans Posix ou POSIX comme des coquilles ( ksh, bash, ash, zsh, yash...), il est comme ``: la commande à l' intérieur $()est exécuté et remplacé par sa sortie standard. Le fractionnement de mots et la génération de noms de fichiers sont effectués, sauf s'ils $()se trouvent entre guillemets. Donc

chmod 777 $(pwd)

devrait être remplacé par:

chmod 777 "$(pwd)"

pour éviter le fractionnement de mots et la génération de noms de fichiers sur le chemin du répertoire de travail actuel.

Ou encore mieux (sauf sous certains shells, comme zsh, au cas où le répertoire a été renommé):

chmod 777 "$PWD"

Depuis $PWDest une variable spéciale qui contient le chemin d'accès au répertoire de travail actuel dans les shells POSIX.

Ou encore mieux:

chmod 777 .

Étant donné que l' .entrée dans le répertoire actuel est un lien dur vers ce répertoire lui-même.

vinc17
la source
2

Ceci $()est utilisé pour exécuter une commande principalement dans une autre commande.

chmod 777 $(pwd)

pwddonne le répertoire de travail actuel. Ainsi, lorsque tout est exécuté, la sortie de pwd remplacera sa position et servira d'argument à chmod, et le résultat est que tout votre répertoire de travail actuel obtient l'autorisation 777qui, je suppose, ne devrait jamais être utilisée dans un environnement de production;).

débutant
la source