Как подавить вывод команды bash

0

Я нашел этот способ проверки доступности хоста для данного порта, однако меня интересует только код состояния команды, поэтому я пытаюсь что-то вроде этого:

[CptBartender@somewhere ~]$ <dev/tcp/host/port ; echo $?
0

Это работает нормально, если я пытаюсь открыть открытый порт, однако, если я проверяю закрытый порт, я получаю:

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port ; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

Теперь моим следующим шагом было попытаться отбросить выходные данные первой команды, поэтому я попытался:

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port >/dev/null/ 2>&1; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

Тот же вывод. Мои вопросы: почему первая команда печатает какие-либо выходные данные и как мне предотвратить это?

CptBartender
источник

Ответы:

2

Это не команда, которая печатает вывод. У вас нет команды - < /dev/tcp/…это просто обычное перенаправление ввода и обрабатывается самой оболочкой.

(И не только это, но перенаправления обрабатываются слева направо, поэтому <перенаправление обрабатывается до того 2>&1, как оно было, поэтому его нельзя было перенаправить в любом случае .)

Вы можете обойти это, запустив «команду» в подоболочке. Например:

( </dev/tcp/$host/$port ) 2>/dev/null

На самом деле кажется, что в этом случае подоболочка не требуется; группа команд будет работать, даже если она находится в том же процессе - она ​​все равно заставляет сначала обрабатывать «внешние» перенаправления:

{ </dev/tcp/$host/$port; } 2>/dev/null

Примечание: /dev/tcpэто магический путь, который обрабатывается самим bash - на самом деле он не существует в Linux / dev, но может использоваться с перенаправлениями bash. Однако с этим трюком работать не будет #!/bin/sh, и есть шанс, что он не будет работать с bash на некоторых старых системах (которые раньше отключали эту функцию) или на некоторых системах, отличных от Linux.

grawity
источник
Бонус за объяснение, что команда </dev/tcp/...вообще не является командой (я точно не знала, что это было ... теперь я знаю: "ничего не делай и прими это как ввод ... о, подожди - его не существует") , Кроме того, это работает, если я просто изменяю порядок так, чтобы перенаправление ошибок было первым. В любом случае, спасибо!
CptBartender