set
é um shell embutido , usado para opções de shell definidas e não definidas 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 atual localidade .
Você também pode ler a documentação do bash .
Existem algumas ressalvas.
set "$var"
atribuirá var
valor a $1
. Se $var
começar com -
ou +
, então $var
content foi tratado como sequências de opções de shell. Se $var
contiver alguma opção inválida, a maioria das camadas POSIX irá imprimir o erro. yash
e zsh
in sh
, ksh
emulação não estão imprimindo apenas o erro, mas também definindo opções válidas. Enquanto yash
parar as opções de configuração na primeira opção inválida, zsh
atribuirá todas elas. Em yash
:
var=-fxd; set "$var"
f
e x
serão apresentados em $-
, enquanto:
var=fdx; set "$var"
apenas f
presente em $-
. Em ambos os casos, f
e x
apresentarão% em$-
com zsh
em sh
e ksh
emulação.
Para proteger você dessa situação, você pode transmitir --
como o primeiro argumento para definir o parâmetro posicional, mesmo que comece com -
ou +
:
var=-fdx; set -- "$var"
atribuirá $var
a $1
, independentemente do seu conteúdo.
set --
sem quaisquer argumentos adicionais não definirá todos os parâmetros posicionais.
Se o primeiro argumento for -
, o comportamento não será especificado. Todas as shells POSIX conhecidas irão cancelar as opções x
e v
(exceto posh
) e atribuir qualquer coisa após -
aos parâmetros posicionais:
set -xv - -f
atribuirá -f
a $1
. set -
também não definiu os parâmetros posicionais. Schily osh também se comportam assim. O Heirloom sh não desativa as opções v
e x
.
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 sh mesmo não fazendo nada se -
apresentar 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