আমি কীভাবে বাশ স্ক্রিপ্টে কোনও ফাইলকে হেরিডোক লিখতে পারি?


উত্তর:


1070

পড়ুন অ্যাডভান্সড ব্যাশ-স্ক্রিপ্টিং গাইড অধ্যায় 19. এখানে ডকুমেন্টস

এখানে একটি উদাহরণ যা কোনও ফাইলের বিষয়বস্তু লিখবে /tmp/yourfilehere

cat << EOF > /tmp/yourfilehere
These contents will be written to the file.
        This line is indented.
EOF

নোট করুন যে চূড়ান্ত 'ইওএফ' (দ্য 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

11
আপনার এমনকি বাশেরও দরকার নেই, এই বৈশিষ্ট্যটি বোর্ন / কর্ন / পসিক্স শেলগুলিতেও রয়েছে।
জানুস ট্রোলসন

5
কি সম্পর্কে <<<, তারা কি বলা হয়?
জর্জেন পল

18
@ আনারসউন্ডারসিটি'কে <<<'হিয়ার স্ট্রিংস' বলা হয়। কোড মত tr a-z A-Z <<< 'one two three'স্ট্রিং ফলাফল ONE TWO THREE। এ সম্পর্কে আরও তথ্য en.wikipedia.org/wiki/Here_document#Here_strings
স্টিফান Lasiewski

8
চূড়ান্ত ইওএফ এর পরে কোনও সাদা জায়গা থাকা উচিত নয় । কমপক্ষে বাশ এ, এর ফলাফল এটি সীমানা হিসাবে স্বীকৃত
carpii

10
যেহেতু এই নির্দিষ্ট বংশধর প্রতিস্থাপনের পরিবর্তে আক্ষরিক বিষয়বস্তু হিসাবে চিহ্নিত করা হয়েছে, এটি <<'EOF'পরিবর্তে হওয়া উচিত <<EOF
চার্লস ডাফি

152

এর পরিবর্তে ব্যবহার করার catও ইনপুট / আউটপুটের ফেরৎ এটি ব্যবহার করতে সহায়ক হতে পারে teeপরিবর্তে:

tee newfile <<EOF
line 1
line 2
line 3
EOF

এটি আরও সংক্ষিপ্ত, পুনর্নির্দেশ অপারেটরের বিপরীতে এটি সংযুক্ত হতে পারে sudoযদি আপনাকে রুট অনুমতি নিয়ে ফাইলগুলিতে লেখার প্রয়োজন হয়।


18
আমি > /dev/nullএখানে ফাইলের বিষয়বস্তু তৈরি হওয়ার পরে স্টডআউটে প্রদর্শিত হওয়া রোধ করতে প্রথম লাইনের শেষে যুক্ত করার পরামর্শ দেব ।
জো ক্যারল

11
সত্য, তবে আপনার সমাধানটি sudoতার সংকোচনের কারণে তার সামঞ্জস্যতার কারণে আমার কাছে আবেদন করেছিল :-)
জো ক্যারল

2
বিদ্যমান ফাইলে সংযুক্ত করতে আপনি এই পদ্ধতিটি কীভাবে ব্যবহার করবেন?
মাউন্টেনএক্স

5
@MountainX পরীক্ষা করে দেখুন man tee-aওভাররাইটের পরিবর্তে পতাকা যুক্ত করতে ফ্ল্যাগটি ব্যবহার করুন ।
লিভভেন

3
একটি কনফিগার স্ক্রিপ্ট ব্যবহার করার জন্য যা আমার মাঝে মাঝে তদারকি করা প্রয়োজন, আমি এটি আরও পছন্দ করি কারণ এটি সামগ্রীগুলি মুদ্রণ করে।
অ্যালোস মাহডাল

59

বিঃদ্রঃ:

প্রশ্ন (এখানে বাশ স্ক্রিপ্টের কোনও ফাইলকে কীভাবে একটি দস্তাবেজ (ওরফে হেরডোক ) লিখবেন ?) এর (কমপক্ষে) 3 টি প্রধান স্বতন্ত্র মাত্রা বা সাবকিউশন রয়েছে:

  1. আপনি কি একটি বিদ্যমান ফাইলটি ওভাররাইট করতে চান, একটি বিদ্যমান ফাইলে সংযোজন করতে চান, বা একটি নতুন ফাইলে লিখতে চান?
  2. আপনার ব্যবহারকারী বা অন্য কোনও ব্যবহারকারী (যেমন, root) ফাইলটির মালিক?
  3. আপনি কি আপনার হেরডোকের বিষয়বস্তু আক্ষরিক লিখতে চান, বা বাশকে আপনার বংশের অভ্যন্তরে পরিবর্তনশীল উল্লেখগুলি ব্যাখ্যা করতে চান?

