Hay dos sintaxis para la sustitución de comandos: con paréntesis en dólares y con comillas invertidas. Ejecutando top -p $(pidof init)
y top -p `pidof init`
da la misma salida. ¿Son estas dos formas de hacer lo mismo o hay diferencias?
Hay dos sintaxis para la sustitución de comandos: con paréntesis en dólares y con comillas invertidas. Ejecutando top -p $(pidof init)
y top -p `pidof init`
da la misma salida. ¿Son estas dos formas de hacer lo mismo o hay diferencias?
Respuestas:
Las comillas inversas de estilo antiguo ` `
tratan las barras diagonales inversas y la anidación un poco diferente. El nuevo estilo $()
interpreta todo en el medio ( )
como un comando.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
funciona si se escapan las comillas inversas anidadas:
echo `uname | \`echo cat\``
Linux
diversión de barra invertida:
echo $(echo '\\')
\\
echo `echo '\\'`
\
El nuevo estilo se $()
aplica a todos los shells conformes con POSIX .
Como señaló Mouviciel , el estilo antiguo ` `
podría ser necesario para las conchas más antiguas.
Además del punto de vista técnico, el estilo antiguo ` `
también tiene una desventaja visual:
I like $(program) better than `program`
'`'`''`''`'`''`'
(y SE lo usa ` `
para su propio propósito, fue un dolor escribir esta respuesta :)
{ }
generalmente se llama "llaves" o "llaves" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
es una tecla muerta, por lo que tengo que escribir un doble retroceso (algo que generalmente olvido que incluso puedo hacer) o retroceder y luego el espacio, que es un dolor.
La diferencia obvia que observo es que no puedes anidar backticks mientras puedes anidar $()
. Tal vez ambos existan por razones heredadas. Del mismo modo, los comandos .
y source
son sinónimos.
source
. Dash es un ejemplo.
$(...)
y `...`
son estándar (este último está en desuso) mientras que .
es estándar pero nosource
(t)csh
no se pueden anidar. aunque (t)csh
no lo soportes $(...)
. Sin embargo, sí admiten source
(y no .
).
$()
no funciona con el viejo shell Bourne. Pero han pasado años desde que trabajé con el viejo shell Bourne.
Otra nota, $()
usará más recursos del sistema que usar backticks, pero es un poco más rápido.
En Mastering Unix shell scripting , Randal K. Michael había hecho una prueba en un capítulo llamado "24 formas de procesar un archivo línea por línea".
$()
hace que su script sea un byte más grande que si se usara `
(suponiendo que no los anide y no use barras invertidas dentro). En cuanto a cuál sería más rápido de analizar, eso variaría entre los proyectiles y sería irrelevante, ya que sería insignificante en comparación con el costo de crear una tubería y un proceso de bifurcación que implica la sustitución del comando.
Para agregar a lo que otros dijeron aquí, puede usar los backticks para simular comentarios en línea:
echo foo `# I'm a comment!` bar
La salida es: foo bar
.
Consulte lo siguiente para obtener más información: https://stackoverflow.com/a/12797512 (Tenga en cuenta también los comentarios debajo de esa publicación).
La $()
sintaxis no funcionará con el viejo shell bourne.
Con shells más nuevos ` `
y $()
equivalentes, pero $()
es mucho más conveniente de usar cuando necesita anidar múltiples comandos.
Por ejemplo :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
es más fácil de escribir y depurar que:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``