আপনি এখানে ডকুমেন্টস এবং বিড়ালের সাথে মিলিয়ে আউটপুট পুনঃনির্দেশকে কীভাবে ব্যবহার করবেন?


56

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

আমি এটি ব্যবহার করে করতে পারি echo:

echo "touch somefile
echo foo > somefile" | sh

আমি প্রায় একই জিনিস ব্যবহার করে করতে পারি cat:

cat << EOF
touch somefile
echo foo > somefile
EOF

তবে আমি যদি "ইওএফ" কে "ইওএফ | শ" দিয়ে প্রতিস্থাপন করি তবে এটি কেবল এটি বংশগতির অংশ বলে মনে করে।

আমি কীভাবে এটি তৈরি করতে পারি যাতে catস্টিডিন থেকে পাঠ্য আউটপুট হয় এবং তারপরে এটি একটি স্বেচ্ছাসেবী স্থানে পাইপ দেয়?


touchসেখানে না থাকলে ঠিক কী চান? শুধু ইনপুট ফাইল পড়া এবং stdout সঙ্গে অন্যে পুনর্নির্দেশ?
রাহুল পাতিল

2
@ রাহুলপাতিল অবশ্যই এটি অকেজো। উত্তরাধিকারকে আরও ভালভাবে বর্ণনা করার জন্য আমি কেবল একাধিক লাইনের সাথে একটি উদাহরণ চেয়েছিলাম। এবং ব্যবহার করে উদাহরণটি দেখুন echo- আমি ভাবছিলাম যে এর সমতুল্য কী ব্যবহার করবে cat
strugee

আপনার উদাহরণটি shএকাধিক স্ট্রিংয়ের বাইরে একটি স্ক্রিপ্ট তৈরি করছে এবং এটি সরাসরি প্রেরণ করছে sh। আমি আপনার প্রশ্নটি দেখতে পেয়েছি যে এখানে একটি হর ডকুমেন্ট সহ একাধিক কমান্ডের পাঠ্য আউটপুট সরাসরি কমান্ডে প্রেরণ করতে চাইছি। যা অ্যাশের উত্তরের দ্বিতীয় উদাহরণটি করে।
ডেভ এক্স

উত্তর:


91

এটি করার একাধিক উপায় রয়েছে। সবচেয়ে সহজ সম্ভবত এটি:

cat <<EOF | sh
touch somefile
echo foo > somefile
EOF

আর একটি, যা আমার মতে সুন্দর বাক্য গঠন:

