É possÃvel implementar a local export
em zsh? Possivelmente usando tentar e sempre?
Isso cria condições de corrida?
Por "exportação local", quero dizer algo exatamente como uma variável local, que é acessÃvel aos subprocessos (no escopo).
Exemplo:
function a() {
local export YACY_TIMEOUT=60
yacy -r -d sth
}
export YACY_TIMEOUT=4
echo "$YACY_TIMEOUT" # 4
a
echo "$YACY_TIMEOUT" # 4
As variáveis ​​estão sempre disponÃveis para os subprocessos. Dentro:
você vê 1.
Acho que o que você quis dizer é que você quer que a variável tenha um escopo local e seja exportada para o ambiente para que sejam passadas como variáveis ​​de ambiente para comandos que são executados . A execução de um comando é o que limpa a memória de um processo (e o ambiente é uma forma de preservar alguns dados nele), bifurcando um filho copia toda a memória para que tudo seja preservado.
Para isso, você pode usar
local -x
:dá:
Ou você pode
export
depois de ter sido declaradolocal
:Observe que você pode passar uma variável no ambiente de um único comando sem defini-la de outra forma como uma variável do shell com:
Observe que
local
se originou no shell Almquist no final dos anos 80, mas funciona de maneira diferente dozsh
's. No shell Almquist (e seus descendentes como dash e o sh do NetBSD/FreeBSD),local
afeta apenas o escopo de uma variável e não altera o valor ou os atributos de uma variável.O zsh
local
funciona mais como o ksh93,typeset
pois declara uma nova variável que é independente daquela no escopo externo.ksh88, bash e pdksh's
local
/typeset
tentam fazer isso também, mas ainda herdam alguns atributos da variável do escopo externo, incluindo o atributo export . Isso mudou no ksh93, mas observe que o ksh93 também mudou para escopo estático e implementa apenas o escopo local em funções declaradas com afunction f { ...; }
sintaxe.Assumindo que o que você quer fazer é dar a um processo uma variável de ambiente com um valor que pode ser diferente do valor da variável shell com o mesmo nome que pode estar no escopo do shell no ponto de invocação do comando:
Essa é a sintaxe padrão para executar um comando e fornecer a ele um valor especÃfico de uma variável de ambiente. A variável
YACY_TIMEOUT
, se existir no mesmo escopo que o corpo daa
função, não será modificada.Isso funcionaria em qualquer shell POSIX.
O que isso não faz é permitir que você use
YACY_TIMEOUT
com o valor "local" dentro da função antes de chamaryacy
.Em
zsh
ou em qualquer outro shell que suporte variáveis ​​locais declaradas comlocal
, você pode fazerAqui,
YACY_TIMEOUT
seria local para aa
função. A injeção da variável como variável de ambiente noyacy
processo acontece como no primeiro exemplo que dei, precedendo a invocação por uma atribuição.Agora
YACY_TIMEOUT
é local e também está disponÃvel noyacy
ambiente do processo. Isso funcionaria em qualquer shell que suporte o usolocal
para declarar variáveis ​​locais.Use um subshell:
Exemplo: