Como remover as funções exibidas pelo comando set? [duplicado]

7

Quando o comando set é usado sem nenhuma opção, ele exibe os nomes e valores de todas as variáveis e funções do shell.

Queremos exibir apenas as variáveis e evitar as funções da saída.

    
por frp farhan 06.12.2016 / 11:55

4 respostas

14

Como eu já disse em um comentário, env não se encaixa no requisito, pois mostra apenas as variáveis exportadas.

O processamento de set output para filtrar qualquer coisa que não se pareça com uma definição de variável é um hack não confiável. Em particular, você perderá uma parte das variáveis cujo valor contém um avanço de linha. Ainda pior, uma função cuidadosamente escrita pode fazer aparecer definições de variáveis falsas.

A solução mais simples é alternar temporariamente para o modo POSIX, no qual as funções não são consideradas (tipo de) variáveis:

set -o posix
set
set +o posix

Existe, no entanto, um problema se o seu modo padrão já é POSIX, ou se você quer que o comando funcione em qualquer modo POSIX no qual o shell está configurado.

Nesse caso, aqui está uma solução alternativa:

(set -o posix;set)

Isso só define o modo POSIX para o set construído em um subshell e o modo shell pai não é afetado.

    
por 06.12.2016 / 12:01
4

Embora a solução mais simples seja usar env em vez de set , env não fornece todas variáveis existentes, mas somente aquelas que seriam passadas para qualquer processo iniciado com env (portanto, nenhuma variável não exportada, por exemplo). Outra abordagem é pesquisar a saída de set para linhas que possuem uma sequência de espaços não brancos, uma = e outra sequência de caracteres que não são espaços em branco:

set | grep -E '^\S+=\S' 

No entanto, isso perderá todas as variáveis configuradas para um valor multilinha (como IFS cujo valor padrão inclui \n ).

    
por 06.12.2016 / 12:38
3

Por algum motivo estranho, declare -p parece listar apenas variáveis:

$ declare -p
declare -x ANT_HOME="/usr/share/apache-ant"
declare -- BASH="/usr/bin/bash"
declare -r BASHOPTS="checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath"
declare -ir BASHPID
declare -A BASH_ALIASES=()
declare -a BASH_ARGC=()
declare -a BASH_ARGV=()
declare -A BASH_CMDS=()
...

Claro, isso tem a desvantagem de gerar comandos declare que podem recriar a variável com todos os seus atributos. Dependendo do que você pretende fazer com a saída, isso pode realmente ser útil.

    
por 06.12.2016 / 16:24
2

Não tenho certeza, mas a vaca consideraria algo.

 _____
( env )
 -----
        o   ^__^
         o  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Em outras palavras, use apenas env .

Eu acho que ela acabou de ler o comentário de jilliagre.

 ________________________________
/ But it will only show exported \
\ variables!                     /
 --------------------------------
        \   ^__^
         \  (!!)\_______
            (__)\       )\/\
             !! ||----w |
                ||     ||
    
por 06.12.2016 / 12:02

Tags