मैं बैश स्क्रिप्ट में एक फ़ाइल के लिए यहां एक दस्तावेज़ कैसे लिख सकता हूं?
मैं बैश स्क्रिप्ट में एक फ़ाइल के लिए यहां एक दस्तावेज़ कैसे लिख सकता हूं?
जवाबों:
एडवांस बैश-स्क्रिप्टिंग गाइड चैप्टर 19 को पढ़ें । यहां दस्तावेज ।
यहां एक उदाहरण दिया गया है जो सामग्री को फ़ाइल में लिख देगा /tmp/yourfilehere
cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
This line is indented.
EOF
ध्यान दें कि अंतिम 'EOF' (The LimitString
) शब्द के सामने कोई व्हाट्सएप नहीं होना चाहिए, क्योंकि इसका मतलब है कि LimitString
मान्यता प्राप्त नहीं होगी।
एक शेल स्क्रिप्ट में, आप कोड को पठनीय बनाने के लिए इंडेंटेशन का उपयोग करना चाह सकते हैं, हालांकि इससे आपके दस्तावेज़ में टेक्स्ट को इंडेंट करने का अवांछनीय प्रभाव हो सकता है। इस स्थिति में, <<-
अग्रणी टैब को अक्षम करने के लिए (डैश के बाद) का उपयोग करें ( ध्यान दें कि यह परीक्षण करने के लिए आपको प्रमुख व्हाट्सएप को एक टैब वर्ण से बदलना होगा , क्योंकि मैं यहां वास्तविक टैब वर्ण मुद्रित नहीं कर सकता हूं।)
#!/usr/bin/env bash
if true ; then
cat <<- EOF > /tmp/yourfilehere
The leading tab is ignored.
EOF
fi
यदि आप पाठ में चर की व्याख्या नहीं करना चाहते हैं, तो एकल उद्धरणों का उपयोग करें:
cat << 'EOF' > /tmp/yourfilehere
The variable $FOO will not be interpreted.
EOF
एक कमांड पाइपलाइन के माध्यम से हेरेडोक को पाइप करने के लिए:
cat <<'EOF' | sed 's/a/b/'
foo
bar
baz
EOF
आउटपुट:
foo
bbr
bbz
... या फ़ाइल का उपयोग करने के लिए हेरेडोक लिखने के लिए sudo
:
cat <<'EOF' | sed 's/a/b/' | sudo tee /etc/config_file.conf
foo
bar
baz
EOF
<<<
, उन्हें क्या कहा जाता है?
<<<
को 'यहां स्ट्रिंग्स' कहा जाता है। जैसे कोड tr a-z A-Z <<< 'one two three'
स्ट्रिंग में परिणाम होगा ONE TWO THREE
। En.wikipedia.org/wiki/Here_document#Here_strings
<<'EOF'
बजाय होना चाहिए <<EOF
।
उपयोग करने के बजाय cat
और I / O पुनर्निर्देशन के tee
बजाय इसका उपयोग करना उपयोगी हो सकता है :
tee newfile <<EOF
line 1
line 2
line 3
EOF
यह अधिक संक्षिप्त है, इसके अलावा sudo
यदि आप रूट अनुमतियों वाली फाइलों को लिखना चाहते हैं तो इसे पुनर्निर्देशित ऑपरेटर के विपरीत जोड़ा जा सकता है ।
> /dev/null
पहली पंक्ति के अंत में जोड़ने की सलाह दूंगा कि जब यह बनाया जाता है तो फाइल को यहां प्रदर्शित होने से रोकने के लिए सामग्री को रोका जाए।
sudo
, बल्कि अपनी संक्षिप्तता की वजह से :-)
man tee
। -a
अधिलेखित करने के बजाय ध्वज का उपयोग करें ।
ध्यान दें:
प्रश्न (कैसे यहाँ दस्तावेज़ लिखने के लिए (उर्फ हेरेडोक ) को बैश स्क्रिप्ट में फाइल में?) कम से कम 3 मुख्य स्वतंत्र आयाम या उपश्रेणियाँ हैं:
root
) फ़ाइल का मालिक है?(अन्य आयाम / उपकथाएं हैं जिन्हें मैं महत्वपूर्ण नहीं मानता हूं। उन्हें जोड़ने के लिए इस उत्तर को संपादित करने पर विचार करें!) यहां ऊपर दिए गए प्रश्न के आयामों के कुछ और महत्वपूर्ण संयोजन हैं, विभिन्न विभिन्न परिसीमन पहचानकर्ताओं के साथ - कुछ भी नहीं है के बारे में पवित्र EOF
, बस यह सुनिश्चित करें कि आपके द्वारा पहचाने जाने वाले स्ट्रिंग का उपयोग आपके वंशानुगत के अंदर नहीं होता है:
मौजूदा फ़ाइल को अधिलेखित करने के लिए (या नई फ़ाइल पर लिखें) जो आपके पास है, जो हेरेडोक के अंदर चर संदर्भों को प्रतिस्थापित करती है:
cat << EOF > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
EOF
मौजूदा फ़ाइल को जोड़ने के लिए (या नई फ़ाइल पर लिखें) जो आपके पास है, हेरेडोक के अंदर चर संदर्भों को प्रतिस्थापित करना:
cat << FOE >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
FOE
मौजूदा फ़ाइल को अधिलेखित करने के लिए (या नई फ़ाइल पर लिखें) जो आपके पास है, जो हेरेडॉक की शाब्दिक सामग्री के साथ है:
cat << 'END_OF_FILE' > /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
END_OF_FILE
मौजूदा फ़ाइल को संलग्न करने के लिए (या नई फ़ाइल पर लिखें) जो आपके पास है, जो हेरेडोक की शाब्दिक सामग्री के साथ है:
cat << 'eof' >> /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
eof
एक मौजूदा फ़ाइल को अधिलेखित करने के लिए (या एक नई फ़ाइल के लिए लिखें) जड़ के स्वामित्व में, हेरेडोक के अंदर चर संदर्भों को प्रतिस्थापित करना:
cat << until_it_ends | sudo tee /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, with the variable contents substituted.
until_it_ends
मौजूदा फ़ाइल (या एक नई फ़ाइल लिखने के लिए) के लिए उपयोगकर्ता = foo के स्वामित्व वाली, हेरेड की शाब्दिक सामग्री के साथ:
cat << 'Screw_you_Foo' | sudo -u foo tee -a /path/to/your/file
This line will write to the file.
${THIS} will also write to the file, without the variable contents substituted.
Screw_you_Foo
-a
== --append
; यानी, tee -a
-> tee
। देखें info tee
(मैं इसे यहाँ उद्धृत करूँगा, लेकिन टिप्पणी मार्कअप बहुत सीमित है।
sudo tee /path/to/your/file << 'Screw_you_Foo'
?
FOE
इसके बजाय EOF
परिशिष्ट उदाहरण में क्यों ?
@ Livven के उत्तर को बनाने के लिए , यहां कुछ उपयोगी संयोजन दिए गए हैं।
चर प्रतिस्थापन, प्रमुख टैब बनाए रखा, फ़ाइल अधिलेखित, गूंज stdout करने के लिए
tee /path/to/file <<EOF
${variable}
EOF
कोई चर प्रतिस्थापन , प्रमुख टैब बनाए रखा, फ़ाइल को अधिलेखित, गूंज stdout करने के लिए
tee /path/to/file <<'EOF'
${variable}
EOF
चर प्रतिस्थापन, प्रमुख टैब हटा दिया गया है , फ़ाइल को अधिलेखित करें, प्रतिध्वनित प्रतिध्वनि
tee /path/to/file <<-EOF
${variable}
EOF
चर प्रतिस्थापन, अग्रणी टैब बनाए रखा, फ़ाइल करने के लिए संलग्न , प्रतिध्वनि करने के लिए गूंज
tee -a /path/to/file <<EOF
${variable}
EOF
चर प्रतिस्थापन, अग्रणी टैब बनाए रखा, फ़ाइल को अधिलेखित, stdout करने के लिए कोई गूंज
tee /path/to/file <<EOF >/dev/null
${variable}
EOF
इसके बाद के संस्करण के साथ जोड़ा जा सकता है sudo
और साथ ही
sudo -u USER tee /path/to/file <<EOF
${variable}
EOF
गंतव्य फ़ाइल के लिए रूट अनुमतियाँ आवश्यक हैं, |sudo tee
इसके बजाय का उपयोग करें >
:
cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF
भविष्य के लोगों के लिए, जिनके पास यह समस्या हो सकती है, निम्न प्रारूप में काम किया है:
(cat <<- _EOF_
LogFile /var/log/clamd.log
LogTime yes
DatabaseDirectory /var/lib/clamav
LocalSocket /tmp/clamd.socket
TCPAddr 127.0.0.1
SelfCheck 1020
ScanPDF yes
_EOF_
) > /etc/clamd.conf
cat << END > afile
इसके बाद हेरेडोक पूरी तरह से अच्छी तरह से काम करता है।
cat
स्वीकृत उत्तर में दिखाए गए अनुसार शुरू होता है ।
cat
एक उप-प्रकार के अंदर चलता है, और
उदाहरण के लिए आप इसका उपयोग कर सकते हैं:
पहला (ssh कनेक्शन बनाना):
while read pass port user ip files directs; do
sshpass -p$pass scp -o 'StrictHostKeyChecking no' -P $port $files $user@$ip:$directs
done <<____HERE
PASS PORT USER IP FILES DIRECTS
. . . . . .
. . . . . .
. . . . . .
PASS PORT USER IP FILES DIRECTS
____HERE
दूसरा (कमांड निष्पादित करना):
while read pass port user ip; do
sshpass -p$pass ssh -p $port $user@$ip <<ENDSSH1
COMMAND 1
.
.
.
COMMAND n
ENDSSH1
done <<____HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
____HERE
तीसरा (कमांड निष्पादित करना):
Script=$'
#Your commands
'
while read pass port user ip; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip "$Script"
done <<___HERE
PASS PORT USER IP
. . . .
. . . .
. . . .
PASS PORT USER IP
___HERE
फोर्थ (चर का उपयोग करके):
while read pass port user ip fileoutput; do
sshpass -p$pass ssh -o 'StrictHostKeyChecking no' -p $port $user@$ip fileinput=$fileinput 'bash -s'<<ENDSSH1
#Your command > $fileinput
#Your command > $fileinput
ENDSSH1
done <<____HERE
PASS PORT USER IP FILE-OUTPUT
. . . . .
. . . . .
. . . . .
PASS PORT USER IP FILE-OUTPUT
____HERE