"এক্সিকিউট &> ফাইলের নাম" জারি করার পরে টার্মিনালে আউটপুট পুনরুদ্ধার করা হচ্ছে


15

আমি নিম্নলিখিতগুলি সম্পাদন করার চেষ্টা করছি:

exec &>filename

এর পরে আমি যা টাইপ করেছি ঠিক আছে তা সহ কিছুই দেখতে পাচ্ছি না।

আমি ভদ্রভাবে চেষ্টা করে দেখি, exec 1>&1এবং exec 2>&2কিছুই হয় না।

এখন, শেলটি না মেরে আমি কীভাবে স্ট্যান্ডআউটকে পুনঃনির্দেশিত আউটপুটটি এবং যথাক্রমে স্টারডারকে পুনঃনির্দেশিত করব? ফাইল বর্ণনাকারীরা কি স্ট্যান্ডার্ডকে [ইন | আউট] রেখে স্টার্ডার উল্লেখ করার একমাত্র উপায়?


1
হুম ... কেন আপনি তখন আপনার ইন্টারেক্টিভ শেলটির স্টডার / স্টাডাউটটিকে পুনর্নির্দেশ করবেন? এই execকনস্ট্রাক্টটি সাধারণত স্ক্রিপ্টগুলিতে ব্যবহৃত হয় যা একটি সাব-শেলের মধ্যে চলে, তাদের আউটপুট যেমন পুনরায় কোনও ফাইলে পুনর্নির্দেশ করতে। আমি ইন্টারেক্টিভ সেশনে এর জন্য কোনও ব্যবহার দেখতে পাচ্ছি না।
— মার্টিন ভন উইট্টিচ

3
@ মার্টিনভনভিটচি, আমি এক্সিকিউট সম্পর্কিত বিবৃতিতে একমত। আমি রাজী. আমি কেবল চারপাশে খেলছি :)
— user917279

উত্তর:


23

আপনি চালানোর পরে exec &>filename, শেলের স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি চলে যায় filename। স্ট্যান্ডার্ড ইনপুট হল সংজ্ঞা অনুসারে ফাইল বিবরণী 0 এবং মানক আউটপুট এফডি 1 এবং স্ট্যান্ডার্ড ত্রুটি এফডি 2 হয়।

একটি ফাইল বর্ণনাকারী হয় পুনঃনির্দেশিত বা অ-পুনঃনির্দেশিত নয়: এটি সর্বদা কোথাও যায় (ধরে নিবেন যে প্রক্রিয়াটিতে এই বর্ণনাকারীটি খোলা আছে)। কোনও ফাইল বর্ণনাকারী পুনর্নির্দেশের অর্থ এটি যেখানে যায় সেখানে পরিবর্তন। যখন আপনি দৌড়েছিলেন exec &>filename, স্টাডআউট এবং স্ট্ডার আগে টার্মিনালের সাথে সংযুক্ত ছিল এবং সংযুক্ত হয়ে গেছে filename।

সবসময় একটি উপায় বর্তমান টার্মিনাল পড়ুন করা: /dev/tty। যখন কোনও প্রক্রিয়া এই ফাইলটি খুলবে, তার অর্থ সর্বদা প্রক্রিয়াটির নিয়ন্ত্রণকারী টার্মিনাল , এটি যেকোনই হোক। সুতরাং আপনি যদি শেলটির মূল স্ট্ডআউট এবং স্ট্ডার ফিরে পেতে চান তবে আপনি এটি করতে পারেন কারণ তারা যে ফাইলটি সংযুক্ত ছিল তা এখনও প্রায় রয়েছে।

exec &>/dev/tty

1
যেমন @ জোসেফ আর। উত্তর দিয়েছিল $ (টিটিআই) আমাকে / দেব / পিটিআই দেখায়, তবে আপনার কমান্ডটিও কাজ করে, কোনটি ইউনিক্স স্বাদে আরও বহনযোগ্য? আরও সুস্পষ্ট উত্তরের জন্য আপনাকে ধন্যবাদ
— ব্যবহারকারী 917279

