web-dev-qa-db-fra.com

Masquer la sortie d'une commande

J'ai un script qui vérifie si un paquet est installé ou non et si le port 8080 est utilisé par un processus particulier ou non. Je n'ai aucune expérience de 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é, les sorties dpkg -s net-tools et netstat -tlpn | grep 8080 | grep Java sont affichées dans le terminal. Je ne veux pas cela. Comment puis-je masquer la sortie et me contenter du résultat de ifs?

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

27
dabadaba

Pour masquer la sortie d'une commande, généralement stdout et 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: redirige stderr vers stdout, de sorte que les erreurs (le cas échéant) vont également à /dev/null

Note

&>/dev/null: redirige stdout et stderr vers /dev/null. on peut l'utiliser comme alternative à /dev/null 2>&1

Silent grep: grep -q "string" fait correspondre la chaîne de manière silencieuse ou silencieuse 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 aucune sortie.

Répondre au commentaire:

netstat -tlpn | grep 8080 | grep Java > /dev/null 2>&1: Il redirige la sortie issue de grep Java après le deuxième canal. Mais le message que vous recevez de netstat -tlpn. La solution est d'utiliser le second if comme,

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

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

1
Tim

Bien que vider la sortie dans /dev/null soit probablement le moyen le plus simple, parfois, /dev/null dispose d'autorisations de fichier afin que les utilisateurs non root ne puissent pas y vider la sortie. Donc, une autre façon non root de faire cela est de

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

Cette configuration double -grep trouve les lignes correspondantes avec abc dans celles-ci et puisque -o est défini UNIQUEMENT, abc est imprimé et une seule fois à cause de -m 1. Ensuite, la sortie vide ou abc est envoyée à grep pour ne rechercher que les parties de la chaîne qui correspondent à 123 et, comme la dernière commande génère uniquement abc, la chaîne vide est renvoyée. J'espère que cela pourra aider!

0
BoomBoomPowe