Existe uma maneira menos trabalhosa de definir uma versão local do array $path do que é mostrado no snippet a seguir?
foo () {
local holdpath
holdpath=($path)
local path
path=($holdpath)
if ( some_condition ) path=( $PREFIX $path )
# do stuff
}
Estou me referindo especificamente à música e dança com holdpath ...
Se, em vez disso, eu definir
foo () {
local path=($path)
if ( some_condition ) path=( $PREFIX $path )
# do stuff
}
... a primeira atribuição a path aciona um erro bad pattern . Claro, se em vez disso eu definir
foo () {
local path
path=($path)
if ( some_condition ) path=( $PREFIX $path )
# do stuff
}
... a primeira atribuição a path não faz diferença (isto é, pode ser omitida sem alterar os resultados); com ou sem ele, $path estará vazio.
EDITAR:
O script a seguir testa as várias sugestões que recebi até agora:
foo_0 () {
echo ${#path}
local PATH=$PATH
echo ${#path}
}
foo_1 () {
echo ${#path}
eval "local path; path=(${(q)path})"
echo ${#path}
}
foo_2 () {
echo ${#path}
eval "$(local -p path)"
echo ${#path}
}
for i ( 0 1 2 ) {
fn=foo_$i
echo "# $fn"
$fn
echo
}
A saída é:
# foo_0
22
22
# foo_1
22
1
# foo_2
22
22
Assim, as saídas para foo_0 e foo_2 são pelo menos consistentes com o que estou tentando alcançar. Algo não está funcionando com foo_1 como dado acima, mas eu me livrei do (q) na atribuição para path , ou seja,
foo_1 () {
echo ${#path}
eval "local path; path=($path)"
echo ${#path}
}
... então a saída concorda com a de foo_0 e foo_2 . Infelizmente, mesmo depois de ler a documentação do qualificador q algumas vezes, não entendo muito bem o que é suposto fazer na receita original.
Além disso, não consigo entender por que a seguinte variante da linha de comando de foo_0 difere da acima:
% (foo_0a () { echo ${#path}; local PATH=$PATH; echo ${#path} }; foo_0a)
22
1
FWIW, as variantes de linha de comando correspondentes de foo_1 e foo_2 produzem os mesmos resultados que seus originais no script:
% (foo_1a () { echo ${#path}; eval "local path; path=(${(q)path})"; echo ${#path} }; foo_1a)
22
1
% (foo_2a () { echo ${#path}; eval "$(local -p path)"; echo ${#path}; }; foo_2a)
22
22
Além disso, em todos os casos acima em que echo ${#path} produz 1 em vez de 22 , a razão é que a variável $path local contém todos os caminhos individuais em uma única sequência, separados por espaços.