Почему нельзя изменить порядок оператора перенаправления ввода для циклов while?

Вы можете проверить pid, если nginx все еще работает с этой конфигурацией, в /etc/monit/conf.d/nginxвместо:

check process nginx with pidfile /var/run/nginx.pid
    start program = "/etc/init.d/nginx start"
    stop program = "/etc/init.d/nginx stop"
11
26.08.2019, 18:12
1 ответ

Это просто следствие того, как определена грамматика. Из спецификации грамматики оболочки 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
                 ;

Как видите, для составных команд перенаправление разрешено только после , а для простых команд оно разрешено и раньше. Итак, когда оболочка видит <redirection> foo, 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
16
27.01.2020, 19:58

Теги

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