(Примітка: це питання, яке буде наступником мого відправлення 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 ....