2
@ ব্যবহারকারী917279 তারা বিভিন্ন ইউনিক্স স্বাদে কাজ করার অর্থে সমানভাবে বহনযোগ্য। /dev/ttyনা হয় এমন ক্ষেত্রে কাজ $(tty)করে: /dev/ttyপ্রক্রিয়াটির নিয়ন্ত্রণকারী টার্মিনাল যতক্ষণ কাজ করে (যতক্ষণ আপনি টার্মিনালের সাথে প্রক্রিয়াটি সংযোগ করার জন্য এখনও কিছু থাকতে হবে) আপনি আশা করতে পারেন সেরা, যেখানে $(tty)টার্মিনালটি এখনও খোলার প্রয়োজন স্ট্যান্ডার্ড ইনপুট।
— গিলস 'দুষ্ট হওয়া বন্ধ করুন'

11

তুমি চাও

exec &>$(tty)

আপনি আপনার প্রশ্নে যা করছেন তা স্ট্ডআউট এবং স্ট্ডারটিতে মূল স্টাডআউট এবং স্ট্ডারর প্রতিরূপ তৈরি করছে যা ইতিমধ্যে ফাইলটিতে পুনঃনির্দেশিত হয়েছে।

গিলসের উত্তর যেমন ব্যাখ্যা করেছে, ttyবর্তমান টার্মিনালের টার্মিনাল ডিভাইসটি ফিরিয়ে দেবে। এখানেই তিনটি স্ট্যান্ডার্ড ফাইল বর্ণনাকারী লগইন শেলটিতে ডিফল্টরূপে / আসা থেকে আসা। সুতরাং উপরোক্ত বিবৃতিটি ttystdout এবং stderr কে আগের মত টার্মিনাল ডিভাইসে পুনর্নির্দেশ করতে ব্যবহার করে ।

আপনি যদি বহনযোগ্যতার বিষয়ে উদ্বিগ্ন হন (গিলসের জবাব সম্পর্কে আপনার মন্তব্য অনুসারে), উভয় পদ্ধতি ( টিটি ইউটিলিটি এবং /dev/ttyফাইল ) পসিক্স স্ট্যান্ডার্ডে রয়েছে in

গিলসের মন্তব্য থেকে অনুলিপি করা শব্দ:

There's an advantage to /dev/tty: it works even after exec <somefile, 
whereas $(tty) would complain “not a tty”

এটি কাজ করে! ধন্যবাদ. প্রতিধ্বনি $ (tty) দেয় / dev / pty0 (সাইগউইনে), এটি স্ট্ডিন, স্টাডাউটের সাথে কীভাবে সম্পর্কিত এবং উপরের বিবৃতিতে কী ঘটে? আমাকে যদি একটি পৃথক প্রশ্ন হিসাবে এটি জিজ্ঞাসা করার প্রয়োজন হয় তবে দয়া করে আমাকে জানান।
— ব্যবহারকারী 917279

@ ব্যবহারকারী917279 উত্তর আপডেট হয়েছে।
— জোসেফ আর।

ধন্যবাদ জোসেফ গিলসের উত্তর দেখার আগে আমি এই প্রশ্নটি পোস্ট করেছিলাম। আপনাকে অনেক ধন্যবাদ. দয়া করে আমাকে গাইলসের উত্তরটিকে স্বীকৃত হিসাবে চিহ্নিত করার অনুমতি দিন, কারণ এটি আমার মতো বোবা মনও সঠিকভাবে বুঝতে পারে।
— ব্যবহারকারী 917279

2
এর একটি সুবিধা রয়েছে /dev/tty: এটি পরেও কাজ করে exec <somefile, তবে $(tty)"টিটি নয়" অভিযোগ করবে।
— গিলস 'দুষ্ট হওয়া বন্ধ করুন'

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