Estoy probando el comando
$ b=5; echo `$b`;
-bash: 5: command not found
pero no imprime 5 como se supone que debe hacerlo. ¿Que me estoy perdiendo aqui?
¿Qué significa `(backquote / backtick) en los comandos? parece decir que `
evalúa los comandos dentro y los reemplaza con la salida.
bash
shell
command-substitution
coolcric
fuente
fuente
Respuestas:
El texto entre comillas invertidas se ejecuta y se reemplaza por la salida del comando (menos los caracteres de línea nueva finales, y tenga en cuenta que los comportamientos de shell varían cuando hay caracteres NUL en la salida). Eso se llama sustitución de comando porque se sustituye con la salida del comando. Entonces, si desea imprimir 5, no puede usar comillas invertidas, puede usar comillas, como
echo "$b"
o simplemente dejar cualquier cita y usarecho $b
.Como puede ver, dado que
$b
contiene 5, cuando usa backticksbash
está intentando ejecutar el comando5
y dado que no existe dicho comando, falla con el mensaje de error.Para entender cómo funcionan los backticks, intente ejecutar esto:
cat /etc/passwd |head -n1
debería imprimir la primera línea del/etc/passwd
archivo. Pero como usamos backticks, no imprime esto en la consola. En cambio, se almacena enA
variable. Puedes hacer eco$A
de esto. Tenga en cuenta que una forma más eficiente de imprimir la primera línea es mediante el comando,head -n1 /etc/passwd
pero quería señalar que la expresión dentro de los backticks no tiene que ser simple.Entonces, si la primera línea de / etc / passwd es
root:x:0:0:root:/root:/bin/bash
, el primer comando será sustituido dinámicamente por bash toA="root:x:0:0:root:/root:/bin/bash"
.Tenga en cuenta que esta sintaxis es del shell Bourne. Citar y escapar se convierte rápidamente en una pesadilla, especialmente cuando comienzas a anidarlos. Ksh introdujo la
$(...)
alternativa que ahora está estandarizada ( POSIX ) y es compatible con todos los shells (incluso el shell Bourne de Unix v9). Por lo tanto, debe usar$(...)
en su lugar hoy en día a menos que necesite ser portátil para conchas Bourne muy antiguas.También tenga en cuenta que la salida de
`...`
y$(...)
está sujeta a la división de palabras y la generación de nombre de archivo al igual que la expansión de variables (en zsh, división de palabras solamente), por lo que generalmente debería citarse en contextos de lista.fuente
you can use quotation marks, like echo "$b"
=> ¿el "" hace algo especial? Pareceecho $b
que funcionaría igual de bien.echo
comando no le importa la cantidad de argumentos que obtiene, por lo que sib
tiene algunos espacios en el interior, obtendrá múltiples argumentos y aún los imprimirá. Este puede no ser el caso para otros comandos (especialmente cuando la variable no está configurada), por lo que siempre tiendo a rodear las variables con comillas.(POSIX)
fuera un enlace al estándar real.El backtick hace exactamente lo que tú dices. Ha establecido una variable en un entero. Cuando colocas esa variable dentro de los backticks, bash intentará ejecutarla como un comando. Como no es un comando, obtienes el error que viste.
Lo que quieres hacer es simplemente:
Para comprender mejor los backticks, compare con:
fuente
Ir paso a paso su línea debería explicarlo.
b
a 5$b
(ejecuta efectivamente5
)echo
es el resultado de la evaluación anterior.Entonces sí, se espera la salida que obtuviste. Estás evaluando el contenido de una variable, no el comando real que creías que eras. Todo lo que pones dentro de los backticks se evalúa (ejecuta) en un nuevo (sub) shell.
fuente