Su shell está interpretando las citas, ambas '
y "
, incluso antes de que lleguen echo
. Generalmente pongo comillas dobles alrededor de mi argumento para hacer eco, incluso si son innecesarias; por ejemplo:
$ echo "Hello world"
Hello world
Entonces, en su primer ejemplo, si desea incluir comillas literales en su salida, es necesario que escapen:
$ echo \'Hello world\'
'Hello world'
O ya deben usarse dentro de un argumento citado (pero no puede ser el mismo tipo de cita, o tendrá que escapar de todos modos):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
En su segundo ejemplo, está ejecutando una sustitución de comando en el medio de la cadena:
grep $ARG /var/tmp/setfile | awk {print $2}
Las cosas que comienzan $
también se manejan especialmente por el shell: las trata como variables y las reemplaza por sus valores. Como lo más probable es que ninguna de esas variables esté configurada en su shell, en realidad solo se ejecuta
grep /var/tmp/setfile | awk {print}
Como grep
solo ve un argumento, asume que ese argumento es el patrón que está buscando, y que el lugar desde el que debe leer los datos es stdin, por lo que bloquea la espera de entrada. Es por eso que su segundo comando parece simplemente colgarse.
Esto no sucederá si cita el argumento con comillas simples (es por eso que su primer ejemplo casi funcionó), por lo que esta es una forma de obtener el resultado que desea:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
También puede ponerlo entre comillas dobles, pero luego necesitará escapar de la $
s para que el shell no los resuelva como variables, y los backticks para que el shell no ejecute la sustitución del comando de inmediato:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"