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?
shell
command-line
command-substitution
tshepang
fuente
fuente
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.funciona si se escapan las comillas inversas anidadas:
diversión de barra invertida:
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 :)fuente
{ }
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.
ysource
son sinónimos.fuente
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í admitensource
(y no.
).$()
no funciona con el viejo shell Bourne. Pero han pasadoañosdesde que trabajé con el viejo shell Bourne.fuente
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".
fuente
$()
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:
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).
fuente
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 :
es más fácil de escribir y depurar que:
fuente