প্রক্রিয়া প্রতিস্থাপনের সাথে আউটপুট ক্রম


11

এটি আমি চালানোর জন্য যা করি grepএবং wcকোনও ফাইল এটিতে দুবার স্ক্যান না করেই করি

<file.txt  tee >(grep LITERAL) >(wc -l) >/dev/null

তবে, এই ফলন

EXEC LITERAL
32

কখনও কখনও এবং

32
EXEC LITERAL

অন্য সময়ে. ( grepপূর্ববর্তী থেকে আউটপুট wcপ্রথম উদাহরণ থেকে আউটপুট এবং দ্বিতীয়টিতে বিপরীতে))

অন্যদিকে, পুনর্নির্দেশগুলি এবং ফাইল বর্ণনাকারী সহ

{ { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1 

আমি সবসময় পেতে বলে মনে হচ্ছে

EXEC LITERAL
32

আমি আউটপুট ক্রম অনুমানযোগ্য হতে পছন্দ করি তবে এটি কি দ্বিতীয় পদ্ধতির সাথে গ্যারান্টিযুক্ত?

উত্তর:


4

প্রত্যেকে

<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এটির fd3 টি খোলা রয়েছে wc(যদিও এটি এর কোনও ব্যবহার করছে না, এটি লিখতে দেওয়া যাক)। অভ্যন্তরীণ {সম্ভবত একটি অতিরিক্ত সাব-শেল প্রক্রিয়া সৃষ্টি করবে যেটিতে fd3 টি খোলা থাকবে এবং উভয় 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 ব্যবহার এবং বন্ধ উভয়ই প্রদর্শিত হবে বলে কী বোঝায়?
ইরুবার

@ 1_CR পর >&4, সংক্ষিপ্ত 1>&4, grepএর 1 এবং 4 পয়েন্ট একই রিসোর্স (শেল প্রাথমিক stdout- এ) এর FD। grepএর এফডি 4 কোনও কিছুর জন্য খোলা থাকার দরকার নেই। এটি এর সাথে কিছু করে না, তাই আমরা এটি দিয়ে বন্ধ করি4>&-
Stéphane Chazelas

সেই শেষ কমান্ড-লাইনটি ক্রিপ্টিক ম্যাজিক।

-1

অনুমানযোগ্য অর্ডার ব্যবহার পেতে

(<file.txt  tee >(grep LITERAL) >(wc -l) >/dev/null)|sort

সম্ভবত আমি যথেষ্ট পরিষ্কার ছিল না। আমি কমান্ড আউটপুট (যেমন ডাব্লুসি থেকে আউটপুট এর আগে গ্রেপ থেকে আউটপুট) অর্ডার শর্তাবলী হিসাবে অনুমানযোগ্য অর্ডার বলতে চাইছি। আমার যৌথ আউটপুটটি বাছাই করতে হবে না
ইরুবার

সবেমাত্র gnu.org/software/bash/manual/bashref.html#Command- গোষ্ঠীটি পাওয়া গেছে , এটি আমাকে বলেছে যে {} অপারেটরগুলির সাথে আপনি নিশ্চিত হন (এই ক্ষেত্রে) যে আপনি প্রথমে <file.txt tee / dev / fd করেন / 3 | গ্রেপ লিটারাল> & 4; এবং এটি হয়ে গেলে আপনি
ডাব্লুসি

1
@ থারস্টেন স্টার্ক আপনি নিজের উত্তরের সাথে খুঁজে পাওয়া অতিরিক্ত তথ্য যুক্ত করতে পারবেন?
টেরডন

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