Обязательна ли опция `command -v` в оболочке POSIX? Совместим с POSIX?
Я использую posh, чтобы протестировать мою оболочку script, которую я хочу успешно запустить в любой совместимой с POSIX оболочке. Выполняя это, я обнаружил, что параметр command -v
не поддерживается в шикарном режиме. Также нет type
.
Я понимаю, что type
не поддерживается, потому что POSIX не требуется. Это обсуждается в https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=397601#10.
"type" - это расширение X/Open; обратите внимание на маркировку XSI в POSIX стандарт. Поскольку это не требуется POSIX или политикой debian, шикарный не реализует его.
http://pubs.opengroup.org/onlinepubs/009695399/utilities/type.html подтверждает это. В кратком обзоре см. Код поля [XSI]
.
Но я не понимаю, почему опция command -v
не поддерживается в posh.
В некоторых упоминается, что command -v
является необязательным в https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=218530#131.
И "команда -v" является необязательной функцией в соответствии с http://www.opengroup.org/onlinepubs/009695399/utilities/просто упомянуть об этом.
Но я не могу подтвердить это на http://pubs.opengroup.org/onlinepubs/009695399/utilities/command.html. Вы можете увидеть что-нибудь здесь, что указывает, что опция -v
необязательна в command
?
Если нет, то posh
не соответствует POSIX?
Ответы
Ответ 1
Это зависит от того, с какой версией POSIX они совместимы. В материале POSIX 2004 command
есть опции -v
и -v
в необязательной части стандарта - подмножество "Переносимость пользователя".
POSIX 2008 (с поправками, внесенными в 2013 году) не обозначает какую-либо часть спецификации command
с подмножеством "Переносимость пользователя":
Сводка
command [-p] command_name [argument...]
command [-p][-v|-V] command_name
ОПИСАНИЕ
Утилита command
должна заставить оболочку обрабатывать аргументы как простую команду, подавляя поиск функции оболочки, описанный в Command Search and Execution, item 1b.
Если command_name
совпадает с именем одной из специальных встроенных утилит, специальные свойства в списке перечислений в начале специальных встроенных утилит не должны возникать. В любом другом отношении, если command_name
не является именем функции, эффект command
(без параметров) должен быть таким же, как и без command
.
Когда используется опция -v
или -v
, утилита command
должна предоставлять информацию о том, как интерпретируется интерпретацией командной оболочки оболочкой.
В версии 2008/2013 нет опциональных флагов. В старом (2004) стандарте опции -v
и -v
были частью подмножества пользовательской переносимости, а не частью ядра.
Итак, если они хотят соответствовать стандарту, которому больше десятилетия, нет необходимости в -v
или -v
; если они хотят соответствовать текущему стандарту (которому больше 5 лет), эти параметры должны поддерживаться.
Ответ 2
См. код поля [UP]
рядом с определением -v
. Per список обозначений кода маржи (выделено мной):
[UP] Пользовательская переносимость
Описанная функциональность не обязательна.
Если это применимо, утилиты помечены знаком легенды UP в разделе SYNOPSIS. Если для утилиты применяется дополнительная семантика, материал идентифицируется с использованием легенды маржи UP.
Таким образом, это черная буква POSIX: эта функция необязательна.