সুতরাং আমি লেসমানার মতো একটি উত্তর অবদান রাখতে চেয়েছিলাম, তবে আমি মনে করি আমার সম্ভবত কিছুটা সহজ এবং কিছুটা সুবিধাজনক খাঁটি-বোর্ন শেল সমাধান:
# You want to pipe command1 through command2:
exec 4>&1
exitstatus=`{ { command1; printf $? 1>&3; } | command2 1>&4; } 3>&1`
# $exitstatus now has command1's exit status.
আমি মনে করি এটি অভ্যন্তরীণ থেকে সর্বোত্তমভাবে ব্যাখ্যা করা হয়েছে - কমান্ড 1 তার নিয়মিত আউটপুটটি স্টাডআউট (ফাইল বর্ণনাকারী 1) এ কার্যকর করবে এবং মুদ্রণ করবে, তারপরে এটি শেষ হয়ে গেলে, প্রিন্টফ তার স্টাডআউটে আইকনম্যান্ড 1 এর প্রস্থান কোডটি কার্যকর করবে এবং প্রিন্ট করবে, কিন্তু সেই স্টাডআউটটি পুনঃনির্দেশিত হবে ফাইল বর্ণনাকারী 3।
কমান্ড 1 চলমান থাকাকালীন, এর স্টডআউটটি কমান্ড 2 এ পাইপ করা হচ্ছে (প্রিন্টফের আউটপুট কখনই এটি কমান্ড 2 এ পরিণত হয় না কারণ আমরা এটি 1 এর পরিবর্তে 3 ফাইল ডেস্ক্রিপ্টারে প্রেরণ করি যা পাইপটি যা পড়ে)। তারপরে আমরা কমান্ড 2 এর আউটপুটটিকে ফাইল বর্ণনাকারী 4 এ পুনঃনির্দেশ করি, যাতে এটি ফাইল বর্ণনাকারী 1 এর বাইরেও থাকে - কারণ আমরা ফাইল বিবরণী 1 আরও পরে কিছুটা ফ্রি চাই, কারণ আমরা ফাইল বিবরণীতে প্রিন্টফ আউটপুট 3 ফিরিয়ে আনব ফাইল ডেস্ক্রিপ্টারে 1 - কারণ এটি হ'ল কমান্ড সাবস্টিটিউশন (ব্যাকটিক্স) ক্যাপচার করবে এবং এটি ভেরিয়েবলের মধ্যে স্থাপন করবে।
ম্যাজিকের চূড়ান্ত বিটটি হ'ল প্রথমটি exec 4>&1
আমরা পৃথক কমান্ড হিসাবে করি - এটি বাহ্যিক শেলের স্টডআউটটির অনুলিপি হিসাবে ফাইল বর্ণনাকারী 4 খুলবে। কমান্ড প্রতিস্থাপন স্ট্যান্ডার্ডে যা লেখা আছে তার ভিতরে থাকা কমান্ডের দৃষ্টিকোণ থেকে এটি ক্যাপচার করবে - তবে যেহেতু কমান্ড 2 এর আউটপুট বর্ণনাকারী 4 ফাইল করতে চলেছে, কমান্ড প্রতিস্থাপনের ক্ষেত্রে কমান্ড প্রতিস্থাপন এটি ক্যাপচার করে না - তবে একবার এটি কমান্ড প্রতিস্থাপনের "আউট" পায় এটি কার্যকরভাবে এখনও স্ক্রিপ্টের সামগ্রিক ফাইল বর্ণনাকারী 1-এ চলছে।
( exec 4>&1
এটি একটি পৃথক কমান্ড হতে হবে কারণ আপনি যখন কমান্ড সাবস্টিটিউশনের অভ্যন্তরে কোনও ফাইল বর্ণনাকারীর কাছে লেখার চেষ্টা করেন তখন প্রচলিত শেলগুলি এটি পছন্দ করে না, এটি "বহিরাগত" কমান্ডে খোলা হয় যা বিকল্পটি ব্যবহার করছে So সুতরাং এটি হ'ল এটি করার সহজতম পোর্টেবল উপায়))
আপনি এটিকে কম প্রযুক্তিগত এবং আরও কৌতুকপূর্ণ উপায়ে দেখতে পারেন, যেমন কমান্ডের আউটপুটগুলি একে অপরকে লিফফ্রোগ করছে: কমান্ড 1 তে কমান্ড 1 পাইপস, তারপরে প্রিন্টফের আউটপুট কমান্ড 2 এর উপরে লাফ দেয় যাতে কমান্ড 2 এটি ধরে না এবং তারপরে কমান্ড 2 এর আউটপুট কমান্ড প্রতিস্থাপনের বাইরে চলে যায় ঠিক একই সময়ে প্রিন্টফ জমিদার হিসাবে ক্যাপচার করার জন্য সময় নেয় যাতে এটি ভেরিয়েবলের সমাপ্ত হয়, এবং কমান্ড 2 এর আউটপুট তার আনন্দের পথে স্ট্যান্ডার্ড আউটপুটে লেখা হয়, ঠিক যেমন একটি সাধারণ পাইপে
এছাড়াও, যেমনটি আমি এটি বুঝতে পেরেছি, $?
পাইপটিতে এখনও দ্বিতীয় কমান্ডের রিটার্ন কোড থাকবে, কারণ পরিবর্তনশীল অ্যাসাইনমেন্ট, কমান্ডের বিকল্পগুলি এবং যৌগিক কমান্ডগুলি তাদের ভিতরে থাকা কমান্ডের রিটার্ন কোডের জন্য কার্যকরভাবে স্বচ্ছ, সুতরাং এর রিটার্নের স্থিতি কমান্ড 2 এর প্রচার করা উচিত - এটি এবং অতিরিক্ত ক্রিয়াকলাপটি সংজ্ঞায়িত না করাই আমি কেন লেসম্যানার প্রস্তাবিত চেয়ে কিছুটা ভাল সমাধান হতে পারে বলে আমি মনে করি।
ক্যাভিয়েটস লেসমানার উল্লেখ অনুসারে, সম্ভবত কমান্ড 1 কোনও সময় ফাইল বর্ণনাকারী 3 বা 4 ব্যবহার করে শেষ করবে, যাতে আরও দৃ rob় হয়, আপনি এটি করতে পারেন:
exec 4>&1
exitstatus=`{ { command1 3>&-; printf $? 1>&3; } 4>&- | command2 1>&4; } 3>&1`
exec 4>&-
মনে রাখবেন যে আমি আমার উদাহরণে যৌগিক আদেশগুলি ব্যবহার করি তবে সাবশেলগুলি (এর ( )
পরিবর্তে ব্যবহার { }
করাও কার্যকর হবে, যদিও এটি সম্ভবত কম দক্ষ হতে পারে))
কমান্ডগুলি ফাইল প্রবর্তনকারী প্রক্রিয়া থেকে ফাইল বর্ণনাকারীদের উত্তরাধিকার সূত্রে প্রাপ্ত হয়, সুতরাং সম্পূর্ণ দ্বিতীয় লাইনে ফাইল বর্ণনাকারী চারটি উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং এরপরে যৌগিক কমান্ডটি 3>&1
ফাইল বর্ণনাকারী তিনটি উত্তরাধিকার সূত্রে প্রাপ্ত হয়। সুতরাং এটি 4>&-
নিশ্চিত করে যে অভ্যন্তরীণ যৌগ কমান্ডটি ফাইল বর্ণনাকারী চারটি 3>&-
উত্তরাধিকার সূত্রে প্রাপ্ত হবে না এবং তিনটি ফাইল বর্ণনাকারীর অধিকারী হবে না, সুতরাং কমান্ড 1 একটি 'ক্লিনার', আরও মানক পরিবেশ পায় gets আপনি অভ্যন্তরের 4>&-
পাশের পাশের অংশটিও সরিয়ে ফেলতে পারেন 3>&-
, তবে আমি বুঝতে পারি কেন কেবল তার সুযোগটি যতটা সম্ভব সীমাবদ্ধ করা যায় না।
আমি নিশ্চিত না যে কীভাবে জিনিসগুলি ফাইল বর্ণনাকারী সরাসরি তিন এবং চারটি ব্যবহার করে - আমি মনে করি বেশিরভাগ সময় প্রোগ্রামগুলি সিস্কল ব্যবহার করে যা মেমরির সময়ে ফাইল-বর্ণনকারীকে না-ব্যবহার করা হয়, তবে কখনও কখনও কোড ডেস্ক্রিপ্ট 3 ফাইল সরাসরি লিখে দেয়, আমি অনুমান করুন (কোনও ফাইল ফাইল বিবরণকারী খালি আছে কিনা তা দেখার জন্য এবং এটি যদি হয় তবে এটি ব্যবহার করে বা এটি না হলে সেই অনুযায়ী অন্যরকম আচরণ করে তা কল্পনা করতে পারি)। সুতরাং পরে সম্ভবত মনে রাখা এবং সাধারণ উদ্দেশ্য ক্ষেত্রে ব্যবহার করা সবচেয়ে ভাল।