62 votes

Cacher la sortie d'une commande

J'ai un script où il vérifie si un paquet 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 ceci :

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 le dpkg -s net-tools et le netstat -tlpn | grep 8080 | grep java dans le terminal, ce que je ne veux pas. Comment puis-je masquer la sortie et m'en tenir au résultat de l'opération ? if s ?

Par ailleurs, existe-t-il un moyen plus élégant de faire ce que je fais ? Et y a-t-il un moyen plus élégant de savoir ce que utilise le port 8080 (et pas seulement s'il est utilisé), le cas échéant ?

122voto

sourav c. Points 40637

Pour masquer la sortie de n'importe quelle commande, généralement le stdout y stderr sont 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 : redirections stderr a stdout Les erreurs (s'il y en a) sont donc également attribuées à /dev/null

Note

&>/dev/null : redirige les deux stdout y stderr a /dev/null . on peut l'utiliser comme une alternative de /dev/null 2>&1

Silencieux grep : grep -q "string" correspond à la chaîne de caractères silencieusement ou silencieusement sans rien sur la sortie standard. Elle peut aussi être utilisée pour cacher la sortie.

Dans votre cas, vous pouvez l'utiliser comme suit,

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éponse à la commentaire :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1 : Il redirige la sortie générée par grep java après le deuxième tuyau. Mais le message que vous obtenez de netstat -tlpn . La solution est d'utiliser le deuxième if comme,

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

2voto

Tim Points 30349

lsof -i :<portnumnber> devrait être capable de faire quelque chose qui ressemble à ce que vous voulez.

2voto

MichK Points 549

Pendant que la sortie vers /dev/null est probablement le moyen le plus simple, parfois /dev/null a des permissions de fichiers définies de telle sorte qu'un non-root ne puisse pas y vider la sortie. Donc, une autre façon de le faire pour les non-roots est de

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

Ce double- grep setup trouve les lignes correspondantes avec abc en eux et depuis -o est réglé UNIQUEMENT abc est imprimé et seulement une fois à cause de -m 1 . Ensuite, la sortie qui est soit vide, soit abc est envoyé à grep pour trouver seulement les parties de la chaîne qui correspondent à 123 et puisque la dernière commande ne fait que sortir abc la chaîne vide est renvoyée. J'espère que cela vous aidera !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X