Recientemente, utilicé el comando echo con el prefijo $. Para mi sorpresa, lo que resultó fue un error. Mi comando fue algo como esto.
# !/bin/bash $(echo "a")
El error fue ..
./test1.sh: line 3: a: command not found
¿Alguien puede explicar lo que está sucediendo aquí? Gracias de antemano.
Respuesta
$(echo a)
es una «sustitución de comandos». El $(...)
será reemplazado por el resultado del comando dentro de . La salida en este caso es a
, que luego el shell intenta ejecutar. El shell «no puede localizar el comando llamado a
y obtiene el mensaje de error.
No está claro cuál era su intención con esto o qué esperaba que sucediera . Es muy inusual querer ejecutar el resultado de una sustitución de comando.
Algunos programas generan cadenas que deben ser evaluadas por el shell. Por lo tanto, es posible ver código como
eval "$(ssh-agent)"
que evalúa (ejecuta) la salida del comando dado. Estos comandos tienen una salida estrictamente especificada y generalmente se consideran seguros de ejecutar en este En el ejemplo anterior, ssh-agent
iniciará el proceso del agente SSH y generará algunos comandos que establecerán las variables de entorno adecuadas que ssh
el cliente posteriormente necesitará usar el agente, por ejemplo,
SSH_AUTH_SOCK=/tmp/ssh-Ppg1EO5eRIZp/agent.6017; export SSH_AUTH_SOCK; SSH_AGENT_PID=6018; export SSH_AGENT_PID; echo Agent pid 6018;
Esto luego es evaluado por eval
.
eval
se usa aquí en lugar de solo simplemente usando $(ssh-agent)
ya que la salida del comando ssh-agent
es más un comando compuesto. Sin eval
, los terminadores de comandos ;
serían netamente especiales.
Ejemplo:
$ s="echo hello; echo world" $ $s hello; echo world $ eval "$s" hello world
Comentarios
Responder
Puede usar set -x
para vea lo que está haciendo el shell:
set -x $(echo "a") ++ echo a + a
El shell ejecuta echo a
y coloca la salida en la línea de comandos. Esto es lo mismo que si hubiera intentado ejecutar esta línea de comando:
a
El shell busca un comando a
en la ruta (e incluso antes en la función, alias y listas hash), no lo encuentra y por lo tanto arroja un error.
Funciona si la salida es un comando válido:
$(echo "ls")
Comentarios
- ¿Puede decirme para qué usamos $ other y luego llamar a una variable?
- @Ashu Obviamente también se usa para la sustitución de comandos, su caso. Además aparece en computación (
echo $((1+2+3))
), creación de cadenas ($'foo\nbar'
/$"foo"
) y (menos relacionado con el shell) en las expresiones regulares quebash
entiende ([[ foo =~ ^f..$ ]]
). También se utiliza para modificar variables de varias formas:${foo#bar}
eval "$(dircolors)"
es una cosa razonable. Lo mismo ocurre con otros comandos que siguen ese patrón, como gpg-agent.$(ssh-agent)
. Buen punto.