যখন ইনপুট ফাইলটি সন্ধানযোগ্য (নিয়মিত ফাইল থেকে পড়ার মতো) বা অন-সন্ধানযোগ্য (পাইপ থেকে পড়ার মতো), sed(এবং অন্যান্য স্ট্যান্ডার্ড ইউটিলিটিস) আলাদাভাবে আচরণ করবে ( এই লিঙ্কটিরINPUT FILES বিভাগটি পড়ুন )।
দস্তাবেজের উদ্ধৃতি:
যখন কোনও স্ট্যান্ডার্ড ইউটিলিটি একটি সন্ধানযোগ্য ইনপুট ফাইলটি পড়ে এবং ফাইলের শেষের দিকে পৌঁছানোর আগে কোনও ত্রুটি ছাড়াই শেষ হয়, ইউটিলিটি নিশ্চিত করবে যে ওপেন ফাইলের বিবরণে ফাইলটি অফসেটটি যথাযথভাবে ইউটিলিটি দ্বারা প্রসেস করা শেষ বাইটের ঠিক পরে রয়েছে।
সুতরাং:
(sed '/y/ q'; echo aaa; cat) < test
sedqইওএফ পৌঁছানোর আগে ইউআইটি কমান্ড সম্পাদন করেছে , সুতরাং এটি zzzলাইনের শুরুতে ফাইলটি অফসেট ছেড়ে দিয়েছে , তাই catঅবশিষ্ট রেখাগুলি মুদ্রণ চালিয়ে যেতে পারে (জিএনইউ সেড কোনও অবস্থাতেই পসিক্স অনুগত নয়, নীচে দেখুন)।
এবং ডক থেকে অবিরত:
যে ফাইলগুলি অন্বেষণযোগ্য নয় তাদের ক্ষেত্রে সেই ফাইলের জন্য ওপেন ফাইলের বিবরণে অফসেট হওয়া ফাইলের অবস্থা নির্ধারিত
এই ক্ষেত্রে, আচরণটি অনির্ধারিত। সর্বাধিক মানক সরঞ্জামগুলি অন্তর্ভুক্ত sedযথাসম্ভব ইনপুট গ্রহণ করবে। এটি পড়তে হবে yyyলাইনটি পাস করুন , এবং qফাইলটি অফসেটটি পুনরুদ্ধার না করেই uit করা হবে, তাই কিছুই বাদ যায় না cat।
জিএনইউ sedমানের সাথে সামঞ্জস্যপূর্ণ নয়, এটি সিস্টেমের স্টিডিও বাস্তবায়ন এবং গ্লিবসি সংস্করণের উপর নির্ভর করে:
$ (gsed '/y/ q'; echo aaa; cat) < test
xxx
yyy
aaa
এখানে, ফলাফলটি ম্যাক ওএসএক্স 10.11.6, ভার্চুয়াল মেশিনস সেন্টোস 7.2 - গ্লিবসি 2.17, উবুন্টু 14.04 - গ্লিবসি 2.19 থেকে পাওয়া গেছে, যা সিইপিএইচ ব্যাকএন্ডের সাথে ওপেনস্ট্যাকে চালিত হয়।
এই সিস্টেমে, আপনি -uস্ট্যান্ডার্ড আচরণ অর্জনের জন্য বিকল্পটি ব্যবহার করতে পারেন :
(gsed -u '/y/ q'; echo aaa; cat) </tmp/test
এবং পাইপ জন্য:
$ cat test | (gsed -u '/y/ q'; echo aaa; cat)
xxx
yyy
aaa
zzz
যা মারাত্মকভাবে অদক্ষ পারফরম্যান্সের দিকে পরিচালিত করে, কারণ sedএকবারে একটি বাইট পড়তে হয়। এর একটি আংশিক আউটপুট strace:
$ strace -fe read sh -c '{ sed -u "/y/q"; echo aaa; cat; } <test'
...
[pid 5248] read(3, "", 4096) = 0
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "x", 1) = 1
[pid 5248] read(0, "\n", 1) = 1
xxx
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "y", 1) = 1
[pid 5248] read(0, "\n", 1) = 1
yyy
...
cat(সাব শেলের মধ্যে) প্রথম ক্ষেত্রে ফাইল ডেস্ক্রিপ্টর পুনরায় ব্যবহার করতে পারে, কারণ স্টিডিন একটি আসল ফাইলের সাথে আবদ্ধ। দ্বিতীয় ক্ষেত্রে, স্টিডিন একটি পাইপ থেকে এবং কোনও আসল ফাইল নয়। নোট যে(sed '/y/ q'; echo aaa; cat) < <(cat test)মুদ্রণ নাzzz।