একটি পাইপ সহ ফিড উত্স কমান্ড


25

পূর্বে আমি sourceএই জাতীয় কমান্ড ব্যবহার করতাম :

source file_name

তবে আমি যা করার চেষ্টা করছি তা হ'ল:

echo something | source

যা কাজ করে না।

উত্তর:


38

যেহেতু source(বা .) কোনও ফাইল আর্গুমেন্ট হিসাবে গ্রহণ করে, আপনি চেষ্টা করতে পারেন:

source <(echo something)

1
যে কাজ করেছে, আপনাকে ধন্যবাদ। এবং শুভ নববর্ষ!
ডেসমন্ড হিউম

@ মুরু এটি দুর্দান্ত কাজ করে। নোট করুন যে "| উত্স / দেব / স্টিডিন" এর কাজের উপস্থিতি রয়েছে তবে এটি আসলে ভেরিয়েবলের সমস্ত অ্যাসাইনমেন্ট ফেলে দেবে। নিশ্চিত কেন। তাত্ত্বিকভাবে কঠিন বলে মনে হচ্ছে। এটা উন্মাদনা।
ডাস্টিন ওরেপা

2
@ ডাস্টিনঅপ্রিয়া পাইপগুলি একটি সাব-শেল তৈরি করে, সুতরাং এই সমস্ত পরিবর্তনশীল কার্যভারগুলি কখনই প্যারেন্ট শেলকে প্রভাবিত করে না।
মুড়ু

8

আপনার উত্স কমান্ডের জন্য একটি ফাইল আর্গুমেন্ট প্রয়োজন। প্রক্রিয়া প্রতিস্থাপনের সাথে আপনি কয়েকটি শেলের মধ্যে এটি পেতে পারেন এবং এটি কারণ একইভাবে শেলটি প্রতিস্থাপন করা হয় ...

arg=$(echo hi)

... echoসাবস্কেলের আউটপুট সহ কমান্ড-লাইনের কিছুটা, প্রক্রিয়া প্রতিস্থাপনের ক্ষেত্রে এটি সাব-শেলটিকে একটি নামযুক্ত ফাইলের সাথে প্রতিস্থাপন করে - সাধারণত /dev/fd/62বা কিছু - একটি ফাইল-বর্ণনাকারীর কোনও লিঙ্ক। একটি পাইপ দিয়ে ফাইল বর্ণনাকারী 0 তাই ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdinবা কেস হিসাবে যাই হোক না কেন, কোনও লিনাক্স সিস্টেমে - এবং আরও অনেকের জন্য ঠিক কাজ করা উচিত। আপনি এখানে-নথিগুলি একইভাবে ব্যবহার করতে পারেন:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

আপনার শেল যেভাবে প্রক্রিয়া প্রতিস্থাপন পরিচালনা করে তা আপনি যাচাই করতে পারেন:

(set -x; readlink <(:))

... যা প্রিন্ট করে (ইন bash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... এবং তাই আমরা দেখতে পাচ্ছি যে শেলটি প্রতিস্থাপনটি করছে এবং readlinkএকটি অ্যানয়মাস পাইপ থেকে এটি পড়ছে যা এটি ফাইল-বর্ণনাকারী 63 এ খোলে।

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