První řádek:
echo $(ps | grep $PPID) | cut -d" " -f4
říká:
- Spustit
ps | grep $PPID
v podskořápce -
Vraťte výstup – který bude vypadat nějak takto:
3559 pts/1 00:00:00 bash
a poté použijte tento výstup jako první parametr echo - což v praxi znamená pouze echo výstupu
- Potom spusťte
cut -d" " -f4
na tom - což vám v tomto případě poskytne název příkazu
Druhý příkaz:
echo ps | grep $PPID | cut -d" " -f4
říká:
- Řetězec ozvěny
ps
- Uchopte tento řetězec pro
$PPID
- toto nikdy nic nevrátí, jako$PPID
obsahuje číslo, takže nikdy nebudeps
. Proto grep nic nevrací - Spustit
cut -d" " -f4
se vstupem předchozího příkazu - což je nic, takže nedostanete nic
Důvodem je, že
echo ps
pouze vytiskne řetězec ps
; nespustí program ps
. Opravená verze vašeho příkazu by byla:
ps | grep $PPID | cut -d" " -f4
Upraveno za účelem přidání: paxdiablo poukazuje na to, že ps | grep $PPID
obsahuje mnoho mezer, které se sbalí o echo $(ps | grep $PPID)
(od výsledku $(...)
, pokud není ve dvojitých uvozovkách, je rozdělen mezerami na samostatné argumenty a poté echo
vypíše všechny své argumenty oddělené mezerami). K vyřešení tohoto problému můžete použít tr
pro "zmáčknutí" opakovaných mezer:
ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
nebo můžete zůstat u toho, s čím jste museli začít. :-)