কীভাবে বিড়াল করবেন << ইওএফ >> কোডযুক্ত একটি ফাইল?


104

আমি এই ফাইলটি ব্যবহার করে একটি ফাইলের মধ্যে কোড মুদ্রণ করতে চাই 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

আমি একক উদ্ধৃতি রাখার চেষ্টা করেছি তবে আউটপুটটিতে এটির সাথে একক উদ্ধৃতিও বহন করে। আমি কীভাবে এই সমস্যাটি এড়াতে পারি?


4
আপনারও শিবাং ঠিক করা উচিত। প্রথম লাইনটি আক্ষরিকভাবে হওয়া দরকার #!/bin/bashএবং অন্য কিছুই নয় - এটিই #!এটি একটি বৈধ শেবাং লাইনে পরিণত করে এবং এর পরে কী আসে তা হ'ল দোভাষীর পথ।
ট্রিপলি

4
দেখুন man bash, এবং অনুসন্ধান করুন Here Documents। সমস্ত বিবরণ সেখানে।
হংকং

4
দেরিতে আসতে একদিকে যেমন প্রক্রিয়া প্রতিস্থাপনের জন্য আধুনিক সিনট্যাক্সের $(command)পরিবর্তে হয় `command`। কোনও ফাইলের বিষয়বস্তুগুলি পাওয়ার জন্য, বাশের রয়েছে$(<file)
২:26

উত্তর:


165

আপনার কেবলমাত্র একটি সংক্ষিপ্ত পরিবর্তন প্রয়োজন; এখানে ডকুমেন্ট ডিলিমেটার পরে একক উদ্ধৃতি <<

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"

@ ফেডরকিইর পরামর্শ অনুসারে , এখানে থেকে প্রাসঙ্গিক বিভাগটি এখানে man bash:

এখানে নথি

এই ধরণের পুনর্নির্দেশটি শেলটিকে বর্তমান উত্স থেকে ইনপুট পড়ার নির্দেশ দেয় যতক্ষণ না কেবল ডেলিফিমিটার (কোনও পেছনের ফাঁকা জায়গা নয়) উপস্থিত থাকে। সেই বিন্দু পর্যন্ত পঠিত সমস্ত লাইন তখন কমান্ডের জন্য স্ট্যান্ডার্ড ইনপুট হিসাবে ব্যবহৃত হয়।

এখানে-নথির বিন্যাসটি হ'ল:

      <<[-]word
              here-document
      delimiter

কোনও পরামিতি সম্প্রসারণ, কমান্ড প্রতিস্থাপন, গাণিতিক সম্প্রসারণ, বা পথের নাম সম্প্রসারণ শব্দের উপর সঞ্চালিত হয় না। যদি শব্দের কোনও অক্ষর উদ্ধৃত হয় তবে ডিলিমিটারটি শব্দের উপর উদ্ধৃতি অপসারণের ফলাফল এবং এখানে-নথির লাইনগুলি প্রসারিত হয় না। যদি শব্দটি উদ্ধৃত না করা হয় তবে এখানে-নথির সমস্ত লাইন প্যারামিটার সম্প্রসারণ, কমান্ড প্রতিস্থাপন এবং পাটিগণিতের বিস্তারের দ্বারা সাপেক্ষ । পরবর্তী ক্ষেত্রে, অক্ষর ক্রম `উপেক্ষা করা হয়, এবং characters, $, এবং characters বর্ণগুলি উদ্ধৃত করতে অবশ্যই ব্যবহার করা উচিত`


4
আমি আপনাকে চিহ্নিত করেছি কিভাবে বংশগতি বিস্তৃত চলক এড়ানো যায়? এটির একটি সদৃশ হিসাবে কোনও আপত্তি নেই, কেবলমাত্র আমি বাশ ডক্সের রেফারেন্সটি অন্তর্ভুক্ত করব, যেমনটি আমি আমার মতো করেছিলাম (যা কেবল ১৩ কে দেখা পেয়ে প্রায় 100 জন প্রতিনিধি পেয়েছে, সুতরাং এটি বেশ সহায়ক বলে মনে হচ্ছে)।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

@ ফেডোরকুই সম্ভবত আপনি এই প্রশ্নের উত্তরটি পোর্ট করতে চান? অথবা আমরা সদৃশ অন্য চিহ্ন হিসাবে চিহ্নিত চিহ্নটি স্যুইচ করতে পারেন; আমি শুধু প্রশ্নের স্কোর দেখেছি, উত্তর স্কোর খুব বেশি নয়।
ট্রিপলি

মম তাদের লক্ষ্য সংশ্লেষ হিসাবে একীভূত করার বিষয়ে কী ? সদৃশ প্রশ্নের একটি ভাল শিরোনাম রয়েছে, কেবল এটিই দীর্ঘ। যাইহোক, এটি কোনওভাবে দেরী না হয়ে বেশ মনোযোগ পেয়েছে (আমি প্রতি মাসে কিছু উপার্জন পাচ্ছি )।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

