A diferença entre --
e -
é que quando -
é usado, as opções -x
e -v
também não são definidas.
$ set -vx
$ echo "$-"
himvxBHs # The options -v and -x are set.
$ set - a b c
$ echo "$- <> $@" # The -x and -v options are turned off.
himBHs <> a b c
Essa é a maneira usual em que os shells aceitam o -
, no entanto, no POSIX, essa opção é "não especificada":
If the first argument is '-', the results are unspecified.
A diferença entre set --
e plain set
é bastante comumente usada.
Está claramente explicado no manual:
-- If no arguments follow this option, then the positional parameters are unset. Otherwise, the positional parameters are set to the args, even if some of them begin with a -.
O sinal - o "fim das opções" e qualquer argumento que se segue mesmo que comece com um - será usado como um argumento posicional.
$ set -- -a -b -e -f arg1
$ echo "$@"
-a -b -e -f arg1
Em vez disso:
$ set -a -b -e -f arg1
$ echo "$@"
arg1
Mas também algumas opções de shell foram alteradas.
Não usar nenhum de - ou - permitirá a configuração de opções de conjunto com variáveis que se expandem para nomes de opções (mesmo que citadas):
$ echo "$-"
himBHs
$ a='-f'
$ set "$a"
$ echo "$-"
fhimBHs