Ausgabe eines Befehls verbergen

31

Ich habe ein Skript, in dem überprüft wird, ob ein Paket installiert ist oder nicht und ob der Port 8080 von einem bestimmten Prozess verwendet wird oder nicht. Ich habe überhaupt keine Erfahrung mit Bash, also habe ich so etwas gemacht:

if dpkg -s net-tools; then
    if  netstat -tlpn | grep 8080 | grep java; then
        echo "Shut down server before executing this script"
        exit
    fi
else
    echo "If the server is running please shut it down before continuing with the execution of this script"
fi

# the rest of the script...

Wenn das Skript ausgeführt wird, werden jedoch sowohl die dpkg -s net-toolsals auch die netstat -tlpn | grep 8080 | grep javaAusgaben im Terminal angezeigt, und das möchte ich nicht. Wie kann ich die Ausgabe ausblenden und mich nur an das Ergebnis des ifs halten?

Gibt es auch eine elegantere Möglichkeit, das zu tun, was ich tue? Und gibt es eine elegantere Methode, um festzustellen, welcher Prozess den Port 8080 verwendet (nicht nur, wenn er verwendet wird), falls vorhanden?

Dabadaba
quelle

Antworten:

53

Um die Ausgabe eines Befehls auszublenden, werden in der Regel die stdoutund stderrumgeleitet /dev/null.

command > /dev/null 2>&1

Erläuterung:

1 command > /dev/null.: Leitet die Ausgabe von command(stdout) zu /dev/null
2 2>&1.: Leitet stderrzu um stdout, sodass Fehler (falls vorhanden) auch zu gehen/dev/null

Hinweis

&>/dev/null: leitet beide stdoutund stderrzu um /dev/null. man kann es als Alternative verwenden/dev/null 2>&1

Lautlosgrep : grep -q "string"Passen Sie die Zeichenfolge lautlos oder leise an die Standardausgabe an. Es kann auch verwendet werden, um die Ausgabe auszublenden.

In Ihrem Fall können Sie es wie folgt verwenden:

if dpkg -s net-tools > /dev/null 2>&1; then
    if  netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1; then
    #rest thing
else
    echo "your message"
fi

Hier werden die if-Bedingungen wie bisher geprüft, es erfolgt jedoch keine Ausgabe.

Antwort auf den Kommentar :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Es leitet die Ausgabe um, die grep javanach der zweiten Pipe angehoben wurde . Aber die Botschaft, aus der Sie kommen netstat -tlpn. Die Lösung ist ifals zweites verwenden ,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
souravc
quelle
1
Sie könnten auch erwähnen grep -q, und die neuere Bash &> ...als Synonym für> ... 2>&1
Steeldriver
Danke, das hat das Drehbuch verbessert. Ich erhalte jedoch weiterhin die Meldung, dass einige Prozesse nicht angezeigt werden können, da sie nicht als root ausgeführt werden. Das passiert mit netstat. Kann ich das auch verstecken?
Dabadaba
1

lsof -i :<portnumnber> sollte in der Lage sein, etwas nach Ihren Wünschen zu tun.

Tim
quelle
Es tut mir leid, dass ich vergessen habe, die eigentliche Frage zum Beitrag hinzuzufügen. Bitte überprüfen Sie sie erneut, da Sie nur die "sekundären" Fragen beantworten
dabadaba,
Gibt es auch eine Möglichkeit, den Prozessnamen / die PID aus der Ausgabe dieses Befehls zu extrahieren?
Dabadaba
Eine andere Möglichkeit, dasselbe zu tun, besteht darin fuser -n tcp 8080, deren Ausgabe möglicherweise einfacher zu analysieren ist.
fkraiem
0

Während das Leeren der Ausgabe auf /dev/nullwahrscheinlich die einfachste Methode ist, sind manchmal /dev/nullDateiberechtigungen festgelegt, sodass Nicht-Root-Benutzer die Ausgabe dort nicht leeren können. Ein anderer Weg, der nicht auf Root basiert, ist der von

command | grep -m 1 -o "abc" | grep -o "123"

Dieses Doppel- grepSetup findet die übereinstimmenden Zeilen mit abcin ihnen und da -oNUR gesetzt abcist, wird gedruckt und nur einmal wegen -m 1. Dann wird die Ausgabe, die entweder leer ist oder abcan grep gesendet wird, um nur die Teile der Zeichenfolge zu finden, die übereinstimmen, 123und da der letzte Befehl nur abcdie leere Zeichenfolge ausgibt, zurückgegeben. Hoffentlich hilft das!

BoomBoomPowe
quelle