Что означает правило «это не указано, является ли это ASSIGNMENT_WORD или WORD »в грамматике оболочки POSIX

sudo по умолчанию сбрасывает вашу среду, поэтому поиск в вашем $ PATH не выполняется. Возможно, он пытается запустить версию ruby ​​ по умолчанию вместо указанной. В частности, $ PATH , который видит sudo , указан в вашем файле sudoers :

secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Попробуйте использовать sudo -E , чтобы сохранить ваш среды или используйте полный путь к ruby ​​, или добавьте пути к secure_path перед указанными.

2
05.08.2016, 10:53
2 ответа

Здесь говорится, что:

  • foo = bar - это слово назначения
  • = foo - это слово
  • «foo» = bar или foo.bar = baz может быть либо словом , либо словом назначения , POSIX не дает вам никаких гарантий в любом случае, поэтому вам не следует ' т использовать это.
  • , похоже, подразумевается, что "foo = bar" (с кавычками) также не определено, что предполагает, что вы не можете вызывать (переносимо) команду с = в ее name (кроме использования cmd = foo = bar; "$ cmd" ... ), что, на мой взгляд, является ошибкой в ​​спецификации, поскольку ни одна из известных мне командных интерпретаторов не обрабатывает слово только процитировано = s как задание.

В неуказанных случаях он говорит, что должно произойти одно из этих двух , потому что он не оставляет другого выбора, кроме маркера, распознаваемого как WORD или _ASSIGNMENT_WORD_.

Это только описание этапа токенизации.

Затем, согласно грамматику, если это WORD , то это будет имя команды.Оболочка может вернуть ошибку, если соответствующая команда не найдена.

Если это ASSIGNMENT_WORD , оболочка все равно может вернуть ошибку, если не может назначить переменную с таким именем.

На практике вы обнаружите, что некоторые оболочки позволяют: Stéphane = 1 или foo.bar = baz в качестве присваивания, некоторые - нет и будут рассматривать их как команду имена. Некоторые оболочки будут рассматривать их как неудачное назначение.

1
27.01.2020, 21:59

Нет: не указано , какой из двух нормальных результатов будет возвращен. Поскольку он не указан, реализация может генерировать ошибку (поскольку в спецификации не упоминается , что должно произойти , просто подразумевается, что есть только два варианта), но в спецификации нет говорят, что одно из этих двух должно произойти. Это просто не сказано.

Этот тип формулировок используется в случаях, когда кто-то имеет в виду (возможно, гипотетическую) реализацию, которая может отличаться от других реализаций, и нет консенсуса по исключению ее из стандарта.

Термин находится в 1.5 Терминология :

unspecified

Описывает природу значения или поведения, не указанного в POSIX.1-2008, которое является результатом использования допустимой программной конструкции или действительного ввод данных.

Значение или поведение могут отличаться в зависимости от реализаций, соответствующих POSIX.1-2008. Приложение не должно полагаться на существование или действительность значения или поведения. Приложение, которое полагается на какое-либо конкретное значение или поведение, не может быть гарантированно переносимо между соответствующими реализациями.

Он менее специфичен, чем реализация, определенная :

Описывает значение или поведение, которое не определено в POSIX.1-2008 , но выбирается разработчиком . Значение или поведение могут отличаться в зависимости от реализаций, соответствующих POSIX.1-2008. Приложение не должно полагаться на наличие значения или поведения.Приложение, которое полагается на такое значение или поведение, не может гарантировать переносимость между соответствующими реализациями.

3
27.01.2020, 21:59

Теги

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