Resultado anômalo usando o comando bash “set”

2

Quando alguém emite o comando set sem argumentos em um prompt do bash (o que deve gerar uma lista de variáveis do shell e seus valores), um script de 8.274 linhas passa por. Examinar este script mostra que são instruções para o shell para executar comandos - e parece que ele executa scripts python, tornando-o essencialmente um kludge de proporções monstruosas. Eu vi outras pessoas se comportando de algumas maneiras

Nenhuma saída:

Me:~$ wait
Me:~$ true
Me:~$ test

Um erro, sem dica de uso:

Me:~$ select
bash: syntax error near unexpected token 'newline'

Um erro, com sugestão de uso:

Me:~$ source
bash: source: filename argument required
source: usage: source filename [arguments]
Me:~$ return
bash: return: can only 'return' from a function or sourced script

Estou tendo problemas para entender por que set se comporta dessa maneira. Parece indocumentado, e eu não estava realmente esperando por isso. Estou preocupado com o porquê disso acontecer. Alguém pode explicar?

    
por Eric Weir 19.02.2012 / 22:08

3 respostas

4

Essas 8k linhas são principalmente funções de conclusão do pacote bash-completion. Na minha antiga área de trabalho, o bash usa quase um segundo para ler e definir todas essas funções, a maioria das quais eu nunca uso, então eu desabilito isso.

Para desativá-lo, edite seu ~ / .bashrc, localize essas três linhas perto do final e coloque um # em cada uma das linhas.

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Na próxima vez que você executar uma sessão bash interativa, set produzirá somente cerca de 50 a 100 linhas; principalmente variáveis de ambiente e variáveis especiais de shell.

    
por geirha 20.02.2012 / 07:07
1

De link :

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.

A mesma documentação, mas com alguns exemplos, pode ser encontrada em: link , e o comando help set fornece um resumo dessa informação.

Portanto, o comportamento que você descreve é de fato correto. Concordo que seria bom se houvesse uma opção --help ; geralmente quando todos os man set , apropos set , which set e whatis set não forem úteis, tentarei transmitir --help como uma opção. Isso evita que um comando seja executado com resultados inesperados, pois isso me dará uma mensagem de ajuda ou acionará um erro. Neste caso:

$ set --help
bash: set: --: invalid option
set: usage: set [-abefhkmnptuvxBCHP] [-o option-name] [--] [arg ...]

Acho esse truque um útil à prova de falhas.

Devo salientar que os primeiros resultados do Google para o "bash set" levaram-me a esta documentação.

    
por K. P. MacGregor 19.02.2012 / 22:43
0

Tente executar set | more e assista perto da parte inferior da primeira tela. Você provavelmente verá algo assim:

SSH_CLIENT='XXX.XXX.XXX.XXX 54284 22'
SSH_CONNECTION='XXX.XXX.XXX.XXX 54284 68.232.126.14 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=114
USER=XXXXXXX
XDG_SESSION_COOKIE=740274408c1d635200f7415f00000009-1329686026.470247-1256968508
_=
__grub_script_check_program=grub-script-check
_scp_path_esc='[][(){}<>",:;^&!$=?'|\'\''[:space:]]'
__expand_tilde_by_ref ()
{
    if [ "${!1:0:1}" = "~" ]; then
        if [ "${!1}" != "${!1//\/}" ]; then
...output truncated...       

assim, o script ao qual você está se referindo é uma variável shell habilmente (se não claramente). Quanto a wait , test e true . Tudo isso é documentado com man pages. Emita man <command> para saber mais sobre eles. Saída em branco é o resultado esperado dessas funções.

    
por Huckle 19.02.2012 / 22:43