У меня есть скрипт, где он проверяет, установлен ли пакет или нет, и используется ли порт 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
, и я не хочу этого, как я могу скрыть вывод и просто придерживаться результата 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 thing
else
echo "your message"
fi
Здесь, если условия будут проверены, как это было прежде, но не будет никакого вывода.
Ответ на комментарий:
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
lsof -i :<portnumnber>
должен смочь сделать что-то вроде того, что Вы хотите.
При сбрасывании вывода к /dev/null
вероятно, самый легкий путь, иногда /dev/null
установили полномочия файла так, чтобы некорневой не мог сбросить вывод там. Так, другой некорневой способ сделать это
command | grep -m 1 -o "abc" | grep -o "123"
Это удваивается -grep
установка находит согласующие отрезки длинной линии с abc
в них и с тех пор -o
установлен ТОЛЬКО abc
печатается и только однажды из-за -m 1
. Затем вывод, который или пуст или abc
отправляется в grep для нахождения только частей строки, которые соответствуют 123
и начиная с последней команды только выводы abc
пустая строка возвращается. Надежда, которая помогает!