/ / 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 यहां उद्धरण-सीमांकित पथ नहीं लौटाता है, लेकिन वास्तविक एप्लिकेशन में, कभी-कभी करता है)।

समस्या अब यह है कि परिवर्तनीय लक्ष्य में एक है असली बैकस्लैश चरित्र, यानी अगर मैं करता हूं

echo +++$target+++

समझा

+++home/rovf/my directory with spaces

और अगर मैं कोशिश करता हूँ

cd $target

मैं अपने सिस्टम पर त्रुटि संदेश, निर्देशिका है

home/rovf/my/ directory/ with/ spaces

अस्तित्व में नहीं होगा

(यदि आप सोच रहे हैं कि आगे कहां हैस्लेश आते हैं: मैं सिग्विन पर चल रहा हूं, और मुझे लगता है कि सीडी कमांड सिर्फ विंडोज़ पर्यावरण के लिए बेहतर समायोजन के लिए इस मामले में आगे की कमी के रूप में बैकस्लाश का अर्थ देता है)।

मुझे लगता है कि बैकस्लाश, जो भौतिक रूप से चर में दिखाई देते हैं लक्ष्य (क्यू) विस्तार ध्वज के कारण होते हैं जो मैं$ (_ iwpath_helper) पर लागू करें। मेरी समस्या यह है कि मैं केवल (क्यू) को नहीं छोड़ सकता, क्योंकि इसके बिना, फ़ंक्शन 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

चेपर सही था: जिस तरह से मैंने स्ट्रिंग को अनवरोधित करने की कोशिश की वह मूर्खतापूर्ण थी (मैं "बोर्न शेल मार्ग" में बहुत ज्यादा सोच रहा था), और मुझे (क्यू) ध्वज का उपयोग करना चाहिए था।

मेरा समाधान यहाँ है:

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

Quote_stripped फ़ंक्शन के लिए अब और आवश्यकता नहीं है ....