/ / zsh: substituição de comando, citação apropriada e barra invertida (denovo) - zsh

zsh: substituição de comandos, cotação apropriada e barra invertida (denovo) - zsh

(Nota: Esta é uma pergunta sucessora para minha postagem zsh: substituição de comando e cotação apropriada , mas agora com uma complicação adicional).

Eu tenho uma função _iwpath_helper, que produzpara stdout um caminho, que possivelmente contém espaços. Por causa desta discussão, vamos supor que o _iwpath_helper sempre retorna um texto constante, por exemplo

function _iwpath_helper
{
echo "home/rovf/my directory with spaces"
}

Eu também tenho uma função quote_stripped espera umparâmetro e se este parâmetro é cercado por aspas, ele as remove e retorna o texto restante. Se o parâmetro não estiver entre aspas, ele retornará inalterado. Aqui está a sua definição:

function quote_stripped
{
echo ${1//[""]/}
}

Agora eu combino as duas funções da seguinte maneira:

target=$(quote_stripped "${(q)$(_iwpath_helper)}")

(É claro que "quote_stripped" seria desnecessário neste exemplo de brinquedo, porque _iwpath_helper não retorna um caminho delimitado por aspas aqui, mas no aplicativo real, às vezes, é).

O problema agora é que o alvo variável contém um real caractere de barra invertida, ou seja, se eu fizer

echo +++$target+++

Entendo

+++home/rovf/my directory with spaces

e se eu tentar

cd $target

Eu recebo no meu sistema a mensagem de erro, que o diretório

home/rovf/my/ directory/ with/ spaces

não existiria.

(Caso você esteja se perguntando onde a frenteslashes vêm de: Eu estou rodando no Cygwin, e eu acho que o comando cd apenas interpreta barras invertidas como barras neste caso, para acomodar melhor o ambiente Windows.

Eu acho que as barras invertidas, que aparecem fisicamente na variável alvo são causados ​​pelo sinalizador de expansão (q) que euaplica-se a $ (_ iwpath_helper). Meu problema é agora que eu não posso simplesmente soltar o (q), porque sem ele, a função quote_stripped teria no parâmetro $ 1 apenas a primeira parte da string, até o primeiro espaço (/ home / rovf / my).

Como posso escrever isso corretamente?

Respostas:

1 para resposta № 1

Eu acho que você só quer evitar tentar retirar aspas manualmente, e usar o (Q) sinalizador de expansão. Comparar:

% v="a b c d"
% echo "$v"
a b c d
% echo "${(q)v}"
a b c d
% echo "${(Q)${(q)v}}"
a b c d

0 para resposta № 2

Chepner estava certo: O jeito que eu tentei desmarcar a string foi bobo (eu estava pensando muito em um "modo Bourne Shell"), e eu deveria ter usado a bandeira (Q).

Aqui está a minha solução:

target="${(Q)$(_iwpath_helper)}"

Não há mais necessidade da função quote_stripped ....