Ocultar salida de un comando

31

Tengo un script donde comprueba si un paquete está instalado o no y si el puerto 8080 está siendo utilizado por un proceso en particular o no. No tengo experiencia con bash, así que hice algo como esto:

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

Sin embargo, cuando se ejecuta el script, obtengo tanto las salidas dpkg -s net-toolscomo las netstat -tlpn | grep 8080 | grep javasalidas en el terminal, y no quiero eso, ¿cómo puedo ocultar la salida y simplemente seguir con el resultado de la ifs?

Además, ¿hay una forma más elegante de hacer lo que estoy haciendo? ¿Y hay una manera más elegante de saber qué proceso está usando el puerto 8080 (no solo si se está usando), si lo hay?

dabadaba
fuente

Respuestas:

53

Para ocultar la salida de cualquier comando por lo general el stdouty stderrson redirigidos a /dev/null.

command > /dev/null 2>&1

Explicación:

1 command > /dev/null.: redirige la salida de command(stdout) a /dev/null
2 2>&1.: redirige stderra stdout, por lo que los errores (si los hay) también van a/dev/null

Nota

&>/dev/null: redirige tanto a stdoutcomo stderra /dev/null. uno puede usarlo como una alternativa de/dev/null 2>&1

Silenciosogrep : grep -q "string"empareja la cadena de forma silenciosa o silenciosa sin nada con la salida estándar. También se puede usar para ocultar la salida.

En su caso, puede usarlo como,

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

Aquí se comprobarán las condiciones if como estaban antes pero no habrá salida.

Responder al comentario :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Está redirigiendo la salida generada grep javadespués de la segunda tubería. Pero el mensaje que estás recibiendo netstat -tlpn. La solución es usar el segundo ifcomo,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
souravc
fuente
1
También podría mencionar grep -q, y la nueva fiesta &> ...como sinónimo de> ... 2>&1
steeldriver
gracias, eso mejoró el guión. Pero aún recibo un mensaje que dice que algunos procesos no se pueden mostrar ya que no se está ejecutando como root. Esto pasa con netstat. ¿Hay alguna forma de que yo pueda ocultar eso también?
Dabadaba
1

lsof -i :<portnumnber> debería poder hacer algo similar a lo que quieres.

Tim
fuente
lo siento, olvidé agregar la pregunta real a la publicación, compruébalo nuevamente, porque tu respuesta es solo para las preguntas "secundarias"
dabadaba
¿también hay alguna manera de que pueda extraer el nombre del proceso / PID de la salida de ese comando?
dabadaba
Otra forma de hacer lo mismo es fuser -n tcp 8080, cuya salida puede ser más fácil de analizar.
fkraiem
0

Si bien el vaciado de la salida /dev/nulles probablemente la forma más fácil, a veces /dev/nulltiene permisos de archivo establecidos para que no root no pueda vaciar la salida allí. Entonces, otra forma no raíz de hacer esto es mediante

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

Esta grepconfiguración doble encuentra las líneas que coinciden con abcellas y, dado que -ose establece SOLO, abcse imprime y solo una vez debido a -m 1. Luego, la salida que está vacía o abcse envía a grep para encontrar solo las partes de la cadena que coinciden 123y, dado que el último comando solo genera abcla cadena vacía, se devuelve. ¡Espero que ayude!

BoomBoomPowe
fuente