2012-08-16 23 views
7

मैं निम्नलिखित पंक्ति को एक प्रोफाइल में गूंजने की कोशिश कर रहा हूं लेकिन यह कई उद्धरण या विशेष पात्रों द्वारा भ्रमित हो रहा है।फ़ाइल में एकाधिक उद्धरण/विशेष वर्णों के साथ रेखा को गूंज कैसे करें?

bind '"e[A": history-search-backward'

मैं चीजों के सभी प्रकार की कोशिश की है, लेकिन यह किसी न किसी के लिए नहीं मिल सकता है।

sudo su -c 'echo "bind \'\"\\e[A\": history-search-backward\'" >> /etc/profile' -

यह यह क्या देता है:

su: user '"\e[A": does not exist

फिर भी अगर मैं का उपयोग करें:

echo bind \'\"\\e[A\": history-search-backward\'" >> /home/user/testfile

यह मैं वर्तमान में क्या है

यह ठीक काम करता है।

मैं अपने स्क्रिप्ट के बाकी है कि ठीक से काम में "sudo सु -c" गूंज blah के सभी तरह है ... "।

कोई भी विचार?

+0

'\ '\" \\ ई [ए \ "' ई से पहले एक अतिरिक्त \ है। – steveg89

+0

उसे दो बैकस्लेश की आवश्यकता है ताकि एक शाब्दिक \/etc/profile में जोड़ा जा सके। – chepner

उत्तर

5

इस

sudo su -c $'echo \"bind \'\"\\e[A\": history-search-backward\'\" >> /etc/profile\' -' 
प्रयास करें

बैश आदमी पृष्ठ से:।

एक एकल उद्धरण एकल उद्धरण के बीच घटित नहीं हो सकता है, यहां तक ​​कि जब एक बैकस्लैश से पहले

$'...' द्वारा उद्धृत पाठ में सिंगल और डबल दोनों बैकस्लैश-एस्केक्ड कोट्स हो सकते हैं।

एक अन्य विकल्प ~/.inputrc के लिए अधिक सरल अभिव्यक्ति को जोड़ने के लिए है:

echo '"\e[A": history-search-backward' >> ~/.inputrc 

वहाँ .inputrc की एक प्रणाली चौड़ा बराबर है कि सभी उपयोगकर्ताओं द्वारा पढ़ा जाता है होना करने के लिए प्रतीत नहीं होता। साथ ही, यह रीडलाइन का उपयोग करने वाले किसी भी प्रोग्राम के लिए उपलब्ध बाध्यकारी बनाता है। ' ही छोड़कर

cat >> ~/.inputrc <<'EOF' 
$if Bash 
"\e[A": history-search-backward 
$endif 
EOF 
0

हर चरित्र, एकल उद्धरण के बीच शाब्दिक व्याख्या की है: क्या आप वास्तव में इसे पार्टी की योजना बनाई प्रतिबंधित करने के लिए चाहते हैं, तो एक सशर्त अभिव्यक्ति जोड़ें। तो आप इस तरह एक शाब्दिक स्ट्रिंग के अंदर एक सिंगल कोट डाल सकते हैं: 'single'\''quoted' स्ट्रिंग single'quoted है।

आपका आदेश जटिल है क्योंकि इसमें दो गोले शामिल हैं: वह खोल जो आप इस कमांड को चला रहे हैं, और su रन खोलता है। ध्यान दें कि sudo su चलाने के लिए अजीब है क्योंकि sudo पहले ही निर्दिष्ट आदेश को रूट के रूप में चलाता है; sudo sh -c … अधिक समझ में आता है। तो आपको दोनों के लिए उद्धरण की जरूरत है। बाहरी शेल के लिए सिंगल कोट्स और आंतरिक कोट के लिए डबल कोट्स या सिंगल कोट्स या बैकस्लाश का उपयोग करना आमतौर पर स्पष्ट होता है।

आपके आदेश के साथ एक और समस्या है: आप गलत फ़ाइल को लक्षित कर रहे हैं।/etc/profile केवल लॉगिन शैल द्वारा पढ़ा जाता है, जबकि bind कमांड बाश के लिए विशिष्ट है लेकिन बैश के सभी उदाहरणों द्वारा पढ़ा जाना चाहिए, न केवल लॉगिन गोले। इस लाइन को /etc/profile पर लिखने के बजाय, आपको इसे सिस्टम-व्यापी bashrc पर लिखना चाहिए, यदि कोई है (यह आमतौर पर /etc/bash.bashrc है)।

sudo sh -c 'echo "bind '\''\"\\e[A\": history-search-backward'\''" >>/etc/bash.bashrc' 

आप ReadLine विन्यास फाइल, /etc/inputrc में सीधे इस सेटिंग डाल सकता है। आप उद्धरण के स्तर पर बचत करेंगे।

sudo sh -c 'echo '\''"\e[A": history-search-backward'\'' >>/etc/inputrc' 

एक आसान तरीका एक कमांड को एक मनमाना स्ट्रिंग पारित करने के लिए इनपुट के रूप में के बजाय एक तर्क के रूप में यह गुजरती हैं और एक here document उपयोग करने के लिए किया जाएगा।

sudo sh -c 'cat >>/etc/inputrc' <<'EOF' 
"\e[A": history-search-backward 
EOF