Перенаправление оболочки: <<<'foo' vs <(echo 'foo')

«Нет маршрута к хосту» означает, что ваш хост не смог понять даже, как добраться до указанного хоста. «Время ожидания соединения истекло» означает, что маршрут был найден, но удаленный хост не ответил на запрос на соединение.

Брандмауэр обычно закрывает порт двумя способами. Один из них — закрыть его -, чтобы сделать его заблокированным. Это заставит сервер активно отказываться от входящего соединения. Это, в зависимости от того, как вы тестируете, приведет к сообщениям «Нет маршрута к хосту», «Соединение закрыто внешним хостом» или аналогичным сообщениям, полученным сразу после попытки установить соединение.

Другой способ — просто игнорировать входящие запросы на порт. Заявитель никогда не получает ответа, и время запроса истекает. На некоторых языках это называется «невидимой блокировкой» порта.

1
09.08.2019, 15:34
1 ответ

<<< 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, здесь -строки, подобные здесь, -документы реализуются с помощью временных файлов вместо конвейеров ).

3
27.01.2020, 23:22

Теги

Похожие вопросы