নামী পাইপ থেকে স্টিডিন পাচ্ছেন


10

আমি যা করার চেষ্টা করছি তা হল একটি টার্মিনাল উইন্ডোতে অজগর চালানো এবং এটি নামক পাইপ থেকে স্টিডিনকে পুনর্নির্দেশ করুন। তারপরে আমি অন্য টার্মিনালে নামক পাইপে লিখি এবং সেই কমান্ডটি অজগরকে কার্যকর করি।

বন্দর 1:

mkfifo p1
python < p1

টার্মিনাল ২:

echo -n "print \"Hello World\"" > p1

যা ঘটে তা হ'ল - অজগর প্রিন্ট করে Hello Worldপ্রস্থান করে। আমি যা করতে চাই তা হল পরের কমান্ডটি পাওয়ার জন্য অজগরটিকে চালিয়ে রাখা। আমি শেল এটি কিভাবে করব?

উত্তর:


10

তোমার দরকার

  • অজগরটি ইন্টারেক্টিভভাবে চালিত করুন যদিও এর স্টিডিনটি টার্মিনাল নয়: ব্যবহার python -i
  • পাইপের লেখার শেষটি উন্মুক্ত রাখুন, অন্যথায় পাইথন ইওএফ সনাক্ত করে প্রস্থান করবে।

তাই:

python -i < p1

এবং অন্য কোথাও:

exec 3> p1
echo '1j*1j' >&3
...
# and when done, close that file descriptor so python sees the EOF:
exec 3>&-

ধন্যবাদ! এটা কাজ করেছে. আপনি যা করেছেন আমি তার সাথে পরিচিত নই। কী চলছে তা বোঝাতে দয়া করে আপনার উত্তরে কিছু বিশদ যুক্ত করতে চান? কি exec 3> p1করছেন এবং কি &3& exec 3> &1? ধন্যবাদ.
লর্ড লোহ

1
আপনার উত্তরটি আমাকে এই ব্যানারটির কথা মনে করিয়ে দিয়েছে - sphotos-b.xx.fbcdn.net/hphotos-ash4/… এটি ফেসবুকে বন্ধুর কভার পিক :-)
লর্ড লোহ।

একটি প্রশ্ন, এখানে exec 3>&-যেমন কাজ করবে exec 3>&1?
ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড আমার সন্দেহ হয় আমি 3>&-এখানে লেখার ইচ্ছা করেছি । 3>&1পাশাপাশি কাজ করবে কিন্তু সামান্য জ্ঞান করতে হবে। ধন্যবাদ
স্টাফেন চেজেলাস

5

tail -fফিফোটি echoলেখার পরে খোলা রাখতে আপনি এটি ব্যবহার করতে পারেন ।

tail -n1 -f p1 | python

কেন এই কাজ করে

pythonথেকে পড়া হয় p1। এটি যখন ফাইলের শেষে পৌঁছে, এটি পড়া বন্ধ করে দেয়। ফাইলের নামকরণের পাইপ হলেও ফাইল পড়ার ক্ষেত্রে এটি স্বাভাবিক আচরণ। tailসঙ্গে -f(ফলো) পতাকা পর তার শেষ উপনিত একটি ফাইল থেকে পড়া রাখা হবে।


আমি echo "print \"Hello World\" " > p1দ্বিতীয় টার্মিনালে চেষ্টা করেছি এবং কিছুই ঘটেনি - তবে টার্মিনালটিও ব্লক করা হয়নি। পাইথনের টার্মিনালটি আমি ^cনা হওয়া পর্যন্ত অবরুদ্ধ করে রেখেছিলাম এবং এটি থেকে বেরিয়ে এসে পাইথনটি শেষ করে পাইথন দ্বারা প্রদর্শিত কীবোর্ড বিঘ্নিত বার্তাটি দিয়ে।
লর্ড লোহ

tail -fনামযুক্ত পাইপের মাধ্যমে ব্লক-বিভক্ত টার সংরক্ষণাগারটি আনপ্যাক করার সময় আমি এই কৌশলটি ব্যবহার করেছি । এটি আশ্চর্যজনকভাবে কাজ করেছে।
মেল

2

আপনাকে একবারে পুরো প্রোগ্রামটি প্রেরণ করতে হবে।

আপনি যখন রান কল python < p1করেন শেলটি অজগর আহ্বানের আগে ইনপুটটির জন্য অপেক্ষা করছে। অর্থাৎ পাইথন এমনকি নির্বাহ শুরু না এ সব পর্যন্ত সমগ্র ডেটা প্রবাহ শেল দ্বারা পড়া হয়েছে এবং তারপর তার সম্পূর্ণতা পাস করা হয়েছে python

এমনকি python -u p1এটির পরিবর্তে চলমান (অর্থাত্ আনফারড এবং ফাইল থেকে পড়া p1) pythonপুরো ফাইলটি এর কোনও প্রয়োগের আগে পড়ার চেষ্টা করবে।

এই পরীক্ষা করে দেখুন।

বন্দর 1:

mkfifo p1
python < p1

টার্মিনাল ২:

cat > p1
print "Hello World"
print "Hello World"

আপনি দেখতে পাবেন যে আপনি একাধিক লাইন প্রেরণ করতে পারেন তবে টার্ম 1 এ পাইথন কিছুই করেনা। এখন ctrl+ টিপুন D। পুরো প্রোগ্রামটি একবারে কার্যকর করা হয়।

সুতরাং, সংক্ষেপে বলতে গেলে, আপনি পাইপ থেকে পাইথন পড়তে চাইলে আপনাকে পুরো প্রোগ্রামটি প্রেরণ করতে হবে। আপনি এইভাবে অজগরটি ইন্টারেক্টিভভাবে ব্যবহার করতে পারবেন না।


1

হতে পারে লেজের পদ্ধতির উন্নতি (আরও নমনীয়) তবে বিকল্প হিসাবে:

{ echo -n "print \"Hello World\""; cat; } > p1

এটি আমার ইচ্ছা মতো কাজ করে না। -nহে মুছে ফেলা হতে পারে। এবং যে পরে, 0. সঙ্গে টার্মিনাল echoকমান্ড অবরুদ্ধ পরার 1. পাইথন কমান্ড প্রয়োগ করে না যতক্ষন না আমি চাপুন ^cমধ্যে echoটার্মিনাল এবং উভয় প্রক্রিয়া বিনষ্ট।
লর্ড লোহ

1
@LordLoh। বাফারিং সমস্যা হতে পারে। সম্ভবত পর্যাপ্ত আউটপুট তৈরি করা হলে পাইথন কমান্ডটি কার্যকর করবে যাতে প্রথম লাইনটি শেষ পর্যন্ত FIFO এ লেখা যায়। তবে একটি কার্যনির্বাহী সমাধান হওয়ায় এই সমস্যাটি সমাধানে প্রচেষ্টা করা বুদ্ধিমানের কাজ নয়।
হউক লেগেছে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.