প্রত্যেকে
<file.txt tee >(grep LITERAL) >(wc -l) >/dev/null
এবং:
{ { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1
সমস্ত tee
, grep
এবং wc
একযোগে শুরু করা হয়। তারপরে যা গুরুত্বপূর্ণ তা হচ্ছে শেষে কী ঘটে।
wc
ফলাফলটি কেবল তখন প্রিন্ট করবে যখন এটি তার স্ট্যান্ডার্ড ইনপুট-এ-ফাইলের শেষ দেখবে। প্রথম ক্ষেত্রে, এটি যখন tee
প্রস্থান হয়, কারণ তারপরে যে পাইপটি পড়ছে tee
তার fd
অন্য প্রান্তে এটি বন্ধ wc
হয়ে যাবে (প্রক্রিয়া প্রতিস্থাপনের মাধ্যমে শুরু করা হয়েছে)। ততক্ষণে এর grep
সমস্ত ইনপুট পড়েছে এমন কোনও গ্যারান্টি নেই , এর আউটপুটটি একা লিখুন (পাইপগুলিতে যথেষ্ট পরিমাণে ডেটা থাকতে পারে এবং wc
সম্ভবত এটির চেয়ে দ্রুততর হবে grep
)
দ্বিতীয় ক্ষেত্রে, wc
ফাইলের শেষের দিকে দেখতে পাবেন যখন পাইপটি পড়ছেন তখন লেখকরা পাইপের শেষ প্রান্তটি বন্ধ করে দিয়েছেন। সেক্ষেত্রে বেশ কয়েকজন লেখক রয়েছেন। tee
(এর fd এর মাধ্যমে /dev/fd/3
এবং তার fd 3 এর মাধ্যমে খোলা রয়েছে ) এবং এটিতে পাইপটিতে grep
এটির fd
3 টি খোলা রয়েছে wc
(যদিও এটি এর কোনও ব্যবহার করছে না, এটি লিখতে দেওয়া যাক)। অভ্যন্তরীণ {
সম্ভবত একটি অতিরিক্ত সাব-শেল প্রক্রিয়া সৃষ্টি করবে যেটিতে fd
3 টি খোলা থাকবে এবং উভয় tee
এবং এর জন্য অপেক্ষা করবে grep
।
তার মানে এটি বেরিয়ে wc
যাওয়ার পরে কেবল তার লাইন নম্বরটি লিখবে grep
।
আপনি যদি এটি যথাযথভাবে লিখে থাকেন তবে তা হ'ল এফডিএস বন্ধ করার মাধ্যমে যা খোলার দরকার নেই:
{ { <file.txt tee /dev/fd/3 4>&- |
grep LITERAL >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1
তারপরে শেলগুলিতে অর্ডারটির নিশ্চয়তা দেওয়া হত না যা সাব-শেল প্রক্রিয়াটিকে অপ্টিমাইজ করে। তবে শুধু শেল আমি জানি যে যে নেই ksh93
কিন্তু ksh93
ব্যবহারসমূহ পাইপ জন্য জোড়া সকেট, তাই /dev/fd/3
অন্তত লিনাক্স সেখানে কাজ করবে না।
কোন প্রক্রিয়াগুলি চলছে তা দেখতে আপনি এর grep
সাথে প্রতিস্থাপন করতে পারেন ps
:
$ { { <file.txt tee /dev/fd/3 4>&- | ps -H >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1
PID TTY TIME CMD
8727 pts/5 00:00:00 bash
8815 pts/5 00:00:00 bash
8817 pts/5 00:00:00 tee
8818 pts/5 00:00:00 ps
8816 pts/5 00:00:00 wc
এর সাহায্যে bash
আপনি সেই অতিরিক্ত শেল প্রক্রিয়াটি দেখতে পাবেন এবং এটি দেখতে পাবেন যে পাইপটি এফডি 3 এ খোলা রয়েছে:
$ (p=$BASHPID; { { <file.txt tee /dev/fd/3 4>&- | lsof -ag "$p" -d3 >&4 3>&- 4>&-; } 3>&1 | wc -l 4>&-;} 4>&1)
COMMAND PID PGID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 9843 9842 chazelas 3w FIFO 0,8 0t0 153304 pipe
tee 9845 9842 chazelas 3w FIFO 0,8 0t0 153304 pipe
lsof 9846 9842 chazelas 3r DIR 0,3 0 1 /proc
grep LITERAL >&4 3>&- 4>&-
fd 4 ব্যবহার এবং বন্ধ উভয়ই প্রদর্শিত হবে বলে কী বোঝায়?