Isto é especificamente sobre bash
's declare
- o caso geral é tratado de forma bastante exaustiva nesta resposta (que menciona "a // typeset
saída de , , " mas não a de ).declare
export -p
ksh93
mksh
zsh
bash
Dada uma variável local/exportada/array/assocative-array (mas talvez não nameref) foo
, a saída de declare -p foo
in é bash
garantidamente reutilizável por bash
? A documentação oficial não menciona nada parecido:
A
-p
opção exibirá os atributos e valores de cada arquivoname
. Quando-p
é usado comname
argumentos, opções adicionais, além de-f
e-F
, são ignoradas.
E eu olhei através doCHANGES
e vi isso sobre funções :
This document details the changes between this version, bash-2.05-beta1,
and the previous version, bash-2.05-alpha1.
...
b. When `set' is called without options, it prints function definitions in a
way that allows them to be reused as input. This affects `declare' and
`declare -p' as well.
E para alguns outros comandos, -p
destina-se a produzir resultados reutilizáveis:
s. The `shopt' `-p' option now causes output to be displayed in a reusable
format.
...
u. `umask' now has a `-p' option to print output in a reusable format.
E o FAQ do Bash de Chet Ramey tem:
Bash-2.0 contained extensive changes and new features from bash-1.14.7.
Here's a short list:
...
most builtins use -p option to display output in a reusable form
(for consistency)
Mas nada que eu possa encontrar sobre declare -p
variáveis.
Nessa minha resposta a que você está se referindo , um dos outros pontos também menciona:
O que não inclui bash's
declare -p
.Na época em que escrevi, answer
bash
nãodeclare -p
era usado$'...'
para citar os valores de variáveis escalares , mas sim para variáveis de array. Isso agora mudou, pois posso ver a saída 5.2declare -x a=$'\b'
para uma variável escalar contendo o caractere BS (veja a discussão relacionada na lista de discussão ).Mas, em qualquer caso, versões mais antigas usavam
"..."
para citar o valor de variáveis escalares dentro das quais`
e\
são especiais e esses caracteres têm uma codificação que pode ser encontrada como parte da codificação de outros caracteres em alguns locais.A saída de
declare -p
destina -se (como sugerem alguns comentários no código, bem como declarações do mantenedor na lista de discussão ), se não documentada, para ser reutilizável, mas na verdade isso é apenas (se houver) na mesma versão do mesmo shell bash e no mesmo código de idioma no mesmo sistema (mesmas libc e definições de código de idioma).Aqui no Ubuntu 20.04 com bash 5.0.17:
uname
(felizmente inofensivo) foi executado quando a saídadeclare -p
obtida em um local usando UTF-8 como charmap foi interpretada pelo bash executando em um local usando GB18030 como charmap.Vários bugs (veja isto ou isto como exemplos) foram corrigidos no passado, onde a cotação não foi feita corretamente, ou
declare -p
(ouexport -p
que o POSIX requer para gerar código shell adequado para reinput) por si só incluía definições de variáveis do ambiente que não pôde ser mapeado para variáveis de shell .Observe também que no bash, o que constitui um nome de variável válido depende da localidade.
O byte 0xe9 está em ISO-8859-1, que é um byte único,
[[:alpha:]]
portanto é permitido em nomes de variáveis, enquanto em UTF-8 nem sequer forma um caractere válido.Cuidado também com:
O fato de um ser global e o outro local não se reflete na
declare
saída de ', e se ambos fossem usados dentro de uma função, a variável resultante acabaria sendo local para a função.o bash
declare
obviamente tem o formato do kshtypeset
(o bash também tem umtypeset
alias). No ksh86 e anteriores,typeset -p
era necessário imprimir atypeset
saída, se houver, para o coprocesso (também conhecido como two-way pipe ). Parece que desapareceu no ksh88. No ksh93,typeset -p
reapareceu para imprimir definições de variáveis.As versões atuais do manual ksh93 possuem :
Mas esse palavreado só apareceu no ksh93t em 2008 .
-p
foi adicionado ao bashdeclare
no 2.0 lançado em 1996Dos arquivos NEWS dessa versão:
(
-F
incompatível com ksh93)E a
CWRU/changelog
:Que data a implementação real em 24/03/1995, portanto, depois do ksh93, mas antes do ksh93, documentando-o produzindo resultados reutilizáveis.
Muitos recursos do Bash são copiados do Ksh. Sendo o mesmo switch com a mesma funcionalidade no bash e no ksh, deve-se esperar que a resposta do Ksh também se aplique ao Bash.
Também é meu entendimento pessoal que a saída de
declare -p
é reutilizável e não vi um caso em que não fosse.