Скрытие вывода команды

31

У меня есть скрипт, где он проверяет, установлен ли пакет или нет, и используется ли порт 8080 определенным процессом или нет. У меня нет опыта работы с Bash, поэтому я сделал что-то вроде этого:

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вывод, и вывод в терминале, и я не хочу этого, как я могу скрыть вывод и просто придерживаться результата ifs?

Кроме того, есть ли более элегантный способ сделать то, что я делаю? И есть ли более элегантный способ узнать, какой процесс использует порт 8080 (не только, если он используется), если таковой имеется?

dabadaba
источник

Ответы:

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

grepgrep -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
souravc
источник
1
Можно также упомянуть grep -qи новый bash &> ...в качестве синонима> ... 2>&1
steeldriver
спасибо, что расширило сценарий. Но я все еще получаю сообщение о том, что некоторые процессы не могут быть показаны, так как он не выполняется как root. Это происходит с netstat. Есть ли способ, которым я мог бы это тоже скрыть?
Дабадаба
1

lsof -i :<portnumnber> должен быть в состоянии сделать что-то в соответствии с тем, что вы хотите.

Тим
источник
извините, я забыл добавить реальный вопрос к сообщению, пожалуйста, проверьте его еще раз, потому что вы отвечаете только на «второстепенные» вопросы
dabadaba
также есть ли способ, которым я мог бы извлечь имя процесса / PID из вывода этой команды?
Дабадаба
Другой способ сделать то же самое fuser -n tcp 8080, чей вывод может быть легче проанализировать.
фкраием
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пустую строку, возвращается. Надеюсь, это поможет!

BoomBoomPowe
источник