2017-10-15 4 views
2

Ich versuche, die Nummer eines bestimmten Prozesses in bash zu finden Verwendung, wenn die Bedingung alsBash oneliner mit Rohren und wenn die Bedingung geben Fehler

if ps auwx | grep -v grep | grep -ic python -le 2; then echo error; else echo no_error; fi 

und ich bin immer Ausgang als

grep: python: No such file or directory 

no_error

Der One-Liner scheint zu brechen, wenn ich Pipe verwende, und kein Fehler wird geworfen, wenn ich Rohr weglassen, und es spielt keine Rolle, wenn ich den absoluten Pfad zu grep entweder. Ich kann nicht das erforderliche Ergebnis erhalten ohne Rohr. Was mache ich hier falsch? Ich kann dies in einer Skriptdatei erledigen, indem ich sie in Variablen aufspalte und dann vergleiche, aber ich habe dies als Übung benutzt, um bash zu lernen. Jede Hilfe wird sehr geschätzt.

+1

Überprüfen Sie, ob 'pgrep' auf Ihrem Computer verfügbar ist. – chepner

Antwort

4

Zunächst einmal verwenden, die Syntax der if Befehl lautet:

if cmd; then 
    # cmd exited with status 0 (success) 
else 
    # cmd exited with status >0 (fail) 
fi 

Die cmd oberhalb der sogenannte ist Liste - eine Sequenz, von Pipelines. Jede Pipeline ist eine Folge von Befehlen, die durch | getrennt sind.

-le Der Operator wird nur vom test Befehl interpretiert (auch als [ bekannt oder [[), nicht durch den Befehl if.

Also, wenn Sie sagen:

if ps auwx | grep -v grep | grep -ic python -le 2; then ... fi 

Sie rufen tatsächlich grep mit Argumenten:

grep -ic python -le 2 

Und da -e verwendet wird, um das Suchmuster angeben, das Argument python wird als Dateiname interpretiert der Datei für die Suche nach Muster 2. Deshalb teilt Ihnen grep mit, dass die Datei python nicht gefunden werden kann.

Um die Ausgabe einer Befehlspipeline in if Testen des Befehls-Substitution innerhalb der [[/[/test (als die andere Antwort vorschlägt) verwenden:

if [[ $(ps auwx | grep -v grep | grep -ic python) -le 2 ]]; then ... fi 

oder innerhalb ((..)), mit impliziter arithmetische Vergleiche:

if (($(ps auwx | grep -v grep | grep -ic python) <= 2)); then ... fi 
+3

Um dies ein wenig zu erweitern: in bash scripting, context * matters *.Syntaktische Elemente, die in einem bestimmten Kontext eine Sache bedeuten (z. B. "-le" bedeutet weniger als oder gleich innen "[]" oder "[[]]") bedeuten normalerweise etwas völlig anderes in anderen Kontexten (zB nach einem 'grep') Befehl). Die Syntaxregeln in '[]' unterscheiden sich ein wenig von denen innerhalb von [[]] ', was völlig anders ist als innerhalb von' (()) ', keiner davon hat irgendetwas damit zu tun, was in' $ {} gültig ist. ', und alle der oben genannten unterscheiden sich von dem, was Sie nur alleine in einer Befehlszeile verwenden können. –

2

einen Befehl Substitution in einem Zustand

if [[ $(ps ...) -le 2 ]]; then 
+0

Danke @ Nahuel-Fouilleul, aber es gibt mir wieder einen Fehler. Ich schrieb nach deiner Antwort auf "if [[$ (ps auwx |/usr/bin/grep -v 'grep' |/usr/bin/grep -ic 'python') -le 2]]; dann echo "Fehler"; sonst echo "no_error"; fi' und es gibt mir den folgenden Fehler 'bash: Syntaxfehler in Bedingungsausdruck: unerwartetes Token'; ' Bash: Syntaxfehler in der Nähe von '; '' – file2cable

+2

sollte ein Leerzeichen sein '2]]' – RomanPerekhrest