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 if
s?
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?
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
lsof -i :<portnumnber>
devrait pouvoir faire quelque chose dans le sens de ce que vous voulez.
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!