कैट कैसे करें << EOF >> कोड वाली फाइल?


101

मैं एक फाइल में कोड का उपयोग करके प्रिंट करना चाहता हूं cat <<EOF >>:

cat <<EOF >> brightup.sh
!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

लेकिन जब मैं फ़ाइल आउटपुट की जाँच करता हूँ, मुझे यह मिलता है:

!/bin/bash
curr=1634
if [  -lt 4477 ]; then
   curr=406;
   echo   > /sys/class/backlight/intel_backlight/brightness;
fi

मैंने सिंगल कोट्स लगाने की कोशिश की, लेकिन आउटपुट भी सिंगल कोट्स को कैरी करता है। मैं इस मुद्दे से कैसे बच सकता हूं?


2
आपको शेबंग को भी ठीक करना चाहिए। पहली पंक्ति को शाब्दिक रूप से #!/bin/bashऔर कुछ नहीं होना चाहिए - वही #!है जो इसे एक वैध शेबंग रेखा में बनाता है, और इसके बाद जो आता है वह दुभाषिया का मार्ग है।
ट्रिपल

1
देखें man bash, और खोजें Here Documents। वहां सभी विवरण।
हांग

1
एक देर से आने के रूप में, प्रक्रिया प्रतिस्थापन के लिए आधुनिक वाक्यविन्यास $(command)इसके बजाय है `command`। एक फ़ाइल की सामग्री को प्राप्त करने के लिए, बैश है$(<file)
tripleee

जवाबों:


159

आपको केवल एक न्यूनतम परिवर्तन की आवश्यकता है; एकल-दस्तावेज़ यहाँ दस्तावेज़ के बाद परिसीमन <<

cat <<'EOF' >> brightup.sh

या अनिवार्य रूप से बैकस्लैश-इससे बच जाएं:

cat <<\EOF >>brightup.sh

उद्धृत किए बिना, यहां दस्तावेज़ आपको चर प्रतिस्थापन से गुजरना होगा, बैकटिक्स का मूल्यांकन किया जाएगा, आदि, जैसे आपने खोजा था।

यदि आपको कुछ का विस्तार करने की आवश्यकता है, लेकिन सभी नहीं, मूल्यों, आपको व्यक्तिगत रूप से उन लोगों से बचने की आवश्यकता है जिन्हें आप रोकना चाहते हैं।

cat <<EOF >>brightup.sh
#!/bin/sh
# Created on $(date # : <<-- this will be evaluated before cat;)
echo "\$HOME will not be evaluated because it is backslash-escaped"
EOF

उत्पादन करेंगे

#!/bin/sh
# Created on Fri Feb 16 11:00:18 UTC 2018
echo "$HOME will not be evaluated because it is backslash-escaped"

जैसा कि @fedorqui द्वारा सुझाया गया है , यहाँ से प्रासंगिक अनुभाग है man bash:

यहाँ दस्तावेज़

इस प्रकार के पुनर्निर्देशन से शेल को वर्तमान स्रोत से इनपुट पढ़ने का निर्देश दिया जाता है जब तक कि केवल सीमांकक (कोई पीछे न हटने वाले रिक्त स्थान) वाली लाइन देखी जाती है। उस बिंदु तक पढ़ी गई सभी लाइनें तब कमांड के लिए मानक इनपुट के रूप में उपयोग की जाती हैं।

यहाँ दस्तावेजों का प्रारूप है:

      <<[-]word
              here-document
      delimiter

कोई पैरामीटर विस्तार, कमांड प्रतिस्थापन, अंकगणितीय विस्तार, या pathname विस्तार शब्द पर किया जाता है। यदि शब्द के किसी भी अक्षर को उद्धृत किया जाता है, तो सीमांकक शब्द पर उद्धरण हटाने का परिणाम है, और यहां दस्तावेज़ में लाइनों का विस्तार नहीं किया गया है। यदि शब्द अयोग्य है, तो यहां दस्तावेज़ की सभी पंक्तियों को पैरामीटर विस्तार, कमांड प्रतिस्थापन और अंकगणितीय विस्तार के अधीन किया गया है । उत्तरार्द्ध मामले में, वर्ण अनुक्रम \ "को नजरअंदाज किया जाता है, और वर्णों को उद्धृत करने के लिए \ _, $, और` का उपयोग किया जाना चाहिए।


1
मैं आपको चिह्नित करता हूं कि हेरेडोक के विस्तार वाले चर से कैसे बचें? इस एक की नकल के रूप में। कोई आपत्ति नहीं, केवल यह कि मैं बैश डॉक्स संदर्भ को शामिल करूंगा, जैसा कि मैंने किया था (जो केवल 13k यात्राओं में लगभग 100 प्रतिनिधि मिले, इसलिए यह काफी मददगार लगता है)।
फेडोरक्वी 'एसओ

@fedorqui शायद आप इस सवाल का जवाब वास्तव में देना चाहते हैं? या हम डुप्लिकेट मार्किंग को दूसरे तरीके से बदल सकते हैं; मैंने सिर्फ सवाल स्कोर देखा, जवाब स्कोर ज्यादा नहीं।
ट्रिपल जू

