Ответ 1
Ответ на вопрос "Что назначает Posix" уже присутствует в OP. Но важная особенность стандарта Posix не выделяется: параметр -c
не принимает аргумент.
Вы можете увидеть это в Сводке:
sh -c [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]...
command_string [command_name [argument...]]
То, что делает флаг -c
, является причиной того, что позиционные параметры ( "операнды" ) интерпретируются по-другому. Без -c
они интерпретируются как [command_file [argument...]]
:
sh [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]...
[command_file [argument...]]
Это, кстати, почему sh -c+x
является ошибкой. Если -c
принял аргумент, тогда было бы законным включать аргумент в одно и то же слово.
Итак, чтобы ответить на более конкретные вопросы:
-
Posix говорит: "Один дефис рассматривается как первый операнд, а затем игнорируется...". Это относится к
-
сразу после-c
?A: Да, это так.
-c
- это полная опция, поэтому-
является операндом. Напротив,-
в-o -
не будет рассматриваться как операнд. (Это будет рассматриваться как недопустимое имя опции.) -
Какой из них прав, Dash/ Bash или FreeBSD?
A: В этом случае Dash и Bash являются Posix-совместимыми, а FreeBSD sh - нет. Оболочка FreeBSD значительно предшествует текущей спецификации Posix, и я не верю, что она когда-либо утверждала, что она полностью соответствует любой спецификации Posix.
-
Как можно с помощью
sh
использовать командуsh
для запуска команды, имя которой начинается с+
?A: Я бы подумал, что в любой оболочке будет работать следующее:
sh -c " +x"
" +x"
не будет распознаваться как опция, поскольку он не начинается с+
или-
, аsh -c
заставляет операнд разбираться как команду оболочки, поэтому ведущие пробелы будут игнорироваться, У меня нет копии FreeBSDash
, чтобы играть с этого момента, поэтому я приветствую исправления.Или вы можете использовать простую составную команду:
sh -c "{ +x; }"
Возможно, самый ясный (при условии, что используемая оболочка реализует встроенный в Posix встроенный
command
):sh -c "command +x"