Pourquoi “si $(ps aux | grep ...)” réussit toujours à Bash?
Pourquoi les suivantes if
instruction réussit ?
if $(ps aux | grep -q "bla bla") ; then echo "found" ; fi
- Si vos
ps aux | grep "bla bla"
vous verrez pourquoi... - Voir aussi cette question.
if pgrep -f "bla bla"; then echo "found"; fi
Vous devez vous connecter pour publier un commentaire.
Parce que le
grep
processus lui-même est retourné parps
. Vous pouvez "truc"grep
à pas de match lui-même, en entourant l'un des caractères de recherche dans une classe de caractères[ ]
qui ne modifie pas la fonctionnalité:Il suffit de ne:
Aussi, l'utilisation de processus de substitution
$()
est inutile. Leif
allons travailler sur le succès de la dernière commande dans le tuyau de la chaîne, qui est ce que vous voulez.Note: La raison pour laquelle le caractère de classe astuce fonctionne parce que les
ps
sortie a encore la classe de caractères entre crochets mais quandgrep
est le traitement de la chaîne de recherche, il utilise les crochets comme la syntaxe plutôt que d'une chaîne fixe de match.Si vous grep la sortie de
ps aux
, vous obtiendrez toujours un processus en montrant votre commande précédente. Pour résoudre ce problème, vous pouvez rediriger la sortie vers grep deux fois, une fois pour supprimer la ligne avec "grep", et de nouveau pour le processus de votre recherche.l' 'grep' processus est déjà en cours d'exécution par le ps à temps court, de sorte que la ps de sortie inclut.
Essayez d'utiliser
pgrep
à la place.pgrep est précisément pour cette raison:
if pgrep "bla bla" ; then echo "found" ; fi
La
$(
est un petit peu pertinentes, et modifie le sens un peu. Bien que dans ce cas, car il n'y a aucune sortie degrep -q
, vous pouvez tirer avec la$(
. Vous pouvez commencer avec quelque chose comme (comme souligné par d'autres):De toute façon, vous avez commencé avec
Avec
$(
, la commande à l'intérieur de la$( )
est exécutée et la sortie de cette commande est utilisée comme ligne de commande à l'extérieur pour la commande. Ces quatre expériences:Donc, en fonction de ce vous permettra de obtenir de sortie
found
si ces deux conditions sont vérifiées:$( )
créé pas de sortieCeci suggère que
ps aux | grep -q "bla bla"
a été un succès et a créé pas de sortie. Il n'est pas surprenant quegrep -q
crée pas de sortie. C'est ce que l'-q
est pour. Par conséquent, votre commande doit avoir eu un véritable statut, ce qui implique que la commande grep n'a réussi à trouver une correspondance. Nous savons quegrep
trouverez toujours un match dans ce cas, parce que la liste des processus deps
comprendragrep
lui-même; le grep trouverez toujours lui-même.Vous avez besoin de filtrer le processus qui est
grep
ping pour "bla bla":grep
, mais depuis que nous appelonsgrep -q
, il n'y a rien à filtrer. Je ne suis pas la downvote commentaires (il y a pas de vote sur cette réponse).