O que o comando set sem argumentos faz?

22

O que setcomando sem argumentos faz?

Como posso ver, ela imprime minhas variáveis ​​de ambiente, exatamente como o envcomando, 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 setcomando sem argumentos. Na verdade, eu não tenho nenhuma manpágina setna minha distribuição Linux.

Aleksandr Kovalev
fonte
1
"Este edifício é tão complicado que merece uma seção própria". Veja os documentos
galath

Respostas:

17

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 :

Se nenhuma opção ou argumento for fornecido, set exibirá os nomes e valores de todas as variáveis ​​e funções do shell, classificadas de acordo com o código de idioma atual, em um formato que pode ser reutilizado como entrada para definir ou redefinir as variáveis ​​definidas no momento.

Em conchas diferentes, o comportamento não é necessariamente o mesmo; por exemplo, ksh setnão exibe funções shell.

jlliagre
fonte
3
Isso kshocorre porque não armazena a definição de função na variável shell.
cuonglm
2
@cuonglm Uma decisão sábia de design feita pela dgk! ;-)
jlliagre 15/01
7

Como settem saída e which setnã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 .

Esse recurso é tão complicado que merece sua própria seção. set permite alterar os valores das opções do shell e definir os parâmetros posicionais ou exibir os nomes e valores das variáveis ​​do shell.

set tem a especificação de chamada de:

set [--abefhkmnptuvxBCEHPT] [-o option-name] [argument …]
set [+abefhkmnptuvxBCEHPT] [+o option-name] [argument …]

Então, se você quiser encontrá-lo no man na linha de comando, você pode pesquisar com

/set.*abef
user1133275
fonte
which setdepende do seu shell. Pelo menos zsho reportará para você. Você também pode ler isso para mais detalhes.
cuonglm
É improvável que a questão seja sobre bash, pois possui um grande domínio de mercado, e qualquer pessoa que use o shell não padrão não precisará fazer essa pergunta.
precisa saber é o seguinte
6

seté um shell embutido , usado para definir e desmarcar opções de shell e parâmetros posicionais.

Sem argumentos, setimprimirá 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á varvalor a $1. Se $variniciar com -ou +, o $varconteúdo será tratado como sequências de opções de shell. Se $varhouver opções inválidas, a maioria dos shells POSIX imprimirá o erro. yashe zshem sh, a kshemulação não está apenas imprimindo o erro, mas também configurando opções válidas. Enquanto yashparar de definir opções na primeira opção inválida, zshatribuirá todas elas. Em yash:

var=-fxd; set "$var"

fe xapresentará em $-, enquanto:

var=fdx; set "$var"

fpresente apenas em $-. Em ambos os casos, fe xapresentará em $-com zshem she kshemulaçã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 $vara $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 xe vopções (exceto posh), e atribuirão qualquer coisa a seguir -a parâmetros posicionais:

set -xv - -f

atribuirá -fa $1. set -também não desabilitou os parâmetros posicionais. Schily osh também se comporta assim. A herança não desativa ve as xopçõ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
cuonglm
fonte
Eu nunca entendo por que as pessoas conectar-se a qualquer lugar, mas o primeiro ... você gostaria de mencionar a diferença entre set -- $unset, set - $unset, set $unset, e set "$unset"e assim por diante - é geralmente essas discrepâncias que levar as pessoas para esse tipo de problema em primeiro lugar.
precisa saber é
@ mikeserv: Bem, adicionei mais detalhes, mas não entendi o que você quer dizer quando usado $unset.
precisa saber é
@cuonglm O comando set $unsetatuará exatamente igual ao setde uma variável não definida . Mas set "$unset" fará anotando, se unseté realmente uma variável não definida. A set - $unsetremove as opções -ve -xdefine (no bash).
@BinaryZebra: Ah, é claro, para mim, é melhor usar unset_var. E também observe que, set "$unset"na verdade, está definido $1como vazio. Isso é sobre expansão de shell, não estritamente set, então eu não mencionei isso.
cuonglm
1
@ MikeServ: O comportamento de poshe yashsão diferentes quando -aparecem. Você pode ler o meu atualizado (e fique à vontade para melhorá-lo).
precisa saber é
2

Se você estiver trabalhando dentro de um shell bash, digite help set.

No final da ajuda impressa, leia:

Se nenhum ARG for fornecido, todas as variáveis ​​do shell serão impressas.

Portanto, a no argument setimprime todas as variáveis ​​conhecidas pelo shell.


fonte
Eu me pergunto se set -x; setseria útil
ILMostro_7