Приховування виводу команди


31

У мене є сценарій, де він перевіряє, встановлений чи ні пакет, і чи використовується порт 8080 певним процесом чи ні. Я зовсім не досвідчений з басом, тому я зробив щось подібне:

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

Однак при виконанні сценарію я отримую обидва dpkg -s net-toolsі на netstat -tlpn | grep 8080 | grep javaвиходах в терміналі, і я не хочу , щоб, як я можу приховати вихід і просто дотримуватися результаті ifз?

Також, чи є більш елегантний спосіб робити те, що я роблю? І чи є більш елегантний спосіб дізнатися, який процес використовує порт 8080 (не лише якщо він використовується), якщо він є?

Відповіді:


53

Щоб приховати вихід будь-якої команди, зазвичай, stdoutі stderrпереспрямовано на /dev/null.

command > /dev/null 2>&1

Пояснення:

1 command > /dev/null.: перенаправляє висновок command(stdout) на /dev/null
2 2>&1.: перенаправляє stderrна stdout, тому помилки (якщо такі є) також переходять до/dev/null

Примітка

&>/dev/null: переспрямовує і на, stdoutі stderrна /dev/null. можна використовувати його як альтернативу/dev/null 2>&1

Безшумноgrep : grep -q "string"відповідати рядок тихо або тихо, без нічого, до стандартного виводу. Він також може бути використаний для приховування результатів.

У вашому випадку ви можете використовувати його як

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

Тут умови if будуть перевірені, як це було раніше, але вихід не буде.

Відповідь на коментар :

netstat -tlpn | grep 8080 | grep java > /dev/null 2>&1: Це перенаправлення виходу, піднятого grep javaпісля другої труби. Але повідомлення, яке ви отримуєте netstat -tlpn. Розчин використовується друге ifяк,

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

1
Можна також згадати grep -qі новіший баш &> ...як синонім> ... 2>&1
steeldriver

дякую, що покращили сценарій. Але я все одно отримую повідомлення про те, що деякі процеси не можуть бути показані, оскільки вони не виконуються як root. Це відбувається з netstat. Чи є якийсь спосіб, що я міг би це також приховати?
dabadaba

1

lsof -i :<portnumnber> повинні вміти робити щось відповідно до того, що ви хочете.


вибачте, що я забув додати справжнє запитання до публікації, перевірте це agin будь ласка, тому що ви відповідаєте лише на "вторинні" питання
dabadaba

також чи я можу я витягти ім'я процесу / PID з виводу цієї команди?
дабадаба

Ще один спосіб зробити те ж саме fuser -n tcp 8080, чий вихід може бути простішим для розбору.
fkraiem

0

Під час передачі виводу на /dev/null, мабуть, найпростіший спосіб, іноді /dev/nullвстановлюються дозволи для файлів, щоб не-root не міг обробляти висновки там. Отже, ще один некорінний спосіб зробити це шляхом

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

Це подвійне grepналаштування знаходить відповідні рядки з abcними, і оскільки -oвстановлено ТОЛЬКО abc, друкується та лише один раз через -m 1. Тоді вихід, який або порожній, або abcвідправляється grep, щоб знайти лише ті частини рядка, які відповідають, 123і оскільки остання команда виводить abcлише порожню рядок, повертається. Сподіваюся, що це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.