La première ligne :
echo $(ps | grep $PPID) | cut -d" " -f4
dit :
- Exécuter
ps | grep $PPIDdans un sous-shell -
Renvoie la sortie - qui ressemblera à ceci :
3559 pts/1 00:00:00 bashpuis utilisez cette sortie comme premier paramètre de echo - ce qui, en pratique, signifie simplement faire écho à la sortie
- Ensuite, exécutez
cut -d" " -f4dessus - 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$PPIDcontient un nombre, il ne sera donc jamaisps. Ainsi, grep ne renvoie rien - Exécuter
cut -d" " -f4avec 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. :-)