La prima riga:
echo $(ps | grep $PPID) | cut -d" " -f4
dice:
- Esegui
ps | grep $PPID
in una sotto-shell -
Restituisce l'output, che sarà qualcosa del genere:
3559 pts/1 00:00:00 bash
e quindi usa quell'output come primo parametro di echo - che, in pratica, significa semplicemente echo l'output
- Quindi esegui
cut -d" " -f4
su 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$PPID
contiene un numero, quindi non sarà maips
. Pertanto, grep non restituisce nulla - Esegui
cut -d" " -f4
con 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. :-)