ব্যাশ হেরেডকের ভিতরে ভেরিয়েবল ব্যবহার করা


192

আমি ব্যাশ হেরেডকের ভিতরে ভেরিয়েবলগুলি বিভক্ত করার চেষ্টা করছি:

var=$1
sudo tee "/path/to/outfile" > /dev/null << "EOF"
Some text that contains my $var
EOF

আমি আশা করি ( $varএটি আক্ষরিকভাবে চিকিত্সা করা হয়, প্রসারিত হয় না) এটি কাজ করছে না।

আমার ব্যবহার প্রয়োজন sudo teeকারণ ফাইলটি তৈরি করতে সুডোর প্রয়োজন। এরকম কিছু করা:

sudo cat > /path/to/outfile <<EOT
my text...
EOT

কাজ করে না, কারণ >outfileবর্তমান শেলটিতে ফাইলটি খোলে, যা সুডো ব্যবহার করে না।


9
এটি একটি বোধগম্য বিভ্রান্তি! যেমনটি নীচে উল্লিখিত হয়েছে, ডিলিমিটারের কোনও অংশ উদ্ধৃত করে হেরডোকের সম্প্রসারণ বন্ধ করে দেয় (যেন এটি ছিল ''), কিন্তু ডিলিমিটারের উদ্ধৃতি না দিয়ে সম্প্রসারণকে প্রসারিত করে (যেন এটি ছিল "")) যাইহোক, পার্লে আপনার স্বজ্ঞাততা সঠিক, যেখানে একক-উদ্ধৃত শনাক্তকারীর সাথে একটি হেরডোক এমনভাবে আচরণ করে যেন এটি একক উদ্ধৃতিতে থাকে, একটি দ্বিগুণ উদ্ধৃত শনাক্তকারী যেমন একটি ডাবল উদ্ধৃতিতে, এবং একটি ব্যাক-টিকড শনাক্তকারীর সাথে ব্যাকটিক্সের মতো ! দেখুন: পারলপ: << ইওএফ
নীল ভন বার্থ

উত্তর:


252

আপনার প্রথম প্রশ্নের উত্তরে, প্যারামিটারের বিকল্প নেই কারণ আপনি উদ্ধৃতিতে ডিলিমিটার রেখেছেন - ব্যাশ ম্যানুয়ালটি বলে :

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

      <<[-]word
              here-document
      delimiter

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

পরিবর্তে আপনি যদি আপনার প্রথম উদাহরণটি ব্যবহার করার <<EOFপরিবর্তে দেখতে পান তবে << "EOF"এটি কার্যকর হয়।

আপনার দ্বিতীয় উদাহরণে, শেলটি sudoকেবলমাত্র প্যারামিটারের সাথেই আহ্বান জানায় catএবং পুনঃনির্দেশটি sudo catমূল ব্যবহারকারী হিসাবে আউটপুটে প্রযোজ্য । আপনি চেষ্টা করলে এটি কাজ করবে:

sudo sh -c "cat > /path/to/outfile" <<EOT
my text...
EOT

: যদি আপনার আগ্রহী আপনার কাছে এই কাজ করতে পারে (cat > /path/to/outfile) <<EOFস্থানেsudo sh -c ... <<EOF
ভলতেয়ার

দয়া করে আমাকে বলুন বাশে দাফন করা এটির একটি ভাল কারণ।
ল্যান্ডন কুহান

96

এর সাথে উদ্ধৃতি ব্যবহার করবেন না <<EOF:

var=$1
sudo tee "/path/to/outfile" > /dev/null <<EOF
Some text that contains my $var
EOF

চলক সম্প্রসারণ হ'ল ডকসগুলির অভ্যন্তরের ডিফল্ট আচরণ। আপনি লেবেল উদ্ধৃত করে (একক বা ডাবল উদ্ধৃতি সহ) সেই আচরণটি অক্ষম করুন।


36

এখানে পূর্বের উত্তরগুলির দেরি সহকর্মী হিসাবে, আপনি সম্ভবত এমন পরিস্থিতিতে শেষ হয়ে যাবেন যেখানে আপনি কিছু চান তবে সমস্ত ভেরিয়েবলগুলি সংযোগযুক্ত হওয়া উচিত নয় । ডলার চিহ্ন এবং ব্যাকটিকগুলি এড়াতে ব্যাকস্ল্যাশ ব্যবহার করে আপনি এটি সমাধান করতে পারেন; অথবা আপনি স্থিতিশীল পাঠ্যটি একটি পরিবর্তনশীলতে রাখতে পারেন।

Name='Rich Ba$tard'
dough='$$$dollars$$$'
cat <<____HERE
$Name, you can win a lot of $dough this week!
Notice that \`backticks' need escaping if you want
literal text, not `pwd`, just like in variables like
\$HOME (current value: $HOME)
____HERE

ডেমো: https://ideone.com/rMF2XA

মনে রাখবেন যে উদ্ধৃতিপ্রযুক্তিগুলির কোনও - \____HEREবা "____HERE"বা '____HERE'- সমস্ত পরিবর্তনশীল প্রবৃত্তি অক্ষম করবে, এবং এখানে-নথিটি আক্ষরিক পাঠ্যের টুকরোতে পরিণত করবে।

একটি সাধারণ কাজ হ'ল স্ক্রিপ্টের সাথে স্থানীয় ভেরিয়েবলগুলি একত্রিত করা যা কোনও আলাদা শেল, প্রোগ্রামিং ভাষা বা দূরবর্তী হোস্ট দ্বারা মূল্যায়ন করা উচিত।

local=$(uname)
ssh -t remote <<:
    echo "$local is the value from the host which ran the ssh command"
    # Prevent here doc from expanding locally; remote won't see backslash
    remote=\$(uname)
    # Same here
    echo "\$remote is the value from the host we ssh:ed to"
:

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