POSIX гарантирует, что стандартные утилиты находятся в PATH?


11

В разделе «Поиск и выполнение команд» в спецификации POSIX указывается, что PATHвыполняется поиск при поиске утилиты для выполнения (с некоторыми исключениями). Упоминает ли спецификация где-нибудь, что PATHбудет инициализировано значением, которое гарантирует, что будут найдены все стандартные утилиты?

Или мне нужно сделать что-то вроде следующего, чтобы гарантировать, что я никогда не получу ошибку «команда не найдена» при попытке запустить стандартную утилиту?

PATH=$(command -p sh -c 'printf %s "${PATH}"')

(см. спецификацию commandутилиты POSIX )

Ответы:


13

Да и нет. В среде POSIX утилиты должны вести себя так, как описано в спецификации. На практике это означает, что соответствующие версии утилит должны присутствовать в $PATH. Однако при запуске вашей программы в POSIX-совместимой системе вы можете запускать ее в несоответствующей среде. На практике часто случается, что ОС имеет устаревший режим и режим POSIX и по умолчанию находится в устаревшем режиме. Хуже, чем отсутствие некоторых команд, унаследованный режим имеет тенденцию к несовместимости, например, варианты с различными значениями.

Вы можете получить товар PATHс getconf. Конечно, это сложно, так как getconfв оригинале $PATHможет быть не тот. Использование приложений для команды показывает способ сделать это:

command -p getconf PATH

Насколько я понимаю спецификацию, в этом нет необходимости, если вы запускаете свою программу в POSIX-совместимой среде; и если вы не запускаете свою программу в POSIX-совместимой среде, POSIX не применяется. Тем не менее, использование этого приложения можно принять за рекомендацию: если это не сработает, вы можете посчитать своим разработчиком право жаловаться на то, что все, что он делает в отношении буквы спецификации POSIX, не соответствует его духу.


Хех, я даже не заметил этого getconf PATHв разделе использования приложения. Спасибо!
Ричард Хансен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.