(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ď č. 1Myslí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.