/ / 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 реальний символ зворотної риски, тобто, якщо я роблю a

echo +++$target+++

я бачу

+++home/rovf/my directory with spaces

і якщо я спробую

cd $target

Я отримую в своїй системі повідомлення про помилку, що в каталозі

home/rovf/my/ directory/ with/ spaces

не існувало б.

(У випадку, якщо вам цікаво, де впередslashes приходять з: я працюю на Cygwin, і я припускаю, що команда cd просто інтерпретує зворотну косу риску як передню косу у цьому випадку, щоб краще підходити для середовища Windows).

Думаю, зворотні риски, які фізично з'являються в змінній ціль викликаються прапором розширення (q), який язастосувати до $ (_ iwpath_helper). Моя проблема полягає в тому, що я не можу просто відкинути (q), тому що без нього функція quote_stripped отримає на параметр $ 1 тільки першу частину рядка, аж до першого простору (/ home / rovf / my)

Як правильно написати це?

Відповіді:

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 був правий: як я намагався цитувати рядок був дурним (я думав занадто багато в "Bourne Shell спосіб"), і я повинен був використовувати (Q) прапор.

Ось моє рішення:

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

Більше не потрібна функція quote_stripped ....