La première ligne :
echo $(ps | grep $PPID) | cut -d" " -f4
dit :
- Exécuter
ps | grep $PPID
dans un sous-shell -
Renvoie la sortie - qui ressemblera à ceci :
3559 pts/1 00:00:00 bash
puis utilisez cette sortie comme premier paramètre de echo - ce qui, en pratique, signifie simplement faire écho à la sortie
- Ensuite, exécutez
cut -d" " -f4
dessus - ce qui vous donne le nom de la commande dans ce cas
La deuxième commande :
echo ps | grep $PPID | cut -d" " -f4
dit :
- Chaîne d'écho
ps
- Grep cette chaîne pour
$PPID
- cela ne retournera jamais rien, comme$PPID
contient un nombre, il ne sera donc jamaisps
. Ainsi, grep ne renvoie rien - Exécuter
cut -d" " -f4
avec l'entrée de la commande précédente - qui n'est rien, donc vous n'obtenez rien
La raison en est que
echo ps
imprime simplement la chaîne ps
; il n'exécute pas le programme ps
. La version corrigée de votre commande serait :
ps | grep $PPID | cut -d" " -f4
Modifié pour ajouter : paxdiablo signale que ps | grep $PPID
comprend beaucoup d'espaces blancs qui seront réduits par echo $(ps | grep $PPID)
(puisque le résultat de $(...)
, lorsqu'il n'est pas entre guillemets doubles, est divisé par des espaces blancs en arguments séparés, puis echo
affiche tous ses arguments séparés par des espaces). Pour résoudre ce problème, vous pouvez utiliser tr
pour "compresser" les espaces répétés :
ps | grep $PPID | tr -s ' ' | cut -d' ' -f5
ou vous pouvez simplement vous en tenir à ce que vous aviez au départ. :-)