(অন্যান্য মাত্রা / অনুচ্ছেদ রয়েছে যা আমি গুরুত্বপূর্ণ বলে বিবেচনা করি না। এগুলি যুক্ত করার জন্য এই উত্তরটি সম্পাদনা করার বিষয়টি বিবেচনা করুন!) উপরে বর্ণিত বিভিন্ন প্রশ্নের বিভিন্ন মাত্রার সাথে বিভিন্ন বিস্ময়কর শনাক্তকারী উপস্থিত রয়েছে - এখানে কিছুই নেই পবিত্র সম্পর্কে EOF, কেবল নিশ্চিত হয়ে নিন যে আপনি আপনার সীমানা চিহ্নিতকারী হিসাবে যে স্ট্রিংটি ব্যবহার করেন তা আপনার বংশের ভিতরে না ঘটে:

  1. আপনার মালিকানাধীন বিদ্যমান ফাইলটি (বা একটি নতুন ফাইলে লিখুন) ওভাররাইট করতে হেরডকের ভিতরে ভেরিয়েবল রেফারেন্স স্থাপন করুন:

    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
  2. আপনার মালিকানাধীন একটি বিদ্যমান ফাইল (বা একটি নতুন ফাইলে লিখুন) সংযোজন করতে হেরডকের ভিতরে ভেরিয়েবল রেফারেন্স স্থাপন করুন:

    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
  3. হেরডোকের আক্ষরিক বিষয়বস্তু সহ আপনার নিজের একটি বিদ্যমান ফাইল (বা একটি নতুন ফাইলে লিখুন) ওভাররাইট করতে:

    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
  4. হেরডোকের আক্ষরিক বিষয়বস্তু সহ আপনার নিজের একটি বিদ্যমান ফাইল (বা একটি নতুন ফাইলে লিখুন) সংযুক্ত করতে:

    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
  5. মূলের মালিকানাধীন একটি বিদ্যমান ফাইল (বা একটি নতুন ফাইলে লিখুন) ওভাররাইট করতে হেরডকের ভিতরে ভেরিয়েবল রেফারেন্স স্থাপন করে:

    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
  6. হেরডোকের আক্ষরিক বিষয়বস্তু সহ ব্যবহারকারী = 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

# 6 সেরা। কিন্তু আপনি কীভাবে বিদ্যমান ফাইলের বিষয়বস্তু # 6 দিয়ে ওভাররাইট করবেন?
আলেকসান্দ্র মাকভ

2
@ আলেকসান্দ্র মাকভ: আপনি কীভাবে # 6 দিয়ে বিদ্যমান ফাইলের বিষয়বস্তুগুলিকে ওভাররাইট করবেন? ছাড়ুন -a== --append; যেমন, tee -a-> tee। দেখুন info tee(আমি এটি এখানে উদ্ধৃত করেছি, কিন্তু মন্তব্য মার্কআপ খুব সীমিত।
টমরোচ

1
# 6 এর পরিবর্তে বিড়াল এবং টিপিংয়ের পরিবর্তে টিপ ব্যবহার করার কোনও সুবিধা রয়েছে sudo tee /path/to/your/file << 'Screw_you_Foo'?
কোডমোনকি

কেন FOEপরিবর্তে EOFপরিশেষে যোগ উদাহরণে?
বেকো

2
@ বেকো: কেবলমাত্র লেবেলটি কেবল একটি লেবেল তা বোঝানোর জন্য। নোট করুন যে আমি প্রতিটি উদাহরণে একটি পৃথক লেবেল ব্যবহার করেছি।
টমরোচে

41

