जैसा कि @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
$arch
arch
$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 :-e
echo
echo $'[archlinuxfr]\nServer = http://repo.archlinux.fr/$arch\n ' |
sudo tee -a /etc/pacman.conf >/dev/null
लेकिन, की तुलना में अधिक पोर्टेबल है echo -e
, ANSI उद्धरण अभी भी एक गैर POSIX एक्सटेंशन हैं।
और फिर, जबकि वे सभी विकल्प हैं, मैं tee <<EOF
ऊपर दिए गए सीधे समाधान को पसंद करता हूं ।