«Нет маршрута к хосту» означает, что ваш хост не смог понять даже, как добраться до указанного хоста. «Время ожидания соединения истекло» означает, что маршрут был найден, но удаленный хост не ответил на запрос на соединение.
Брандмауэр обычно закрывает порт двумя способами. Один из них — закрыть его -, чтобы сделать его заблокированным. Это заставит сервер активно отказываться от входящего соединения. Это, в зависимости от того, как вы тестируете, приведет к сообщениям «Нет маршрута к хосту», «Соединение закрыто внешним хостом» или аналогичным сообщениям, полученным сразу после попытки установить соединение.
Другой способ — просто игнорировать входящие запросы на порт. Заявитель никогда не получает ответа, и время запроса истекает. На некоторых языках это называется «невидимой блокировкой» порта.
<<< text
является перенаправлением, если влияет на файловые дескрипторы команды (здесь 0, но 4<<< text
вместо этого повлияет на fd 4 ).
В то время как <(...)
является расширением/заменой, а не перенаправлением. Это расширяется до имени файла. Это влияет на аргументы, передаваемые команде, если они вставлены туда.
cat <(echo test)
Запускает cat
с файлом типа /dev/fd/12
в качестве аргумента. И как это случилось также с его fd 12, открытым на считывающем конце трубы. cat
не будет читать из своего fd 12, но когда он откроет файл /dev/fd/12
, он получит новый fd (, может быть 3 ), который указывает на тот же канал, что и fd 12.
Тем временем echo test
выполняется в фоновом режиме с его fd 1, подключенным к записывающему концу того же канала, поэтому echo
и cat
в конечном итоге будут подключены через этот канал (, несмотря на установление этого соединения. канал гораздо более запутанный, чем сecho text | cat
).
cat <<< text
Запускает cat без аргументов и с открытым fd 0 для чтения удаленного временного файла, содержащего test\n
.
zsh интерпретирует
<<< test
как
$NULLCMD <<< test
($NULLCMD
обычноcat
)как это происходит всякий раз, когда вы запускаете что-то только с перенаправлениями (, за исключением случаев, когда есть только одно <
перенаправление, и в этом случае$READNULLCMD
(обычно вместо этого используется пейджер ))).
В:
<(echo text)
Нет перенаправления, только одна подстановка процесса, которая расширяется до одного аргумента /dev/fd/12. Так что это просит оболочку выполнить этот файл.
В zsh нет реальной пользы от использования:
cat <(echo test)
cat < <(echo test)
над
echo test | cat
Вы видите эту конструкцию в других оболочках, таких как bash, в таких вещах, как:
IFS= read -r var < <(echo text)
, но это потому, что в этих оболочках echo text | IFS= read -r var
не будет работать, потому что read
запускается в дочернем процессе. В zsh
это не так.
Замена процесса полезна для команд, которые принимают ввод только через имя файла в качестве аргумента (, а не через стандартный ввод ), когда вам нужно передать более одного ввода в команду (есть только один стандартный ввод )как в diff <(cmd1) <(cmd2)
.
Одно различие в zsh
между cmd1 | cmd2
и cmd2 < <(cmd1)
заключается в том, что в последнем zsh
не ожидает cmd1
. В то время как он ожидает cmd1
и cmd2
в cmd1 | cmd2
(, хотя бы для того, чтобы сделать обе статуи выхода доступными в $pipestatus
. Сравните sleep 1 | uname
с uname < <(sleep 1)
.
cmd <<< foo
может быть полезно, когда cmd
нужно иметь возможность поиска во входных данных (, потому что в zsh
, здесь -строки, подобные здесь, -документы реализуются с помощью временных файлов вместо конвейеров ).