Sortie de tuyauterie à couper
Je suis en train d'essayer d'obtenir le nom de la coquille de l'exécution d'un script.
Pourquoi ne
echo $(ps | grep $PPID) | cut -d" " -f4
travail tout en
echo ps | grep $PPID | cut -d" " -f4
ne l'est pas?
source d'informationauteur ZPS
Vous devez vous connecter pour publier un commentaire.
La raison en est que
se contente d'afficher la chaîne de
ps
; il n'a pas d'exécuter le programmeps
. La version corrigée de votre commande serait:Modifiées afin d'ajouter: paxdiablo souligne que
ps | grep $PPID
comprend un grand nombre d'espaces qui sera effondré parecho $(ps | grep $PPID)
(comme le résultat de$(...)
quand il n'est pas entre guillemets, est divisé par des espaces pour séparer les arguments, puisecho
sorties de l'ensemble de ses arguments séparés par des espaces). Pour résoudre ce problème, vous pouvez utilisertr
pour "squeeze", a répété espaces:ou vous pouvez simplement coller avec ce qu'on avait au départ. 🙂
La première ligne:
dit:
ps | grep $PPID
dans un sous-shellDe retour de la sortie, qui sera quelque chose comme ceci:
et ensuite utiliser cette sortie que le premier paramètre de l'écho - qui, dans la pratique, c'est tout simplement l'écho de la sortie
cut -d" " -f4
sur ce - qui vous donne le nom de la commande dans ce casLa deuxième commande:
dit:
ps
$PPID
- ce ne sera jamais rien, comme$PPID
contient un certain nombre, il ne sera jamaisps
. Ainsi, grep renvoie riencut -d" " -f4
à l'entrée de la commande précédente - qui n'est rien, si vous n'obtenez rienJe pense que si vous exécutez simplement
echo ps
sur son propre, vous comprendrez pourquoi votre tuyau ne fonctionne pas:Au lieu de cela, vérifiez
$0
. Note qu'il pourrait être-bash
oubash
selon si c'est un shell de connexion. (Eh bien, n'importe quel environnement, pas seulement de l'bash
-- mais le trait d'union est ajouté si le shell est un shell de connexion.)Pour de nombreuses utilisations, il est préférable de simplement nous
tr
. Par exemple:D'entrée:
echo "field1,field2,field3" | tr , \\n
Sortie:
field1
field2
field3