@ ফেডরকিই আমি মার্জ করার ধারণাটি পছন্দ করি তবে বাস্তবে এটি কখনও ঘটতে দেখিনি; যদি আমি পরিস্থিতিটি সঠিকভাবে বুঝতে পারি তবে মোডগুলি কেবল অযৌক্তিক সংশ্লেষ পরিচালনা করতে সক্ষম হয় না কারণ সমস্যাগুলি এবং জটিলতাগুলি সুবিধার চেয়ে অনেক বেশি। আমি একবার বা দু'বার যা করেছি তা হ'ল একটি দরকারী এবং আপোভোটেড উত্তর মুছে ফেলা এবং এটি একটি পৃথক প্রশ্নের অধীনে পুনরায় পোস্ট করা, যদিও আমি খুব কমই এই কাজের প্রস্তাব দিতে পারি।
ট্রিপলি

এটি করা যখন মূল্যবান তা বলা শক্ত। আমি এটি এমন একটি সাইটে তৈরি করেছি যখন আমি যখন একটি ভাল প্রশ্ন পোস্ট করা হয়েছিল তখন লক্ষ্য না করেই আগে থেকে আরও একটি ভাল উত্তর দেওয়া হয়েছিল, উভয়ই ভাল উত্তর পেয়েছিল। আমার 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

আইএইচটিএইচ


4
আমি আপনার পোস্টটি সম্পাদনা করব তবে কেবল নিরাপদ থাকার জন্য এটি #! / বিন / বাশ না হওয়া উচিত! / বিন / বাশ?
ম্যাথু হোগান

@ ম্যাটহেহগান: হ্যাঁ, আপনি ঠিক বলেছেন! এটি ধরার জন্য ধন্যবাদ আমি এখন এটি ঠিক করছি।
শেল্টার

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 ...'

এছাড়াও, এটি লক্ষণীয় যে হেরডোকগুলি ব্যবহার করার সময়, যেমন << EOF, প্রতিস্থাপন এবং পরিবর্তনশীল সম্প্রসারণ এবং এর মতো সংঘটিত হয়। তাই এরকম কিছু করছেন:

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

সর্বদা ভেরিয়েবলের প্রসারণের ফলাফল হবে $HOME এবং $PWD। তাই আপনি যদি আপনার home ডিরেক্টরিতে হয় /home/foobarএবং বর্তমান পথ /home/foobar/bin, fileএই রকম হবে:

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

পরিবর্তে প্রত্যাশিত:

cd "$HOME"
echo "$PWD"

4
এখানে একক স্ট্রিং-এ একক উক্তি অবশ্যই স্পষ্টভাবে কোনও একক উক্তি ধারণ করতে পারে না, যা একটি প্রতিরোধমূলক সমস্যা হতে পারে। এখানে আপনার কাছে কোনও স্ক্রিপ্ট রয়েছে যাতে একক এবং ডাবল উভয় উক্তি থাকা দরকার, যদিও এটি ওপির সাধারণ উদাহরণের ক্ষেত্রে অবশ্যই নয় Here এছাড়াও, স্পর্শকাতরভাবে, এখানে-স্ট্রিংগুলি <<<কেবলমাত্র ব্যাশ 3 থেকে শুরু হয় এবং অন্যান্য শেলের কাছে বহনযোগ্য নয়।
ট্রিপলি

<<<Zsh এও পাওয়া যায়
আলেকজ মাগুরা

4
আজ আমি শিখেছি যে আপনি ফাইলের নামটি সঙ্গে সঙ্গে হেরডোকের কাছে খোলার অনুসরণ করতে পারেন। ধন্যবাদ @ আলেকজমগুরা!
ছাসাদামসিও

0

আমি জানি এটি একটি দুই বছরের পুরানো প্রশ্ন, তবে যারা 'কীভাবে' অনুসন্ধান করছেন তাদের জন্য এটি একটি দ্রুত উত্তর।

আপনি যদি কোনও কিছুর আশেপাশে উদ্ধৃতি রাখতে না চান তবে আপনি কেবল কোনও ফাইলের জন্য পাঠ্যের একটি ব্লক লিখতে পারেন এবং আপনি যে পাঠ্য হিসাবে রফতানি করতে চান ভেরিয়েবলগুলি এড়িয়ে চলতে চান (উদাহরণস্বরূপ স্ক্রিপ্টে ব্যবহারের জন্য) এবং আপনি চান তার থেকে বাঁচতে পারবেন না ভেরিয়েবলের মান হিসাবে রফতানি করুন।

#!/bin/bash

FILE_NAME="test.txt"
VAR_EXAMPLE="\"string\""

cat > ${FILE_NAME} << EOF
\${VAR_EXAMPLE}=${VAR_EXAMPLE} in ${FILE_NAME}  
EOF

"। {VAR_EXAMPLE} =" টেস্ট.টেক্সটে "স্ট্রিং" কে টেস্ট.টেক্সটে লিখবে

এটি ফাইলের নাম বাদ দিয়ে একই নিয়মের সাহায্যে কনসোলটিতে পাঠ্যের ব্লকগুলি আউটপুট দিতেও ব্যবহৃত হতে পারে

#!/bin/bash

VAR_EXAMPLE="\"string\""

cat << EOF
\${VAR_EXAMPLE}=${VAR_EXAMPLE} to console 
EOF

কনসোলটিতে "$ {VAR_EXAMPLE} =" স্ট্রিং "কে কনসোল আউটপুট দেবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.