ব্যাশে একাধিক এখানে-ডক্স ব্যবহার করা কি সম্ভব?


14

ব্যাশের কোনও কমান্ডে ইনপুট সরবরাহ করতে কেউ কি এখানে একাধিক ডকস ব্যবহার করতে পারে?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

স্পষ্টতই, উভয় ক্ষেত্রেই, দ্বিতীয় এখানে-ডক স্টিডিন হিসাবে ব্যবহৃত হয়, এবং প্রথম রেফারেন্সটি প্রতিস্থাপন করে। echoএর পরিবর্তে কি এস ব্যবহারের সমাধান ?

$ cat <(echo -n foo) <(echo bar)
foobar

এছাড়াও, কোনও কারণে, সংমিশ্রণটি ব্যবহার করা আমার পক্ষে কার্যকর হয়নি। কেন হবে?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

আপনি এখানে দুটি-নথি দুটি একত্রিত করার পরিবর্তে ব্যবহার করতে চান এর পিছনে কি কোনও কারণ আছে?
মটরশুটি

1
pasteডামি ইনপুটগুলি পরীক্ষা করার সময় @ বেনগুলি আমি আসলে এটিতে ছুটে এসেছি । আমি মনে করি আমি আরও কয়েকটি পরিস্থিতিতে ভাবতে পারি। আমি যদি কয়েকটি ভেরিয়েবলের প্রাক-ম্যানিপুলেটেড পাঠ্য সহ কোনও স্ক্রিপ্ট পেয়ে থাকি, তবে আমি সম্ভবত দুটি ফাইলকে একটি কমান্ড দিয়ে কিছু করতে চাই যা কেবল ফাইলগুলি নেয় diff
স্পারহাক

আর একটি ব্যবহার-কেস (আমি এখানে-দস্তাবেজ ব্যবহার করে একটি শেল স্ক্রিপ্ট তৈরি করতে এই পাওয়া যায়): আপনি ছাড়া পরিবর্তনশীল প্রসারের কয়েক লাইন এবং তারপর কিছু লাইন চাই: cat <<EOF1 <<"EOF2"
টবি স্পিড

উত্তর:


18

আপনি করতে পারেন:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

কেবলমাত্র একটি স্টিডিন থাকতে পারে, কারণ কেবলমাত্র একটি ফাইলের বর্ণনাকারী 0 রয়েছে।

cat << EOF
eof
EOF

এর জন্য সংক্ষিপ্ত:

cat /dev/fd/0 0<< EOF
eof
EOF

এবং:

cat <<< foo

হল:

cat /dev/fd/0 0<<< foo

ফাইল বর্ণনাকারী 0-তে কী খুলতে হবে তা আপনার নিজের মন তৈরি করতে হবে।

cat <(echo foo)

হল:

cat /dev/fd/123

123পাইপের একটি ফাইল বর্ণনাকারী কোথায় আছে এবং সমান্তরালে, স্ট্রাউডটি echo fooপাইপের অন্য প্রান্তে পুনঃনির্দেশিত করে ব্যাশ অন্য প্রক্রিয়াতে চলে ।

একবার আপনি একটি ফাইলের নাম পাস cat, catআর stdin থেকে পড়া। আপনার প্রয়োজন:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

বা:

cat <(echo foo) - << EOF
bar
EOF

( স্টিডিন থেকে পড়তে -বলা catহয়)।


1
cat <<EOFঠিক ঠিক এর মতো নয় cat /dev/fd/0...: পরের ক্ষেত্রে catফাইলের নামটি দেখে ওপেন হয়।
মাইকেল

@ মাইকেল, আমি যা বোঝাতে চেয়েছি তা এটি কার্যত সমতুল্য । যখন কোনও যুক্তি পাস না করা হয়, catতার fd0 থেকে পড়ে , যেমন একটি যুক্তি -বা /dev/fd/0(যদিও লিনাক্সে (এবং কেবল লিনাক্সে) পাস করা হয়েছে , খোলার /dev/fd/0অর্থ ফাইল বর্ননকারী 0 নকল করার মতো নয়।
স্টাফেন চেজেলাস

আমি /dev/fd/3 3<< E1নির্মাণ করে খুব অবাক হয়েছিলাম এবং আমি এখন অবাক হয়েছি / dev / fd / এর অধীনে আইটেমগুলি ঠিক কী। আমি যদিও তারা কোনওভাবেই যাদুতে প্রদর্শিত হওয়ার পরে প্রক্রিয়াটি 1 এবং 2 ব্যতীত ফাইল সিস্টেমের কোথাও একটি ফাইল খোলে যা প্রতিটি প্রক্রিয়াটির জন্য ডিফল্টরূপে থাকে। তবে আপনার উদাহরণে আপনি ফাইল বর্ণনাকারী 3 এবং 4 ব্যবহার করছেন যা কোনও ইনপুট পুনঃনির্দেশ ছাড়া আর কোনও আসল ফাইলের সাথে সংযুক্ত নয়। ফাইল বর্ণনাকারীদের আমার মানসিক মডেলটিতে আমি তা বুঝতে পারি না। প্রক্রিয়াটি যদি অন্য কোনও ফাইল খুলতে চায়, তবে এটি কী জানবে যে এফডি 5 ব্যবহার করতে হবে? এফডিএস কি 3, 4, 5 হতে হবে .. বা কিছু হতে পারে?
calaeda.info

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