La prima riga:
echo $(ps | grep $PPID) | cut -d" " -f4
dice:
- Esegui
ps | grep $PPIDin una sotto-shell -
Restituisce l'output, che sarà qualcosa del genere:
3559 pts/1 00:00:00 bashe quindi usa quell'output come primo parametro di echo - che, in pratica, significa semplicemente echo l'output
- Quindi esegui
cut -d" " -f4su quello - che ti dà il nome del comando in questo caso
Il secondo comando:
echo ps | grep $PPID | cut -d" " -f4
dice:
- Echo stringa
ps - Grep quella stringa per
$PPID- questo non restituirà mai nulla, come$PPIDcontiene un numero, quindi non sarà maips. Pertanto, grep non restituisce nulla - Esegui
cut -d" " -f4con l'input del comando precedente - che non è niente, quindi non ottieni niente
Il motivo è che
echo ps
stampa semplicemente la stringa ps; non esegue il programma ps . La versione corretta del tuo comando sarebbe:
ps | grep $PPID | cut -d" " -f4
Modificato per aggiungere: paxdiablo sottolinea che ps | grep $PPID include molti spazi bianchi che verranno compressi da echo $(ps | grep $PPID) (poiché il risultato di $(...) , quando non è tra virgolette, è diviso da spazi bianchi in argomenti separati, e poi echo emette tutti i suoi argomenti separati da spazi). Per risolvere questo problema, puoi utilizzare tr per "comprimere" spazi ripetuti:
ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
oppure puoi semplicemente attenerti a ciò che dovevi iniziare. :-)