Masquer la sortie d'une commande

31

J'ai un script où il vérifie si un package est installé ou non et si le port 8080 est utilisé par un processus particulier ou non. Je ne suis pas du tout expérimenté avec bash, alors j'ai fait quelque chose comme ça:

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

Cependant, lorsque le script est exécuté, j'obtiens à la fois les sorties dpkg -s net-toolset les netstat -tlpn | grep 8080 | grep javasorties dans le terminal, et je ne le veux pas, comment puis-je masquer la sortie et simplement m'en tenir au résultat du ifs?

Existe-t-il également une manière plus élégante de faire ce que je fais? Et existe-t-il un moyen plus élégant de savoir quel processus utilise le port 8080 (pas seulement s'il est utilisé), le cas échéant?

dabadaba
la source

Réponses:

53

Pour masquer la sortie de n'importe quelle commande, le stdoutet stderrsont généralement redirigés vers /dev/null.

command > /dev/null 2>&1

Explication:

1 command > /dev/null.: redirige la sortie de command(stdout) vers /dev/null
2 2>&1.: redirige stderrvers stdout, donc les erreurs (le cas échéant) vont également à/dev/null

Remarque

&>/dev/null: redirige les deux stdoutet stderrvers /dev/null. on peut l'utiliser comme une alternative de/dev/null 2>&1

Silencieuxgrep : faitesgrep -q "string" correspondre la chaîne silencieusement ou silencieusement sans rien à la sortie standard. Il peut également être utilisé pour masquer la sortie.

Dans votre cas, vous pouvez l'utiliser comme,

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

Ici, les conditions if seront vérifiées comme avant, mais il n'y aura pas de sortie.

Répondre au commentaire :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Il redirige la sortie augmentée grep javaaprès le deuxième tube. Mais le message que vous recevez netstat -tlpn. La solution est d'utiliser en second lieu if,

if  [[ `netstat -tlpn | grep 8080 | grep java` ]] &>/dev/null; then
souravc
la source
1
Vous pouvez également mentionner grep -q, et le nouveau bash &> ...comme synonyme de> ... 2>&1
steeldriver
merci, qui a amélioré le script. Mais je reçois toujours un message disant que certains processus ne peuvent pas être affichés car ils ne sont pas exécutés en tant que root. Cela se produit avec netstat. Y a-t-il un moyen de cacher ça aussi?
dabadaba
1

lsof -i :<portnumnber> devrait être capable de faire quelque chose dans le sens de ce que vous voulez.

Tim
la source
désolé d'avoir oublié d'ajouter la vraie question au message, vérifiez-le s'il vous plaît car vous répondez uniquement aux questions "secondaires"
dabadaba
existe-t-il également un moyen d'extraire le nom du processus / PID de la sortie de cette commande?
dabadaba
Une autre façon de faire la même chose est fuser -n tcp 8080dont la sortie peut être plus facile à analyser.
fkraiem
0

Bien que le vidage de la sortie vers /dev/nullsoit probablement le moyen le plus simple, /dev/nulldes autorisations de fichier sont parfois définies pour que les non-root ne puissent pas vider la sortie à cet endroit. Donc, une autre façon non root de le faire est de

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

Cette double grepconfiguration trouve les lignes correspondantes avec abcet puisqu'elle -oest définie, UNIQUEMENT abcest imprimé et une seule fois à cause de -m 1. Ensuite, la sortie qui est soit vide soit abcenvoyée à grep pour trouver uniquement les parties de la chaîne qui correspondent 123et puisque la dernière commande ne produit que abcla chaîne vide est retournée. J'espère que ça t'as aidé!

BoomBoomPowe
la source