Nascondere l'output di un comando


31

Ho uno script in cui controlla se un pacchetto è installato o meno e se la porta 8080 viene utilizzata o meno da un determinato processo. Non ho alcuna esperienza con bash, quindi ho fatto qualcosa del genere:

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

Tuttavia quando lo script viene eseguito ottengo sia l' output che dpkg -s net-toolsl' netstat -tlpn | grep 8080 | grep javaoutput nel terminale, e non lo voglio, come posso nascondere l'output e attenermi al risultato di ifs?

Inoltre, c'è un modo più elegante per fare quello che sto facendo? Esiste un modo più elegante per sapere quale processo sta utilizzando la porta 8080 (non solo se viene utilizzata), se presente?

Risposte:


53

Per nascondere l'output di qualsiasi comando di solito la stdoute stderrvengono reindirizzati a /dev/null.

command > /dev/null 2>&1

Spiegazione:

1 command > /dev/null.: reindirizza l'output di command(stdout) su /dev/null
2 2>&1.: reindirizza stderra stdout, quindi anche gli errori (se presenti) vanno a/dev/null

Nota

&>/dev/null: reindirizza sia a stdoutche stderra /dev/null. si può usare come alternativa/dev/null 2>&1

Silenziosogrep : grep -q "string"abbina la stringa silenziosamente o silenziosamente senza nulla allo standard output. Può anche essere usato per nascondere l'output.

Nel tuo caso, puoi usarlo come,

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

Qui le condizioni if ​​verranno controllate com'era prima ma non ci sarà alcun output.

Rispondi al commento :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Reindirizza l'output generato grep javadopo il secondo pipe. Ma il messaggio da cui ricevi netstat -tlpn. La soluzione è seconda ifcome,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then

1
Potresti anche menzionare grep -q, e il nuovo bash &> ...come sinonimo di> ... 2>&1
steeldriver,

grazie, questo ha rafforzato la sceneggiatura. Ma ricevo ancora un messaggio che dice che alcuni processi non possono essere mostrati poiché non vengono eseguiti come root. Questo succede con netstat. C'è un modo per nascondere anche quello?
Dabadaba,

1

lsof -i :<portnumnber> dovrebbe essere in grado di fare qualcosa sulla falsariga di ciò che desideri.


scusate ho dimenticato di aggiungere la vera domanda al post, controllate per favore perché la vostra risposta è solo per le domande "secondarie"
dabadaba

inoltre c'è un modo per estrarre il nome del processo / PID dall'output di quel comando?
Dabadaba,

Un altro modo di fare la stessa cosa è il fuser -n tcp 8080cui output potrebbe essere più semplice da analizzare.
fkraiem,

0

Mentre svuotare l'output /dev/nullè probabilmente il modo più semplice, a volte /dev/nullsono impostate le autorizzazioni per i file in modo che non root possa svuotare l'output lì. Quindi, un altro modo non root per farlo è quello di

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

Questa doppia grepconfigurazione trova le righe corrispondenti con abcin esse e poiché -oè impostata SOLO abcviene stampata e solo una volta a causa di -m 1. Quindi l'output che è vuoto o abcviene inviato a grep per trovare solo le parti della stringa che corrispondono 123e poiché l'ultimo comando restituisce solo abcla stringa vuota viene restituita. Spero che sia d'aiuto!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.