O que o comando set sem argumentos faz?

16

O que o comando set sem argumentos faz?

Como posso ver, imprime minhas variáveis de ambiente como o comando env , mas em ordem alfabética. E ainda 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 comando set sem argumentos. Na verdade eu não tenho man page para set na minha distribuição Linux.

    
por Aleksandr Kovalev 15.01.2016 / 18:55

4 respostas

13

set é um shell embutido 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.

De bash página de manual :

If no options or arguments are supplied, set displays the names and values of all shell variables and functions, sorted according to the current locale, in a format that may be reused as input for setting or resetting the currently-set variables.

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

    
por 15.01.2016 / 19:03
3

Porque set tem saída e which set não retorna nada, você sabe que é parte do shell que você está usando, provavelmente bash.

homem bash menciona isso muitas vezes, mas é mais fácil vincular no documentação online .

This builtin is so complicated that it deserves its own section. set allows you to change the values of shell options and set the positional parameters, or to display the names and values of shell variables.

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 homem na linha de comando você pode procurar com

/set.*abef
    
por 15.01.2016 / 19:14
3

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
    
por 15.01.2016 / 19:03
2

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

No final da ajuda impressa, leia:

If no ARGs are given, all shell variables are printed.

Portanto, nenhum argumento set imprime todas as variáveis conhecidas no shell.

    
por 16.01.2016 / 01:20

Tags