De uma maneira compatível com posix que funciona com várias implementações, como posso imprimir a lista de variáveis de ambiente definidas atualmente sem seus valores?
Em algumas implementações (mksh, freebsd / bin / sh), apenas o uso export
por si só caberá na conta:
$ export
FOO2
FOO
Mas para algumas outras implementações (bash, zsh, dash), export
também mostra o valor. Com o bash, por exemplo:
$ export
export FOO2='as df\
asdk=fja:\
asd=fa\
asdf'
export FOO='sjfkasjfd kjasdf:\
asdkj=fkajdsf:\
:askjfkajsf=asdfkj:\
safdkj'
$ printenv | sed -n l
FOO2=as\tdf\$
asdk=fja:\$
asd=fa\$
asdf$
FOO=sjfkasjfd kjasdf:\$
asdkj=fkajdsf:\$
\t:askjfkajsf=asdfkj:\$
safdkj$
Outras opções, como env
ou printenv
não, têm opções para imprimir apenas os nomes das variáveis sem valores, pelo menos não nas plataformas linux e freebsd que eu tentei.
Tubulação para awk / sed / etc. ou aparar a lista com técnicas de expansão de parâmetros (por exemplo, ${foo%%=*}
) é aceitável, mas precisa trabalhar com valores que podem abranger linhas e ter um =
espaço em branco no valor (veja o exemplo acima).
Respostas específicas para implementações específicas de shell são interessantes, mas estou procurando principalmente por algo que seja compatível entre implementações.
export -p
especificada pelo POSIX para gerar uma saída que também é adequada para entrada no shell.export -p
isso?export -p
porque isso forneceria uma saída consistente em todos os shells POSIX, que você disse que queria.export -p
não se encaixa no primeiro requisito - imprimir apenas nomes de variáveis sem valores.export -p
. Não vou escrever essa análise, porque, no caso geral, também seria necessário fazer uma análise de cotação adequada, caso você tenha uma variável cujo valor seja algo parecidohello\nexport var=value
. Um dos poucos outros comandos que fornecerá uma saída consistente em todos os shells POSIX éenv
, mas essa saída é mais difícil de analisar, pois falta umexport =
pouco.Respostas:
É bem fácil no awk.
No entanto, cuidado com algumas implementações do awk que adicionam variáveis de ambiente próprias (por exemplo, GNU awk adiciona
AWKPATH
e adicionaAWKLIBPATH
aENVIRON
).A saída é ambígua se o nome de uma variável de ambiente contiver uma nova linha, o que é extremamente incomum, mas tecnicamente possível. Uma solução sh pura seria difícil. Sua melhor aposta é começar,
export -p
mas massagear com sh puro é difícil. Você pode usar o sed para massagear a saída eexport -p
, em seguida, usareval
o shell para remover o que foi citado. Bash e zsh imprimem prefixos não padrão.Observe que, dependendo do shell,
export -p
pode ou não mostrar variáveis cujo nome não é válido no shell e, se não for, pode ou não citar os nomes corretamente. Por exemplo, dash, mksh e zsh omitem variáveis cujo nome inclui uma nova linha, o busyBox dash e o ksh93 os imprimem em bruto e o bash os imprime em bruto sem seu valor. Se você precisar se defender de informações não confiáveis, não confie em uma solução POSIX pura e, definitivamente, não invoqueeval
nada derivado da saída deexport -p
.fonte
exit
seja necessária).FOO<newline>BAR
, não saberá se é umaFOO<newline>BAR
variável de ambiente (queexport -p
não seria exibida com a maioria dos shells, consulteenv $'FOO\nBAR=test' awk 'BEGIN{for (v in ENVIRON) print v}'
) ou se é uma variável de ambienteFOO
eBAR
.awk
s variáveis de ambiente conjuntos de seu próprio (AWKPATH
eAWKLIBPATH
no meu sistema)Eu gosto de coisas simples; isso funcionará para sistemas POSIX:
fonte
export AAA=$'multi\nBBB=line'
compgen -e
. Isso não ajuda no meu script portátil (por exemplo, quando o bash não está disponível), mas é interessante.dash
no debian, eu obtenho os mesmos resultados com o comando acima ou modificadoprintenv | sed 's;*=.;;' | sort
para obter os valores. Eu exportei a variávelyo
e atribuí o seu primeiro comentário acima; impresso como esperado, com várias linhas. não tenho certeza do que está experimentando, mas não deve haver saída truncada. execute o comando no shell; o que quer que ele produz, há como deve funcionar; não espere truncamento. Então, dentro do contexto de TERMCAP / screen / iirc; deve ser o mesmo. Se a saída não corresponder, é provável que haja um problema com um desses programas.