/ / zsh: подмяна на команда, правилно цитиране и обратна наклонена черта (отново) - zsh

zsh: подмяна на команда, правилно цитиране и обратна наклонена черта (отново) - zsh

(Забележка: Това е следният въпрос за моето публикуване zsh: Подмяна на командата и правилно цитиране , но сега с допълнително усложнение).

Имам функция _iwpath_helper, която извеждада се изчертае път, който може да съдържа интервали. За целите на тази дискусия нека предположим, че _iwpath_helper винаги връща постоянен текст, например

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

Имам и функция quote_stripped, която очаква еднапараметър и ако този параметър е заобиколен от кавички, той ги премахва и връща останалия текст. Ако параметърът не е заобиколен от кавички, той го връща непроменен. Ето и определението му:

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

Сега комбинирам двете функции по следния начин:

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

(Разбира се, "quote_stripped" би било ненужно в този пример за играчка, защото _iwpath_helper не връща тук цитат-очертан път, но в реалното приложение, понякога го прави).

Проблемът сега е, че променливата цел съдържа a реален обратно наклонена черта, т.е. ако го направя

echo +++$target+++

Виждам

+++home/rovf/my directory with spaces

и ако се опитам

cd $target

Получавам на моята система съобщение за грешка, че директорията

home/rovf/my/ directory/ with/ spaces

няма да съществува.

(В случай, че се чудите къде е напредидват от: аз бягам на Cygwin и предполагам, че cd командата просто тълкува backslashes като предница в този случай, за да се поберат по-добре в средата на Windows).

Предполагам, че обратните мигнали, които физически се появяват в променливата мишена са причинени от знак (q) за разширение, който Iважи за $ (_ iwpath_helper). Проблемът ми сега е, че не мога просто да пусна (q), защото без него функцията quote_stripped ще получи на параметър $ 1 само първата част от низа, до първия интервал (/ Начало / rovf / ми).

Как мога да напиша това правилно?

Отговори:

1 за отговор № 1

Мисля, че просто искате да избягвате да опитвате да сваляте цитати ръчно и да използвате (Q) флаг за разширение. Сравнете:

% 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 за отговор № 2

chepner беше прав: Начинът, по който се опитах да отрека низът, беше глупаво (мислех твърде много в "начин на" Бърн Шел ") и трябваше да използвам знамето (Q).

Ето моето решение:

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

Няма нужда от функцията quote_stripped повече ....