এক টার্মিনাল থেকে অন্য টার্মিনালে ইনপুট পুনর্নির্দেশ করুন


7

আমি একটি লিনাক্স বাক্সে প্রবেশ করেছি এবং আমি ডিভিটিএম এবং ব্যাশ ব্যবহার করছি (যদিও আমি এটি Gnu স্ক্রিন এবং ব্যাশ দিয়ে চেষ্টা করেছি)। আমার দুটি টার্মিনাল রয়েছে, বর্তমান / dev / pts / 29 এবং / dev / pts / 130। আমি ইনপুটটি এক থেকে অন্যটিতে পুনর্নির্দেশ করতে চাই।

আমি যা বুঝি সেগুলি থেকে / dev / pts / 130 এ টাইপ করতে পারি:

cat </dev/pts/29

এবং তারপরে আমি যখন / dev / pts / 29 টাইপ করি তখন আমি টাইপ করা অক্ষরগুলি / dev / pts / 130 এ প্রদর্শিত হবে। যাইহোক যা ঘটছে তা হ'ল আমি টাইপ করা প্রতিটি অন্যান্য চরিত্রটি পুনঃনির্দেশিত হয়। উদাহরণস্বরূপ, আমি যদি "হ্যালো" টাইপ করি তবে আমি এটি পাই:

/dev/pts/29        |        /dev/pts/130

$                  |        $ cat </dev/pts/29
$ el               |        hlo

জিডিবিতে চলমান কোনও প্রক্রিয়াটির আইইও পুনর্নির্দেশের জন্য আমার এটি করা দরকার বলে এটি সত্যিই হতাশাব্যঞ্জক (আমি রান / ডিভ / পিটিএস / # উভয়ই চেষ্টা করেছি এবং নিকৃষ্ট-টিটি / দেব / পিটিএস / # সেট করেছি এবং উভয়ই ফলাফল পেয়েছি পূর্বোক্ত আচরণ)। আমি কি কিছু ভুল করছি, বা বাশ / স্ক্রিন / ডিভিটিএম এ এটি কোনও বাগ?

উত্তর:


8

আপনার সরলীকৃত উদাহরণে, আপনার দুটি প্রসেস রয়েছে (আপনার শেল এবং বিড়াল ) টিটিটির "স্লেভ" দিক থেকে পড়ার চেষ্টা করছেন। ফলস্বরূপ যে একটি প্রক্রিয়া কিছু চরিত্র পায়, অন্যটি অন্যকে পায়।

"ইনপুটটিকে [একটি [টার্মিনাল] থেকে অন্যটিতে) পুনর্নির্দেশ" বলতে আপনার অর্থ কী? আপনার আসল পরিস্থিতিতে, প্রতিটি টার্মিনাল থেকে কোন প্রক্রিয়াগুলি পড়ার চেষ্টা করছে? আপনার ক্যাপচার ইনপুটটি একবার হয়ে গেলে আপনি কী করতে চান? কি ঠিক , আপনি আসলে সম্পন্ন করার জন্য চেষ্টা করছেন?

আমার কাছে, "জিডিবিতে চলমান প্রক্রিয়াটির আইও পুনঃনির্দেশিত করা" এটি ইতিমধ্যে চলমান একটি প্রক্রিয়ার অভ্যন্তরে স্টিডিন / স্টাডআউট / স্টার্ডার পুনরায় খোলার মতো মনে হয়।

আপনি ( অন্যান্য জিনিসের মধ্যে ) জিডিবি দিয়ে একটি চলমান প্রক্রিয়াটির স্টিডিন / স্টাডাউট / স্টেডার পরিবর্তন করতে পারেন । কমান্ড লাইন ব্যবহার করে "প্রক্রিয়া শুরু করার পরে STDERR / STDOUT পুনর্নির্দেশের উত্তর?" কীভাবে এটি করা যেতে পারে তা দেখায়। /dev/nullউত্তরের জন্য আপনি একটি টিটিটি প্যাথনামের বিকল্প রাখতে চান এবং আপনি সম্ভবত স্টিডিনকেও পরিচালনা করতে চান, তবে কৌশলটি এখনও প্রযোজ্য।


আপনার সহজ সরল উদাহরণটি দৃust়তার সাথে কাজ করতে সক্ষম হওয়া উচিত, তবে আমি নিশ্চিত নই যে আপনি আসলে যা করতে চান তা করে এটি (মনে রাখবেন যে একটি সিউডো টার্মিনাল আসলে দ্বি-নির্দেশিক পাইপের দুই প্রান্তের মতো ডিভাইসগুলির একটি জোড়া; তবে আপনার সমস্ত উদাহরণ এটি 'দাস' অর্ধেকের সাথে যোগাযোগ করে)।

আপনার উদাহরণটি স্থির করার চাবিকাঠিটি হ'ল টার্মিনাল থেকে পড়া সাময়িকভাবে (অস্থায়ীভাবে) পড়া বন্ধ করার প্রতিযোগিতামূলক প্রক্রিয়াটির একটি ছাড়া all যদি, আপনার উদাহরণের মতো, আপনি যে পাশ থেকে ডেটা ক্যাপচার করতে চান সেদিকে শেল চলতে থাকে তবে আপনি এই জাতীয় কিছু করতে পারেন:

(
    s="$(stty -g)"
    exec 3<&0
    trap 'stty "$s" 0<&3;exit' 0 INT QUIT

    cat <<EOM
In some other terminal, run the command

    cat <$(tty)

Press ^C or ^\ to quit.
EOM

    stty raw isig brkint susp '' dsusp ''
    while true; do sleep 3600; done </dev/null
)

আমার লক্ষ্য ছিল জিডিবি-র মধ্যে একটি প্রক্রিয়া চালানো, তবে অন্য টার্মিনালে প্রক্রিয়াটির সাথে ইন্টারঅ্যাক্ট করা। এটি অনুরোধ করা হয়েছিল কারণ আমি পাইক্লাওয়ান সেট আপ করেছি এবং যখন টার্মিনালে চালিত হয় তখন এটি প্রক্রিয়াটি 'io to / dev / null' সাথে পুনঃনির্দেশ করে এটির সাথে যোগাযোগ করা অসম্ভব করে তোলে। তবে আমি কেবল বুঝতে পেরেছি যে আমি একজন নির্বোধ, যেহেতু আমি আমার সমস্যাটিকে পুরোপুরি বাইপাস করে আলাদা টার্মিনালে চলমান একটি প্রসেসের সাথে জিডিবি সংযুক্ত করতে পারি।
নিকি ইয়োশিউচি

আমি এটিও খুঁজছিলাম (অভিশাপগুলির সাথে ডিবাগ অভিশাপ)। এটি নিজেই একটি সম্পূর্ণ ব্যাখ্যা প্রাপ্য। পুরানো স্টিডিন সংরক্ষণ করুন, প্রস্থানকালে পুরানো স্টিডিন পুনরায় লোড করুন এবং সর্বোপরি ভালমুক্ত ইনপুট। যাইহোক এটি উবুন্টুতে নিখুঁতভাবে কাজ করছে না। প্রস্থান করার সময় একটি পুনরায় সেট করা দরকার, তবে মানুষকে এটি ব্যবহার করার পক্ষে যথেষ্ট তা হওয়া উচিত, দুর্দান্ত!
albfan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.