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