La tua shell sta interpretando le virgolette, entrambe '
e "
, prima ancora che arrivino echo
. In genere metto solo doppie virgolette intorno al mio argomento, anche se non sono necessarie; per esempio:
$ echo "Hello world"
Hello world
Quindi nel tuo primo esempio, se vuoi includere virgolette letterali nel tuo output, entrambi devono essere sfuggiti:
$ echo \'Hello world\'
'Hello world'
Oppure devono essere già utilizzati all'interno di un argomento citato (ma non può essere lo stesso tipo di citazione, o dovrai comunque scappare):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
Nel tuo secondo esempio, stai eseguendo una sostituzione di comando nel mezzo della stringa:
grep $ARG /var/tmp/setfile | awk {print $2}
Le cose che iniziano con $
sono anche gestite appositamente dalla shell: le tratta come variabili e le sostituisce con i loro valori. Poiché molto probabilmente nessuna di queste variabili è impostata nella shell, in realtà viene eseguita
grep /var/tmp/setfile | awk {print}
Dal momento grep
che vede solo un argomento, presuppone che l'argomento sia il modello che stai cercando e che il posto in cui dovrebbe leggere i dati sia stdin, quindi blocca in attesa di input. Ecco perché il tuo secondo comando sembra bloccarsi.
Questo non accadrà se citi una volta l'argomento (motivo per cui il tuo primo esempio ha quasi funzionato), quindi questo è un modo per ottenere l'output che desideri:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Puoi anche fare una doppia virgoletta, ma dovrai sfuggire alle $
s in modo che la shell non le risolva come variabili e le backtick in modo che la shell non esegua subito la sostituzione dei comandi:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"