(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh

এটি পাশাপাশি কাজ করে তবে সাবসেল ছাড়াই:

{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh

আরও বিভিন্নতা:

cat <<EOF |
touch somefile
echo foo > somefile
EOF
  sh

বা:

{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF

যাইহোক, আমি আশা করি catআপনার প্রশ্নে ব্যবহারটি অন্য কোনও কিছুর জন্য স্থানধারক। যদি তা না হয় তবে এটি বের করে দিন:

sh <<EOF
touch somefile
echo foo > somefile
EOF

যা এটিকে সরল করা যেতে পারে:

sh -c 'touch somefile; echo foo > somefile'

বা:

sh -c 'touch somefile
echo foo > somefile'

পাইপিংয়ের পরিবর্তে আউটপুট পুনঃনির্দেশ করা হচ্ছে

sh >out <<EOF
touch somefile
echo foo > somefile
EOF

catএর সমতুল্য পেতে ব্যবহার echo test > out:

cat >out <<EOF
test
EOF

একাধিক এখানে নথি

( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2

এটি আউটপুট উত্পাদন করে:

hi
---
there

যা চলছে তা এখানে:

  • শেলটি দেখে ( ... )এবং একটি সাব- শেলের সাথে বদ্ধ কমান্ডগুলি চালায়।
  • বিড়াল এবং প্রতিধ্বনি যথেষ্ট সহজ। দ্য cat <&3ফাইল বর্ণনাকারী সঙ্গে বিড়াল চালানোর জন্য বলছেন (FD) 0 (stdin) FD 3 থেকে আপনাকে পুনঃনির্দেশিত; অন্য কথায়, বিড়াল এফডি 3 থেকে ইনপুট আউট।
  • (...)শুরুর আগে শেলটি দুটি নথিকে পাইপগুলির পড়ার পাশ দিয়ে পুনর্নির্দেশ এবং বিকল্প fd 0 ( <<EOF) এবং fd 3 ( 3<<EOF2) দেখতে পাবে
  • প্রাথমিক কমান্ডটি শুরু হয়ে গেলে, ইওএফ পৌঁছা না হওয়া পর্যন্ত শেলটি তার স্টিনটি পড়ে এবং প্রথম পাইপের রাইট-সাইডে প্রেরণ করে
  • এর পরে, এটি ইওএফ 2 এবং দ্বিতীয় পাইপের লিখিত দিকের সাথে একই কাজ করে

দ্বিতীয় থেকে শেষ উদাহরণ দেওয়া, আপনি পাইপিংয়ের পরিবর্তে স্টাডাউট পুনর্নির্দেশের সাথে একটি উদাহরণ দিতে পারেন?
strugee

আমি উত্তরটি পুনঃনির্দেশিত উদাহরণ দিয়ে সম্পাদনা করেছি; আপনি সম্পাদনা করতে চান এই ফর্মটি কি? যদি তা না হয়, আপনি কেবল সেই অংশটির প্রথম লাইনটি পরিষ্কার করতে পারেন?
ছাই

1
এটি শেল কীভাবে এটি প্রক্রিয়া করে তা বুঝতে সাহায্য করতে পারে। যখন এটি কমান্ড-লাইনটি মূল্যায়ন করে এবং << ইওএফটি সন্ধান করে, তখন এটি স্ট্যান্ডার্ড ইনপুট থেকে পড়া হয় যতক্ষণ না হয় কেবল ইওএফ সহ একটি লাইন পাওয়া যায় না, বা ইনপুট-এর শেষ হয় না। মূল কমান্ড-লাইনের অন্য যেগুলি এখনও অপসারণ করা হয়নি তারপরে প্রক্রিয়া চালিয়ে যায়। সুতরাং, উদাহরণস্বরূপ, এটির মতো কিছু করা সম্ভব: (cat; echo ---; exec <&3; cat) <<EOF 3<<EOF2 >outএবং তারপরে এই কমান্ডটিকে পর পর দুটি ব্লক দিয়ে ইনপুট দিন।
ছাই

শেল প্রসেসিংয়ের আপনার ব্যাখ্যাটি আকর্ষণীয় তবে আমার মাথার উপরে :) আমি যা জানতে চেয়েছিলাম হেরডোক ব্যবহার করে তার catসমতুল্য কী হবে echo test > out। যেখানে আপনার প্রদত্ত উদাহরণ পাইপের শেষে একটি পুনর্নির্দেশ যোগ করেছে।
strugee

1
@ অলিভিয়ারডুলাক - আমি উত্তরে একাধিক হেরডোক উদাহরণ যুক্ত করেছি।
ছাই

1

আমি কেবল উল্লেখ করতে চাই যে ব্যবহার meowকরা ঠিক ততটাই বৈধ EOF

এই স্ক্রিপ্টটি Meow!নামের একটি ফাইলের সাথে যুক্ত হবে cat:

#!/bin/sh
cat <<meow>> cat
Meow!
meow

হিসাবে সংরক্ষণ করুন catsএবং এটি দিয়ে সম্পাদনযোগ্য করুন chmod +x cats, তারপরে এটি চালান ./cats:

$ ./cats
$ cat cat
Meow!
$ ./cats
$ cat cat
Meow!
Meow!

ব্যাখ্যা:

  • cat <<meowহয় এখানে ডকুমেন্ট সিনট্যাক্স। এটি স্ক্রিপ্টটিকে স্ট্রিংয়ের মুখোমুখি না হওয়া অবধি এই লাইনটি অনুসরণ করে এমন পাঠ্যের ব্লক বাছাই করতে নির্দেশ দেয় meow। এরপরে সামগ্রীগুলি আউটপুট করা হবে (বা পাশাপাশি পাইপ করা হবে)।
  • >> catফাইল করা পাইপ cat
  • এর >পরিবর্তে এটি ব্যবহার করার পরিবর্তে >>ফাইলটি ওভাররাইট করে।
  • Meow!এখানে নথির বিষয়বস্তু ।
  • meowএখানে নথির শেষ চিহ্নিতকারী । বিষয়বস্তুগুলি ব্যবহারের সাথে >>যুক্ত হয় cat

উভয় stdout এবং একটি ফাইল পাইপিং:

আপনি যে পাইপটি অনুরোধ করেছেন তা করতে, এখানে কোনও নথির প্রয়োজন নেই।

catউভয়ই আউটপুট পাঠ্য এবং পাঠ্য বরাবর পাস করতে পারে না, তবে teeআপনি যা চাইছেন তার জন্য এটি একটি নিখুঁত মিল:

echo echo | tee tee

এটি উভয় আউটপুট স্ট্রিং echoএবং echoএকটি ফাইল লিখতে হবে tee

আপনি catযদি প্রয়োজনের অংশ হয় তবে এর সাথেও আউটপুটটি পাস করতে পারবেন :

echo echo | tee tee | cat </dev/stdin

বা শুধু:

echo echo | tee tee | cat

ফাইলের বিষয়বস্তু:

$ cat tee
echo

1
এটি আসলে প্রশ্নের উত্তর দেয় না। এছাড়াও >পাইপ তৈরি করে না যেমন আপনার শেষ বুলেট বোঝা।
strugee

2
@ মরজি, >পাইপগুলি তৈরি করতে পারে zshযখন একই এফডি একাধিকবার পুনর্নির্দেশ করা হয় হিসাবে echo foo >&1 > teeবা হিসাবে echo foo > tee | cat, যেখানে উভয় এবং ফাইলের আউটপুট খাওয়ানোর জন্য zshএকটি অভ্যন্তরীণ প্রয়োগ করে । teeechocattee
স্টাফেন চেজেলাস

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