जैसा कि @geekosaur ने बताया, शेल कमांड को चलाने से पहले पुनर्निर्देशन करता है। जब आप यह लिखें:
sudo foo >/some/file
आपकी वर्तमान शेल प्रक्रिया स्वयं की एक प्रतिलिपि बनाती है जो पहले /some/fileलिखने के लिए खोलने की कोशिश करती है , फिर उस फाइल को उसके मानक आउटपुट के लिए वर्णन करती है, और केवल उसे निष्पादित करती है sudo।
यदि आपको अनुमति दी जाती है (sudoer कॉन्फ़िगर अक्सर चल रहे गोले को छोड़कर), तो आप इस तरह से कुछ कर सकते हैं:
sudo bash -c 'foo >/some/file'
लेकिन मुझे लगता है कि एक अच्छा समाधान सामान्य रूप | sudo teeसे >और | sudo tee -aइसके बजाय उपयोग करना है >>। यह विशेष रूप से उपयोगी है यदि पुनर्निर्देशन एकमात्र कारण है जो मुझे sudoपहले स्थान पर चाहिए; सब के बाद, रूट के रूप में अनावश्यक रूप से चलने वाली प्रक्रिया ठीक वही है जो sudoबचने के लिए बनाई गई थी। और echoजड़ के रूप में दौड़ना मूर्खतापूर्ण है।
echo '[archlinuxfr]' | sudo tee -a /etc/pacman.conf >/dev/null
echo 'Server = http://repo.archlinux.fr/$arch' | sudo tee -a /etc/pacman.conf >/dev/null
echo ' ' | sudo tee -a /etc/pacman.conf >/dev/null
मैंने > /dev/nullअंत में जोड़ा क्योंकि नामित फ़ाइल और अपने स्वयं के मानक आउटपुट दोनोंtee को इसका आउटपुट भेजता है , और मुझे इसे अपने टर्मिनल पर देखने की आवश्यकता नहीं है। ( कमांड एक भौतिक पाइपलाइन में एक "टी" कनेक्टर की तरह काम करता है, जहां यह इसका नाम हो जाता है।) और मैंने युगल ( ... ) के बजाय एकल उद्धरण ( ... ) पर स्विच किया ताकि सब कुछ शाब्दिक हो और मैं के सामने एक बैकस्लैश डाल करने के लिए नहीं था में । (उद्धरण या बैकलैश के बिना, शेल पैरामीटर के मूल्य द्वारा प्रतिस्थापित किया जाएगा , जो संभवतः मौजूद नहीं है, इस मामले में कुछ भी नहीं है और बस गायब हो जाता है।)tee''""$$arch$archarch$arch
ताकि रूट का उपयोग कर के रूप में फ़ाइलों को लिखने का ख्याल रखता है sudo। अब एक शेल स्क्रिप्ट में newline- युक्त टेक्स्ट आउटपुट करने के तरीकों पर एक लंबा विषयांतर। :)
BLUF के लिए, जैसा कि वे कहते हैं, मेरा पसंदीदा समाधान सिर्फ यहाँ एक दस्तावेज़ को उपरोक्त sudo teeकमांड में फीड करना होगा ; तो के लिए कोई ज़रूरत नहीं है catया echoया printfया बिल्कुल भी किसी अन्य आदेशों। एकल उद्धरण चिह्न प्रहरी परिचय में चले गए हैं <<'EOF', लेकिन उनका वहीं प्रभाव पड़ता है: शरीर को शाब्दिक पाठ के रूप में माना जाता है, इसलिए $archइसे अकेला छोड़ दिया जाता है:
sudo tee -a /etc/pacman.conf >/dev/null <<'EOF'
[archlinuxfr]
Server = http://repo.archlinux.fr/$arch
EOF
लेकिन जब कि मैं यह कैसे करूँगा, वहाँ विकल्प हैं। यहाँ कुछ है:
आप echoप्रति पंक्ति एक के साथ छड़ी कर सकते हैं , लेकिन उन सभी को एक साथ एक उपधारा में समूहित कर सकते हैं, इसलिए आपको केवल एक बार फाइल में संलग्न करना होगा:
(echo '[archlinuxfr]'
echo 'Server = http://repo.archlinux.fr/$arch'
echo ' ') | sudo tee -a /etc/pacman.conf >/dev/null
जोड़ते हैं -eकरने के लिए echo(और आप एक खोल है कि समर्थन करता है कि गैर POSIX एक्सटेंशन का उपयोग कर रहे हैं), नई-पंक्तियों सीधे स्ट्रिंग का उपयोग में एम्बेड कर सकते \n:
echo -e '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
लेकिन जैसा कि ऊपर कहा गया है, यह पॉसिक्स-निर्दिष्ट व्यवहार नहीं है; आपका खोल सिर्फ एक शाब्दिक प्रतिध्वनित हो सकता है -eजिसके \nबजाय एक स्ट्रिंग होती है जिसके बजाय शाब्दिक एस का एक गुच्छा होता है । ऐसा करने का POSIX तरीका printfइसके बजाय उपयोग करना है echo; यह स्वचालित रूप से अपने तर्क की तरह व्यवहार echo -eकरता है, लेकिन अंत में एक नई पंक्ति को स्वचालित रूप से संलग्न नहीं करता है, इसलिए आपको एक अतिरिक्त छड़ी करना \nहोगा, भी:
printf '[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n \n' |
sudo tee -a /etc/pacman.conf >/dev/null
उन समाधानों में से किसी के साथ, कमांड को एक तर्क स्ट्रिंग के रूप में जो मिलता है, उसमें दो-वर्ण अनुक्रम होता है \n, और यह कमांड प्रोग्राम पर ही निर्भर है (कोड के अंदर printfया अंदर echo) कि एक नई पंक्ति में अनुवाद करने के लिए। कई आधुनिक गोले में, आपके पास एएनएसआई उद्धरण का उपयोग करने का विकल्प होता है $'... ', जो कमांड प्रोग्राम को कभी भी स्ट्रिंग को देखने से पहले शाब्दिक न्यूलाइन्स \nमें अनुक्रमों का अनुवाद करेगा । इसका मतलब है कि इस तरह के तार किसी भी आदेश के साथ काम करते हैं, सादे पुराने सहित -less :-eecho
echo $'[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
लेकिन, की तुलना में अधिक पोर्टेबल है echo -e, ANSI उद्धरण अभी भी एक गैर POSIX एक्सटेंशन हैं।
और फिर, जबकि वे सभी विकल्प हैं, मैं tee <<EOFऊपर दिए गए सीधे समाधान को पसंद करता हूं ।