У меня есть скрипт, в котором он проверяет, установлен ли пакет или нет, и используется ли порт 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 fielse 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 (не только если он используется), если таковой имеется?
Чтобы скрыть вывод любой команды, обычно используется 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 thingelse 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
При сбросе выходного сигнала на /dev/null это, наверное, самый простой способ, иногда /dev/null имеет права доступа к файлам, установленные таким образом, чтобы некорневой пользователь не мог сбросить там выходные данные. Итак, еще один некорневой способ сделать это - это
command | grep -m 1 -o "abc" | grep -o "123"
Этот двойной-grep программа установки находит соответствующие строки с помощью abc в них и с тех пор -o устанавливается ТОЛЬКО abc печатается и только один раз из-за -m 1. Затем вывод, который является либо пустым, либо abc отправляется в grep, чтобы найти только те части строки, которые соответствуют 123 и поскольку последняя команда выводит только abc возвращается пустая строка. Надеюсь, это поможет!