¿Qué es $ () en un comando?

18

¿Qué hay $()en los comandos de Shell de Linux?

Por ejemplo:

chmod 777 $(pwd)
Sudoer
fuente
1
Tenga en cuenta que no existe el comando line shell . Hay varias aplicaciones de shell disponibles para Linux.
Stéphane Chazelas

Respuestas:

21

Es muy similar a los backticks ''.

Se llama sustitución de comando ( especificación posix ) e invoca una subshell. El comando entre llaves $()o entre los backticks (``) se ejecuta en una subshell y la salida se coloca en el comando original.

A diferencia de los backticks, el $(...)formulario puede estar anidado. Entonces puede usar la sustitución de comandos dentro de otra sustitución.

Hay algunas diferencias en los caracteres de escape dentro de la sustitución. Prefiero la $(...)forma

caos
fuente
44
los backticks también se pueden anidar. Tenga en cuenta que los caracteres de nueva línea finales se eliminan de la salida del comando.
Stéphane Chazelas
2
@ StéphaneChazelas, ¿cómo se pueden anidar los backticks? ¿Quieres decir con escape exagerado?
caos
3
Sí: como conecho `echo \`echo foo\`` bar
Stéphane Chazelas
1
¿Alguna referencia oficial que diga que los backticks están en desuso?
vinc17
1
Encontré esta respuesta: unix.stackexchange.com/questions/126927/… parece que no están en desuso. Cambié mi respuesta, gracias
caos
5

En POSIX o POSIX como conchas ( ksh, bash, ash, zsh, yash...), es como ``: el interior de comandos $()se ejecuta y reemplazado por su salida estándar. La división de palabras y la generación de nombres de archivo se realizan a menos que$() que entre comillas dobles. Así

chmod 777 $(pwd)

debe reemplazarse con:

chmod 777 "$(pwd)"

para evitar la división de palabras y la generación de nombre de archivo en la ruta actual del directorio de trabajo.

O incluso mejor (excepto bajo algunos shells, como zsh, en caso de que el directorio haya cambiado de nombre):

chmod 777 "$PWD"

Ya que $PWD es una variable especial que contiene la ruta al directorio de trabajo actual en shells POSIX.

O mejor:

chmod 777 .

Dado que la .entrada en el directorio actual es un enlace duro a ese directorio en sí.

vinc17
fuente
2

Esto $()se usa para ejecutar un comando principalmente dentro de otro comando.

chmod 777 $(pwd)

pwdEl comando proporciona el directorio de trabajo actual. Entonces, cuando todo se ejecuta, la salida de pwd reemplazará su posición y servirá como argumento para chmod, y el resultado es que todo su directorio de trabajo actual obtiene el permiso 777que supongo que nunca debería usarse en el entorno de producción;).

principiante
fuente