Когда и как был двойной тире (-) представлен как конец разделителя опций в Unix/Linux?

Хорошо, давайте попробуем так или иначе с информацией Вы, если моя ставка - Вы, поражает проблему политики SELinux.

Как проверить, включен ли SELinux?

[root@ragnarok ~]# getenforce  
Enforcing

Если осуществление возвратов команды, Ваша система работает с включенным SELinux, если это так, давайте попытаемся поместить его на режим Permissive и видеть, уходит ли Ваша проблема.

Как изменить режим SELinux на Разрешающий?

[root@ragnarok ~]# setenforce 0
[root@ragnarok ~]# getenforce 
Permissive

Это будет работать, пока Вы не перезагрузите, поэтому теперь пора попытаться запустить Ваш провальный сервис.

Если мы удачливы, и это добилось цели, Вы могли бы поражать следующую ошибку/опечатки:

https://bugzilla.redhat.com/show_bug.cgi? id=809746

Вы могли свериться с командами, обеспеченными генератором отчетов ошибки, и видеть, является ли результатами то же. Если это имело бы место, кажется, что это было зафиксировано в восходящем направлении с июня, и Вы, возможно, должны были бы обновить свою систему или ожидать, пока CentOS не применяет фиксацию.

Возвратитесь к нам со своими результатами.

49
30.07.2014, 00:56
1 ответ

Насколько я могу судить, использование -- в качестве маркера конца опций начинается с sh и getopt в System III Unix (1980).

Согласно этой истории семейства Bourne Shell , Bourne Shell впервые появился в версии 7 Unix (1979). Но в ней не было возможности для установить в отдельные опции из аргументов . Так оригинальный оболочка Борна могла сделать:

  • set -e - включить режим exit-on-error
  • set arg1 arg2 ... - устанавливает параметры позиционирования $1=arg1, $2=arg2 и др.

Но: - установка arg1 -e arg2 даст вам $1=arg1, $2=arg2, и включит выход-on-error. Упс.

Система III Unix (1980) исправила эту ошибку и ввела getopt. Согласно getopt man page:

NAME
   getopt - parse command options

SYNOPSIS
   set -- `getopt optstring $∗`

DESCRIPTION
   Getopt is used to break up options in command lines for easy parsing by
   shell procedures, and to check  for  legal  options.   Optstring  is  a
   string  of  recognized  option letters (see getopt(3C)); if a letter is
   followed by a colon, the option is expected to have an  argument  which
   may or may not be separated from it by white space.  The special option
   -- is used to delimit the end of the options.  Getopt will place --  in
   the  arguments  at  the  end  of  the  options, or recognize it if used
   explicitly.  The shell arguments ($1 $2 . . .) are reset so  that  each
   option  is  preceded  by a - and in its own shell argument; each option
   argument is also in its own shell argument.

Насколько я могу судить, это первое место, где оно появляется.

Отсюда кажется, что другие команды приняли конвенцию -- для разрешения неоднозначности при разборе аргументов (например, примеры с touch и rm, которые вы цитируете выше) на протяжении всех диких, без исключения, дней 1980-х годов.

Некоторые из этих фрагментарных усыновлений были кодифицированы в POSIX.1 (1988), откуда взялся комментарий в changelog о "POSIX-required kludge".

Но только после POSIX.2 (1992) были приняты Utility Syntax Guidelines, в котором содержится знаменитый руководящий принцип 10:

Guideline 10:    The argument "--" should be accepted as a delimiter
                 indicating the end of options.  Any following
                 arguments should be treated as operands, even if they
                 begin with the '-' character.  The "--" argument
                 should not be used as an option or as an operand.

, и именно здесь он переходит от "kludge" к универсальной рекомендации.

38
27.01.2020, 19:34

Теги

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