O que set
comando sem argumentos faz?
Como posso ver, ela imprime minhas variáveis de ambiente, exatamente como o env
comando, mas em ordem alfabética. Além disso, imprime algumas informações diferentes (variáveis? Funções?) Como:
__git_printf_supports_v=yes
__grub_script_check_program=grub-script-check
...
quote ()
{
local quoted=${1//\'/\'\\\'\'};
printf "'%s'" "$quoted"
}
quote_readline ()
{
local quoted;
_quote_readline_by_ref "$1" ret;
printf %s "$ret"
}
O que é e de onde vem?
Não consigo encontrar informações sobre o set
comando sem argumentos. Na verdade, eu não tenho nenhuma man
página set
na minha distribuição Linux.
Respostas:
set
é um shell interno que exibe todas as variáveis do shell, não apenas as do ambiente, e também as funções do shell, que é o que você está vendo no final da lista.As variáveis são exibidas com uma sintaxe que permite que sejam definidas quando as linhas são executadas ou originadas.
Na
bash
página do manual :Em conchas diferentes, o comportamento não é necessariamente o mesmo; por exemplo,
ksh
set
não exibe funções shell.fonte
ksh
ocorre porque não armazena a definição de função na variável shell.Como
set
tem saída ewhich set
não retorna nada, você sabe que faz parte do shell que está usando, provavelmente o bash.O man bash menciona isso muitas vezes, mas é mais fácil vincular na documentação on - line .
set tem a especificação de chamada de:
Então, se você quiser encontrá-lo no man na linha de comando, você pode pesquisar com
fonte
which set
depende do seu shell. Pelo menoszsh
o reportará para você. Você também pode ler isso para mais detalhes.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
ezsh
emsh
, aksh
emulação não está apenas imprimindo o erro, mas também configurando opções válidas. Enquantoyash
parar de definir opções na primeira opção inválida,zsh
atribuirá todas elas. Emyash
:f
ex
apresentará em$-
, enquanto:f
presente apenas em$-
. Em ambos os casos,f
ex
apresentará em$-
comzsh
emsh
eksh
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+
: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 desmarcadosx
ev
opções (excetoposh
), e atribuirão qualquer coisa a seguir-
a parâmetros posicionais: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 desativav
e asx
opções.A única exceção de shell POSIX é
yash
, que trata-
como o primeiro parâmetro posicional:Schily nem faz nada se estiver
-
presente nos argumentos:fonte
set -- $unset
,set - $unset
,set $unset
, eset "$unset"
e assim por diante - é geralmente essas discrepâncias que levar as pessoas para esse tipo de problema em primeiro lugar.$unset
.set $unset
atuará exatamente igual aoset
de uma variável não definida . Masset "$unset"
fará anotando, seunset
é realmente uma variável não definida. Aset - $unset
remove as opções-v
e-x
define (no bash).unset_var
. E também observe que,set "$unset"
na verdade, está definido$1
como vazio. Isso é sobre expansão de shell, não estritamenteset
, então eu não mencionei isso.posh
eyash
são diferentes quando-
aparecem. Você pode ler o meu atualizado (e fique à vontade para melhorá-lo).Se você estiver trabalhando dentro de um shell bash, digite
help set
.No final da ajuda impressa, leia:
Portanto, a no argument
set
imprime todas as variáveis conhecidas pelo shell.fonte
set -x; set
seria útil