Разница между использованием - и - как параметров для установки при настройке позиционных параметров - PullRequest
3 голосов
/ 01 июля 2011

В man bash упоминается, что set имеет два варианта - и --

Мне было интересно, есть ли какая-либо разница при использовании - и -- в качестве параметров для set при настройке позиционных параметров.

Я не смог найти какой-либо большой разницы, упомянутой в man bash, когда дело доходит до их использования при настройке позиционных параметров.

Ответы [ 4 ]

8 голосов
/ 01 июля 2011

Вы используете -- (двойной минус), чтобы указать конец параметров оболочки и начало аргументов.Следовательно, например:

set -- -a -b -f somefile

После этого $1 равно -a, $2 равно -b, $3 равно -f и $4 равно somefile.

Без -- оболочка интерпретирует -a, -b и -f как параметры оболочки и установит $1 в somefile.

The Bash (4.1) В инструкции написано (из set):

-- Если после этой опции нет аргументов, тогда позиционные параметры не устанавливаются.В противном случае позиционные параметры устанавливаются в качестве аргументов, даже если некоторые из них начинаются с '-'.

- Сигнализируют об окончании опций, поэтому все оставшиеся аргументы назначаются позиционномупараметры.Опции '-x' и '-v' отключены.Если аргументов нет, позиционные параметры остаются без изменений.

2 голосов
/ 02 июля 2011

Страница руководства bash (1) для 4.1.5 (1) сообщает:

--      If no arguments follow this option, then the  positional
        parameters are unset.  Otherwise, the positional parame‐
        ters are set to the args, even if  some  of  them  begin
        with a -.
-       Signal  the  end of options, cause all remaining args to
        be assigned to the positional parameters.  The -x and -v
        options are turned off.  If there are no args, the posi‐
        tional parameters remain unchanged.

Первое различие заключается в том, что после - или -- нет аргументов. Для первых существующие позиционные параметры будут неизменными. Для последнего, позиционные параметры будут очищены.

Таким образом, set -- очищает позиционные параметры, а set - является запретом.

Настройки -v и -x могут быть изменены с помощью set - .... Итак, если вы включили set -v (что приводит к тому, что оболочка печатает строки ввода при их чтении), она будет отключена командой set - .... set -- ... оставит это без изменений.

set -x встречается чаще, чем set -v, поскольку set -x часто используется для отладки сценариев, чтобы точно узнать, какие команды выполняются. Довольно часто при отладке сценария оболочки вы запускаете его с bash -x <script>. Зная, что set - ... отключает -x, вы, вероятно, захотите использовать set -- ..., поскольку было бы совершенно неожиданно отключить -x в качестве побочного эффекта другой команды.

2 голосов
/ 01 июля 2011

Соглашение заключается в использовании одного - для однобуквенных аргументов, например, -i и двойное -- для их полного варианта, например --interactive.

См. здесь для получения дополнительной информации.

На этот вопрос очень хорошо ответили в другом месте в сети StackExchange.

UPDATE

Двойной тире -- ставит префикс длинных (дословно) опций к командам, но при использовании со встроенной функцией Bash (например, set) это означает конец опций этой конкретной команды.

например. если вы хотите создать файл, начинающийся с тире:

touch -dashed

... вы получите ошибку:

touch: illegal option -- h
usage: touch [-acfm] [-r file] [-t [[CC]YY]MMDDhhmm[.SS]] file ...

Однако попробуйте это с --, et voila:

touch -- -dashed

... а затем ls, чтобы увидеть -dashed в вашем текущем каталоге.

См. здесь для получения дополнительной информации.

1 голос
/ 01 июля 2011

На моей bash странице руководства есть предложение: An argument of - is equivalent to --.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...