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

  • OTOH, eval "$(dircolors)" es una cosa razonable. Lo mismo ocurre con otros comandos que siguen ese patrón, como gpg-agent.
  • @derobert Yes, y $(ssh-agent). Buen punto.

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 que bash entiende ([[ foo =~ ^f..$ ]]). También se utiliza para modificar variables de varias formas: ${foo#bar}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *