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
перед указанными.
Здесь говорится, что:
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.5 Терминология :
unspecified
Описывает природу значения или поведения, не указанного в POSIX.1-2008, которое является результатом использования допустимой программной конструкции или действительного ввод данных.
Значение или поведение могут отличаться в зависимости от реализаций, соответствующих POSIX.1-2008. Приложение не должно полагаться на существование или действительность значения или поведения. Приложение, которое полагается на какое-либо конкретное значение или поведение, не может быть гарантированно переносимо между соответствующими реализациями.
Он менее специфичен, чем реализация, определенная :
Описывает значение или поведение, которое не определено в POSIX.1-2008 , но выбирается разработчиком . Значение или поведение могут отличаться в зависимости от реализаций, соответствующих POSIX.1-2008. Приложение не должно полагаться на наличие значения или поведения.Приложение, которое полагается на такое значение или поведение, не может гарантировать переносимость между соответствующими реализациями.