Seu shell está interpretando as cotações, '
e "
, antes mesmo de chegarem a echo
. Eu geralmente apenas coloco aspas duplas em torno do meu argumento para ecoar, mesmo que sejam desnecessárias; por exemplo:
$ echo "Hello world"
Hello world
Assim, no seu primeiro exemplo, se você quiser incluir marcas de aspas literais em sua saída, elas precisam ser escapadas:
$ echo \'Hello world\'
'Hello world'
Ou eles precisam ser usados em um argumento já citado (mas não pode ser o mesmo tipo de citação, ou você precisará escapar dele de qualquer forma):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
No seu segundo exemplo, você está executando uma substituição de comando no meio da string:
grep $ARG /var/tmp/setfile | awk {print $2}
As coisas que começam com $
também são tratadas especialmente pelo shell - ele as trata como variáveis e as substitui por seus valores. Como provavelmente nenhuma dessas variáveis está configurada no seu shell, ela simplesmente roda
grep /var/tmp/setfile | awk {print}
Como grep
só vê um argumento, ele assume que o argumento é o padrão que você está procurando e que o local para o qual ele deve ler dados é stdin, portanto ele bloqueia a espera pela entrada. É por isso que seu segundo comando parece apenas travar.
Isso não acontecerá se você citar o argumento com uma só letra (e é por isso que seu primeiro exemplo quase funcionou), portanto, essa é uma maneira de obter a saída desejada:
echo \'' echo PARAM=' grep $ARG /var/tmp/setfile | awk '{print $2}' ' '\'
Você também pode citar duas vezes, mas você precisará escapar do $
s para que o shell não as resolva como variáveis, e os backticks para que o shell não execute a substituição de comando imediatamente :
echo "' echo PARAM=\' grep \$ARG /var/tmp/setfile | awk '{print \}' \' '"