@ লিভভেনের উত্তরটি তৈরি করতে , এখানে কয়েকটি দরকারী সংমিশ্রণ রয়েছে।

  1. ভেরিয়েবল সাবস্টিটিউশন, শীর্ষস্থানীয় ট্যাব ধরে রাখা, ফাইল ওভাররাইট, স্টকআউট প্রতিধ্বনি

    tee /path/to/file <<EOF
    ${variable}
    EOF
  2. কোনও পরিবর্তনশীল বিকল্প নেই , শীর্ষস্থানীয় ট্যাব ধরে রাখা হয়েছে, ফাইলকে ওভাররাইট করুন, স্টডআউটে প্রতিধ্বনি হবে

    tee /path/to/file <<'EOF'
    ${variable}
    EOF
  3. ভেরিয়েবল সাবস্টিটিউশন, শীর্ষস্থানীয় ট্যাব সরানো , ওভাররাইট ফাইল, স্টকআউট প্রতিধ্বনি

    tee /path/to/file <<-EOF
        ${variable}
    EOF
  4. ভেরিয়েবল সাবস্টিটিউশন, শীর্ষস্থানীয় ট্যাব ধরে রাখা, ফাইলের সাথে সংযোজন , স্টাডাউটের প্রতিধ্বনি

    tee -a /path/to/file <<EOF
    ${variable}
    EOF
  5. ভেরিয়েবল সাবস্টিটিউশন, শীর্ষস্থানীয় ট্যাব ধরে রাখা, ফাইল ওভাররাইট, স্টাডাউটের কোনও প্রতিধ্বনি নেই

    tee /path/to/file <<EOF >/dev/null
    ${variable}
    EOF
  6. উপরের sudoপাশাপাশি একত্রিত করা যেতে পারে

    sudo -u USER tee /path/to/file <<EOF
    ${variable}
    EOF

16

যখন রুট অনুমতি প্রয়োজন হয়

গন্তব্য ফাইলের জন্য যখন রুট অনুমতিগুলি প্রয়োজন হয়, তার |sudo teeপরিবর্তে ব্যবহার করুন >:

cat << 'EOF' |sudo tee /tmp/yourprotectedfilehere
The variable $FOO will *not* be interpreted.
EOF

এখানে কী নথিতে ভেরিয়েবলগুলি পাস করা সম্ভব? আপনি কীভাবে এটি পেতে পারেন $ এফইও ব্যাখ্যা করা হয়েছিল?
ব্যবহারকারী 1527227

@ user1527227 উদাহরণ হিসাবে এখানে ফাইলটি বলে: ভেরিয়েবল $ এফওও ব্যাখ্যা করা হবে না
সার্জ স্ট্রোব্যা্যান্ড্ট

নীচে আমি এই উত্তরটি স্টেফান লাসিউস্কির সাথে একত্রিত করার এবং সংগঠিত করার চেষ্টা করেছি
টমরোচে

3
@ user1527227 EF- কে কেবল একক উদ্ধৃতিতে বন্ধ করবেন না। তারপরে $ এফওও ব্যাখ্যা করা হবে।
imnd_neel

11

ভবিষ্যতের লোকদের যাদের এই সমস্যাটি থাকতে পারে তাদের জন্য নিম্নলিখিত ফর্ম্যাটটি কাজ করেছে:

(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

6
প্রথম বন্ধনী প্রয়োজন নেই: cat << END > afileহেরডোক অনুসরণ করে পুরোপুরি ভাল কাজ করে।
গ্লেন জ্যাকম্যান

ধন্যবাদ, এটি আসলে আমার অন্য একটি সমস্যার সমাধান হয়েছে। এখানে কয়েকটি ডক্সের পরে কিছু সমস্যা ছিল। আমি মনে করি এটি প্যারেনগুলির সাথে করার ছিল, যেমন এটি উপরে দেওয়া পরামর্শের সাথে fixed
জোশুয়া এনফিল্ড

2
এটি কাজ করবে না। আউটপুট পুনঃনির্দেশটি লাইনের শেষে হওয়া দরকার যা গ্রহণিত catউত্তরের মতো প্রদর্শিত হয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
@ ডেনিসউইলিইমসন এটি কাজ করে, প্যারেনদের জন্য এটিই। পুরো catএকটি subshell, এবং সমস্ত subshell আউটপুট ভিতরে রান ফাইল থেকে আপনাকে পুনঃনির্দেশিত করা হয়
Izkata

2
@ ইজকাটা: আপনি যদি এই উত্তরের সম্পাদনার ইতিহাসের দিকে লক্ষ্য করেন তবে আমি আমার মন্তব্য করার আগেই প্রথম বন্ধনী সরিয়ে ফেলা হয়েছিল এবং তারপরে আবার যুক্ত করব। গ্লেন জ্যাকম্যানের (এবং আমার) মন্তব্য প্রযোজ্য।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

3

উদাহরণস্বরূপ আপনি এটি ব্যবহার করতে পারেন:

প্রথম (এসএসএস সংযোগ তৈরি করা):

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

-1

আমি একটি ইন্ডেন্টেড স্ক্রিপ্টে সংক্ষিপ্তকরণ, পাঠযোগ্যতা এবং উপস্থাপনার জন্য এই পদ্ধতিটি পছন্দ করি:

<<-End_of_file >file
       foo bar
End_of_file

যেখানে →       একটি tabচরিত্র।

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