world significa script que para hello foo example bash shell ksh sh

bash - significa - ¿Cuál es la diferencia entre $(command) y `command` en la programación de shell?



shell script example (6)

"¿Cuál es la diferencia si hay alguna entre los dos métodos?"

Presta atención a este comportamiento:

A="A_VARIABLE" echo "$(echo "/$A")" echo "`echo "/$A"`"

Obtendrás estos resultados:

$A A_VARIABLE

Para almacenar la salida de un comando como una variable en sh / ksh / bash, puede hacer lo siguiente

var=$(command)

o

var=`command`

¿Cuál es la diferencia si hay alguna entre los dos métodos?


Cuando se usa el formulario anterior de marca de retroceso, la barra invertida conserva su significado literal, excepto cuando sigue con $, `o /. El primer back-tick no precedido por una barra invertida termina la sustitución del comando.

Cuando se utiliza el formulario $(command) más reciente, todos los caracteres entre los paréntesis forman el comando; ninguno es tratado especialmente

Ambas formas pueden estar anidadas, pero la variedad back-tick requiere la siguiente forma.

`echo /`foo/``

Opuesto a:

$(echo $(foo))


Hay poca diferencia, excepto por los caracteres no escapados que puedes usar dentro del comando. Incluso puede poner los comandos `...` dentro de los comandos $ (...) (y viceversa) para una sustitución de comandos más profunda de dos niveles.

Hay una interpretación ligeramente diferente del carácter / operador de barra invertida. Entre otras cosas, al anidar los comandos de sustitución `...` , debe escapar de los caracteres ` internos con /, mientras que con la subestación $ () se entiende el anidamiento automáticamente.


Julio de 2014: el commit f25f5e6 (por Elia Pinto ( devzero2000 ) , abril de 2014, Git 2.0) se suma al problema de anidación:

La forma entre comillas es el método tradicional para la sustitución de comandos, y es compatible con POSIX.
Sin embargo, todos los usos, excepto los más simples, se complican rápidamente.
En particular, las sustituciones de comandos incrustadas y / o el uso de comillas dobles requieren un escape cuidadoso con el carácter de barra invertida .

Es por eso que git/Documentation/CodingGuidelines menciona:

Preferimos $( ... ) para la sustitución de comandos; a diferencia de ``, anida correctamente .
Debería haber sido la forma en que Bourne lo escribió desde el primer día, pero desafortunadamente no lo es.

thiton commented :

Es por eso que `echo `foo`` no funcionará en general debido a la ambigüedad inherente porque cada `` puede abrirse o cerrarse.
Puede funcionar para casos especiales debido a la suerte o características especiales.

Actualización de enero de 2016: Git 2.8 (marzo de 2016) elimina por completo las comillas inversas.

Ver cometer ec1b763 , cometer 9c10377 , cometer c7b793a , cometer 80a6b3f , cometer 9375dcf , cometer e74ef60 , cometer 27fe43e , cometer 2525c51 , cometer becd67f , com en el cuadro de trabajo de los animales de la propiedad . 38e9476 , commit 8823d2f , commit 32858a0 , commit cd914d8 (12 de enero de 2016) de Elia Pinto ( devzero2000 ) .
(Combinado por Junio ​​C Hamano - gitster - in commit e572fef , 22 de enero de 2016)

Desde Git 2.8 en adelante, todo es $(...) , no más `...` .


Los backticks / gravemarks han quedado en desuso en favor de $() para la sustitución de comandos porque $() puede anidar fácilmente dentro de sí mismo como en $(echo foo$(echo bar)) . Hay otras diferencias, como la forma en que se analizan las barras invertidas en la versión de marca de retroceso / marca de gravedad, etc.

Consulte BashFAQ/082 por varias razones para preferir siempre la sintaxis $ (...).

Consulte también la especificación POSIX para obtener información detallada sobre las distintas diferencias.


Se comportan igual. La diferencia es sintáctica: es más fácil anidar $() que `` :

listing=$(ls -l $(cat filenames.txt))

contra

listing=`ls -l /`cat filenames.txt/``