Это просто следствие того, как определена грамматика. Из спецификации грамматики оболочки POSIX:
command : simple_command
| compound_command
| compound_command redirect_list
| function_definition
;
И:
simple_command : cmd_prefix cmd_word cmd_suffix
| cmd_prefix cmd_word
| cmd_prefix
| cmd_name cmd_suffix
| cmd_name
;
[...]
cmd_prefix : io_redirect
| cmd_prefix io_redirect
| ASSIGNMENT_WORD
| cmd_prefix ASSIGNMENT_WORD
;
cmd_suffix : io_redirect
| cmd_suffix io_redirect
| WORD
| cmd_suffix WORD
;
Как видите, для составных команд перенаправление разрешено только после , а для простых команд оно разрешено и раньше. Итак, когда оболочка видит
, foo
обрабатывается как простая команда, а не как составная команда, а while
больше не рассматривается как ключевое слово :
.
$ < foo while
bash: while: command not found
Таким образом, do
является неожиданным, поскольку он разрешен только после определенных ключевых слов.
Таким образом, это относится не только к while
циклам, но и к большинству способов создания составных команд с использованием зарезервированных слов:
$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found
Пытаюсь добраться до точек:
TCP не работает с широковещательной рассылкой.
Вы просто не можете использовать TCP для подключения к широковещательному IP-адресу. netcat использует TCP по умолчанию, если не указано использовать UDP, и такая попытка приводит к ошибке.
Широковещательная рассылка UDP требует установки флага, но GNU netcat не справляется с этим.
Вот как работает API сокетов BSD и его расширения через setsockopt(2)
. Для возможности отправки пакета на широковещательный IPv4-адрес (для протоколов, поддерживающих широковещательную рассылку ), SO_BROADCAST
является обязательным. Иначе это вызовет ошибку. Исходники GNU netcat нигде не включают строку SO_BROADCAST
.
Таким образом, у GNU netcat нет возможности отправить широковещательную рассылку. Вы должны переключиться на другой инструмент. Либо другой вариант netcat(существует несколько вокруг ), либо используйте вместо него socat
, который имеет больше возможностей. Вот ссылка о использовании socat
с (многоадресной рассылкой и )широковещательной рассылкой . Он поддерживает наличие двух сторон с сокетом, как (, по-видимому, )туннельный режим GNU netcat.