हम्म , उन्हें विलय के बारे में क्या यह एक लक्ष्य सवाल के रूप में? डुप्लिकेट प्रश्न का एक अच्छा शीर्षक है, केवल यह कि यह बहुत लंबा है। हालांकि, यह किसी भी तरह देर से बाहर बहुत अधिक ध्यान दिया गया है (मैं प्रति माह कुछ upvotes हो रहा है )।
फेडोरक्वी 'एसओ

@fedorqui मुझे विलय की अवधारणा पसंद है लेकिन मैंने कभी ऐसा नहीं देखा है कि यह व्यवहार में होता है; यदि मैं स्थिति को सही ढंग से समझता हूं, तो मोड बस nontrivial merges को संभालने में सक्षम नहीं हैं क्योंकि झंझटों और जटिलताओं ने लाभ को दूर कर दिया है। मैंने एक या दो बार जो किया है वह एक उपयोगी और उत्कीर्ण उत्तर को हटा देता है और इसे एक अलग प्रश्न के तहत पुन: पोस्ट करता है, हालांकि मैं शायद ही इस समाधान की सिफारिश कर सकता हूं।
ट्रिपल जू

यह बताना कठिन है कि यह कब करने योग्य है। मैंने इसे एक साइट I मॉड में किया है, जब एक अच्छा सवाल नोट किए बिना पोस्ट किया गया था, पहले से एक और अच्छा था, दोनों में अच्छे उत्तर थे। मेरे 90+ स्कोर उत्तर को हटाने से अच्छी योजना नहीं लगती है, क्योंकि यह उस प्रश्न को अनाथ कर देगा।
फेडोरक्वी 'एसओ

20

या, अपने ईओएफ मार्करों का उपयोग करते हुए, आपको प्रारंभिक मार्कर को उद्धृत करने की आवश्यकता है ताकि विस्तार नहीं होगा:

#-----v---v------
cat <<'EOF' >> brightup.sh
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
   curr=$((curr+406));
   echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi
EOF

IHTH


1
मैं आपकी पोस्ट को संपादित कर दूंगा लेकिन सुरक्षित होने के लिए यह # नहीं होना चाहिए? / बिन / बैश और नहीं! / बिन / बैश?
मैथ्यू होगन

@MatthewHoggan: हाँ, आप सही हैं! उस पकड़ने के लिए धन्यवाद। मैं अब इसे ठीक कर रहा हूं।
शेल्टर

16

यह काम करना चाहिए, मैंने अभी इसका परीक्षण किया और इसने उम्मीद के मुताबिक काम किया: कोई विस्तार, प्रतिस्थापन, या क्या-क्या हुआ।

cat <<< '
#!/bin/bash
curr=`cat /sys/class/backlight/intel_backlight/actual_brightness`
if [ $curr -lt 4477 ]; then
  curr=$((curr+406));
  echo $curr  > /sys/class/backlight/intel_backlight/brightness;
fi' > file # use overwrite mode so that you don't keep on appending the same script to that file over and over again, unless that's what you want. 

निम्नलिखित का उपयोग करना भी काम करता है।

cat <<< ' > file
 ... code ...'

इसके अलावा, यह ध्यान देने योग्य है कि heredocs का उपयोग करते समय, जैसे कि << EOF, प्रतिस्थापन और चर विस्तार और इसी तरह जगह लेता है। तो कुछ ऐसा कर रहे हैं:

cat << EOF > file
cd "$HOME"
echo "$PWD" # echo the current path
EOF

हमेशा चर के विस्तार में परिणाम होगा $HOMEऔर $PWD। इसलिए यदि आपकी होम डाइरेक्टरी है /home/foobarऔर वर्तमान पथ है /home/foobar/bin, fileतो इस तरह दिखेगा:

cd "/home/foobar"
echo "/home/foobar/bin"

अपेक्षित के बजाय:

cd "$HOME"
echo "$PWD"

2
यहाँ एकल उद्धरण में स्ट्रिंग में स्पष्ट रूप से कोई एकल उद्धरण नहीं हो सकता है, जो एक निषेधात्मक मुद्दा हो सकता है। यदि आपके पास एक स्क्रिप्ट है, जिसमें दस्तावेज़ों में एकल और दोहरा उद्धरण शामिल हैं, तो दस्तावेज़ केवल एकमात्र वर्कअराउंड हैं, हालाँकि ओपी के सरल उदाहरण के साथ ऐसा नहीं है। इसके अलावा, स्पर्शरेखा के अनुसार, यहां स्ट्रिंग्स <<<केवल बैश 3 से शुरू होती हैं, न कि अन्य गोले से पोर्टेबल।
ट्रिपल जू

<<<भी Zsh में उपलब्ध है
Alexej मगुरा

3
आज मैंने सीखा कि आप फ़ाइल नाम को तुरंत हेरेडोक में खोलने का अनुसरण कर सकते हैं। धन्यवाद @AlexejMagura!
chaseadamsio
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.