set
é um shell embutido , usado para definir e desmarcar opções de shell e parâmetros posicionais.
Sem argumentos, set
imprimirá todas as variáveis do shell (variáveis de ambiente e variáveis na sessão atual) classificadas no código do idioma atual .
Você também pode ler a documentação do bash .
Há algumas ressalvas.
set "$var"
atribuirá var
valor a $1
. Se $var
iniciar com -
ou +
, o $var
conteúdo será tratado como sequências de opções de shell. Se $var
houver opções inválidas, a maioria dos shells POSIX imprimirá o erro. yash
e zsh
em sh
, a ksh
emulação não está apenas imprimindo o erro, mas também configurando opções válidas. Enquanto yash
parar de definir opções na primeira opção inválida, zsh
atribuirá todas elas. Em yash
:
var=-fxd; set "$var"
f
e x
apresentará em $-
, enquanto:
var=fdx; set "$var"
f
presente apenas em $-
. Em ambos os casos, f
e x
apresentará em $-
com zsh
em sh
e ksh
emulação.
Para protegê-lo dessa situação, você pode passar --
como o primeiro argumento para definir o parâmetro posicional, mesmo que comece com -
ou +
:
var=-fdx; set -- "$var"
será atribuído $var
a $1
, independentemente do seu conteúdo.
set --
sem mais argumentos, todos os parâmetros posicionais serão desativados.
Se o primeiro argumento for -
, o comportamento não é especificado. Todos os shells POSIX conhecidos serão desmarcados x
e v
opções (exceto posh
), e atribuirão qualquer coisa a seguir -
a parâmetros posicionais:
set -xv - -f
atribuirá -f
a $1
. set -
também não desabilitou os parâmetros posicionais. Schily osh também se comporta assim. A herança não desativa v
e as x
opções.
A única exceção de shell POSIX é yash
, que trata -
como o primeiro parâmetro posicional:
$ yash -c 'set -xv - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
+ printf %s\n - -f
-
-f
+ printf %s\n cvx
cvx
Schily nem faz nada se estiver -
presente nos argumentos:
$ schily-sh -c 'set -v - -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
<blank line>
s
$ schily-sh -c 'set -v -- -f; printf "%s\n" "$@"; printf "%s\n" "$-"'
-f
vs