Разделитель между списком команд и}

На странице руководства sudoers

User_List ::= User |
              User ',' User_List

User ::= '!'* user name |
         '!'* #uid |
         '!'* %group |
         '!'* %#gid |
         '!'* +netgroup |
         '!'* %:nonunix_group |
         '!'* %:#nonunix_gid |
         '!'* User_Alias

просто используйте (группа со странным названием):

%stupiduser HOSTS_HERE = /usr/bin/su - stupid

3
17.02.2019, 04:04
2 ответа
  1. Ожидает закрытия } . Вы вошли в список с одной командой, date} и новой строкой, поэтому вы все еще находитесь внутри группы команд и можете либо добавить другую команду в список, либо завершить его.

    Таким образом, он не ждет стандартного ввода (точно), он ждет, пока вы завершите команду, которую вы запустили в первой строке. Если вы введете здесь } , вы (вероятно) получите сообщение об ошибке от команды date о том, что она не понимает "} ".

  2. { и } - допустимые аргументы для общих команд, как показано в пункте 1. Например, find использует {} в качестве аргумента. .

    В частности, только слова « {» и «} » являются зарезервированными словами . Зарезервированные слова в оболочке имеют значение только тогда, когда они даны как отдельное слово целиком и только там, где они конкретно ожидаются. Наиболее важное место, где они ожидаются, - это начало команды.

    Точка с запятой или новая строка означает, что } появляется в начале следующей команды в списке, где его можно распознать как зарезервированное слово с учетом его особой обработки.Это указано в POSIX для грамматики оболочки :

    Это правило также подразумевает, что зарезервированные слова не распознаются, за исключением определенных позиций во входных данных, например, после или <точка с запятой> ; грамматика предполагает, что если зарезервированное слово предназначено, оно правильно разграничено пользователем

    . Было бы неприятно, если бы «then», другое зарезервированное слово, нельзя было использовать как обычное слово, так что в основном это имеет смысл. ( и ) , напротив, являются операторами, могут появляться где угодно, и их нужно экранировать, если они используются для своих буквальных значений. По сути, это исторический артефакт, и, возможно, будет сделан более последовательный выбор в том или ином направлении, или, возможно, потребуется более сложный синтаксический анализатор.


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

Существует выбор, поддерживать ли историческую совместимость в крайнем случае или нет, и некоторые другие оболочки, такие как zsh, имеют более умные синтаксические анализаторы и могут работать с {date} в том смысле, который вы намеревались .

5
20.08.2021, 12:12
  1. Он ждет, пока вы завершите команду. То же самое происходит, если вы напишете неполную команду if или while или другие:

    $ if date
    >
    
  2. Команда четко определена в руководстве: { list; } является составной командой:

    Составные команды

    { list; } список должен быть завершен новой строкой или точкой с запятой.

    Там четко указано: "завершается новой строкой или точкой с запятой"

1
20.08.2021, 12:12

Теги

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