Ukrywanie wyjścia polecenia

31

Mam skrypt, w którym sprawdza, czy pakiet jest zainstalowany, czy nie i czy port 8080 jest używany przez określony proces, czy nie. W ogóle nie mam doświadczenia z bash, więc zrobiłem coś takiego:

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...

Jednak po uruchomieniu skryptu otrzymuję zarówno dane wyjściowe, jak dpkg -s net-toolsi dane netstat -tlpn | grep 8080 | grep javawyjściowe w terminalu, i nie chcę tego, w jaki sposób mogę ukryć dane wyjściowe i po prostu trzymać się wyniku ifs?

Czy jest też bardziej elegancki sposób na robienie tego, co robię? Czy istnieje bardziej elegancki sposób, aby dowiedzieć się, jaki proces wykorzystuje port 8080 (nie tylko jeśli jest używany), jeśli taki istnieje?

dabadaba
źródło

Odpowiedzi:

53

Aby ukryć wyjście dowolnego polecenia zwykle stdouti stderrzostaje przekierowany do /dev/null.

command > /dev/null 2>&1

Wyjaśnienie:

1 command > /dev/null.: przekierowuje wyjście command(stdout) do /dev/null
2 2>&1.: przekierowuje stderrdo stdout, więc błędy (jeśli występują) również trafiają do/dev/null

Uwaga

&>/dev/null: przekierowuje zarówno do, jak stdouti stderrdo /dev/null. można go użyć jako alternatywy dla/dev/null 2>&1

Cichygrep : grep -q "string"dopasuj sznurek cicho lub cicho, bez niczego do standardowego wyjścia. Można go również użyć do ukrycia danych wyjściowych.

W twoim przypadku możesz użyć go w następujący sposób,

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

Tutaj warunki zostaną sprawdzone tak jak wcześniej, ale nie będzie żadnych wyników.

Odpowiedz na komentarz :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Przekierowuje wyjście podniesione grep javapo drugim potoku. Ale wiadomość, którą otrzymujesz netstat -tlpn. Rozwiązaniem jest użycie drugiego ifjako,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
souravc
źródło
1
Można również wspomnieć grep -q, a nowsze bash &> ...jako synonim> ... 2>&1
steeldriver
dziękuję, że ulepszyłem skrypt. Ale wciąż pojawia się komunikat, że niektórych procesów nie można pokazać, ponieważ nie są wykonywane jako root. Tak się dzieje z netstat. Czy jest jakiś sposób, żeby to ukryć?
dabadaba
1

lsof -i :<portnumnber> powinien być w stanie zrobić coś zgodnie z tym, czego chcesz.

Tim
źródło
przepraszam, zapomniałem dodać prawdziwe pytanie do postu, sprawdź ponownie, proszę, ponieważ odpowiadasz tylko na pytania „wtórne”
dabadaba
czy jest też sposób, w jaki mógłbym wyodrębnić nazwę procesu / PID z wyjścia tego polecenia?
dabadaba
Innym sposobem na zrobienie tego samego jest fuser -n tcp 8080wyprowadzenie danych wyjściowych.
fkraiem
0

Chociaż opróżnianie danych wyjściowych /dev/nulljest prawdopodobnie najłatwiejszym sposobem, czasami /dev/nullma ustawione uprawnienia do plików, aby użytkownik inny niż root nie mógł tam opróżnić danych wyjściowych. Więc innym sposobem na zrobienie tego jest:

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

Ta podwójna grepkonfiguracja znajduje w nich pasujące linie, abca ponieważ -ojest ustawiona TYLKO abcjest drukowana i tylko z tego powodu -m 1. Następnie dane wyjściowe, które są albo puste, albo abcsą wysyłane do grep, aby znaleźć tylko te części łańcucha, które pasują, 123a ponieważ ostatnie polecenie wyświetla tylko abcpuste ciąg, zwracany jest ciąg. Mam nadzieję, że to pomaga!

BoomBoomPowe
źródło