/ / zsh: náhrada príkazu, správne citovanie a spätné lomítko (znova) - zsh

zsh: náhrada príkazu, správne citovanie a spätné lomítko (znova) - zsh

(Poznámka: Toto je nástupná otázka môjho vysielania zsh: Nahradenie príkazu a správne citovanie , ale teraz s ďalšou komplikáciou).

Mám funkciu _iwpath_helper, ktorá vystupujena stdout cestu, ktorá môže obsahovať aj medzery. V záujme tejto diskusie predpokladajme, že _iwpath_helper vždy vráti konštantný text, napríklad

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

Mám tiež funkciu quote_stripped očakáva jednuparameter a ak je tento parameter obklopený citátmi, odstráni ho a vráti zostávajúci text. Ak parameter nie je obklopený citátmi, vráti ho nezmenený. Tu je jeho definícia:

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

Teraz kombinujem obe funkcie nasledujúcim spôsobom:

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

(Samozrejme, "quote_stripped" by nebolo potrebné v tomto príklade hračiek, pretože _iwpath_helper nevráti tu cestu oddelenú na citáciu, ale v skutočnej aplikácii to niekedy robí).

Problémom je, že premenný cieľ obsahuje a reálny spätné lomítko, t.j. ak to urobím a

echo +++$target+++

vidím

+++home/rovf/my directory with spaces

a ak sa to pokúšam

cd $target

Dostávam do môjho systému chybové hlásenie, ktoré je v adresári

home/rovf/my/ directory/ with/ spaces

by neexistovali.

(V prípade, že sa zaujímate o to, kam ide dopredulomky pochádzajú z: Ja som beží na Cygwin, a myslím, že príkaz CD len interpretuje spätné lomítka ako lomítka dopredu v tomto prípade, aby sa lepšie vyhovovali pre prostredie Windows).

Myslím, že backslash, ktoré sa fyzicky objavujú v premennej terč sú spôsobené príznakom (q) rozšírenia, ktorý Iplatí pre $ (_ iwpath_helper). Môj problém je teraz, že nemôžem jednoducho zrušiť (q), pretože bez neho by sa funkcia quote_stripped dostala na parameter $ 1 len prvá časť reťazca až do prvého priestoru (/ Home / rovf / my).

Ako to môžem napísať správne?

odpovede:

1 pre odpoveď č. 1

Myslím, že sa chcete vyhnúť tomu, aby ste sa pokúšali ručne vypustiť citácie a používať (Q) príznak rozšírenia. porovnávať:

% 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 pre odpoveď č. 2

chepner mal pravdu: Spôsob, akým som sa pokúsil zrušiť reťazec, bol hlúposť (myslel som príliš ve "Bourne Shellovej ceste") a ja som mal použiť príznak (Q).

Tu je moje riešenie:

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

Už nie je potrebné funkciu quote_stripped.