পূর্ববর্তী কমান্ডটি STDOUT- এ লেখার সময় কী অন্য কোনও কমান্ডটি STDIN এ টাইপ করা নিরাপদ?


21

সম্ভবত এটির আগে উত্তর দেওয়া হয়েছে, আমি অন্য উত্তরের একটি লিঙ্ককে স্বাগত জানাব ...

আমি যদি bashনীচের মতো একটি শেল কমান্ড ( শেলের মধ্যে) চালিত করি:

make

তারপর যখন আউটপুট থেকে makeদ্বারা থেকে স্ক্রলিং করা হয় STDOUTএর makeকমান্ড, যদি আমি টাইপ make checkকরুন ও Enter enterআগে প্রথম কমান্ড নির্বাহ যখন সমাপ্ত হয় makeকমান্ড পরিশেষে শেষ পরবর্তী কমান্ড make checkডান আপ এবং চালানোর বাছাই হবে।

আমার প্রশ্ন (গুলি) কেবলমাত্র:

  1. এটি করা কি বিপজ্জনক?
  2. এই জাতীয় রাশ টাইপিং থেকে কোনও সম্ভাব্য অপ্রত্যাশিত আচরণ রয়েছে?
  3. কেন এটি এইভাবে কাজ করে?

2
1. আমি আশা করি এটি না ... আমি বছরের পর বছর ধরে এটি করছি!
জন ডব্লিউ এইচ স্মিথ

উত্তর:


20

এটি যেভাবে এটি করে সেভাবে কাজ করে কারণ ইউনিক্স পূর্ণ-দ্বৈত। রিচি যেমন ইউএনআইএক্স সময়-ভাগ করে নেওয়ার সিস্টেমে বলেছিলেন : একটি পূর্ববর্তী :

একটি জিনিস যা তুচ্ছ মনে হয়, তবুও এটির জন্য একবার ব্যবহার করার পরে অবাক করা এক পার্থক্য হয়, পুরো-দ্বৈত টার্মিনালটি I / O একসাথে পঠন-এগিয়ে। যদিও প্রোগ্রামগুলি সাধারণত একক অক্ষরের পরিবর্তে লাইনগুলির শর্তে ব্যবহারকারীর সাথে যোগাযোগ করে, ফুল-ডুপ্লেক্স টার্মিনাল I / O এর অর্থ ব্যবহারকারী যে কোনও সময় টাইপ করতে পারে, এমনকি সিস্টেমটি আবার টাইপ করতে পারে এমনকি অক্ষরগুলি হারাতে বা গার্বল করার ভয় ছাড়াই can । রিড-ফরোয়ার্ড সহ, প্রতিটি লাইনের প্রতিক্রিয়ার জন্য অপেক্ষা করতে হবে না। একটি নথিতে প্রবেশকারী একটি ভাল টাইপিস্ট প্রতিটি নতুন লাইন শুরু করার আগে বিরতি দেওয়ার জন্য অবিশ্বাস্যরকম হতাশ হয়ে পড়ে; যে কেউ জানে যে তিনি প্রতিক্রিয়ায় যে কোনও আলস্যতা বলতে চান তা মনস্তাত্ত্বিকভাবে বাড়িয়ে তোলে যদি তথ্যটি পুরো গতির পরিবর্তে কিছুটা হলেও প্রবেশ করতে হয়।

[শেষ উদ্ধৃতি]

বলা হচ্ছে, কিছু আধুনিক প্রোগ্রাম রয়েছে যা কোনও টাইপহেড খায় বা ফেলে দেয়; sshএবং apt-getদুটি উদাহরণ। আপনি যখন চালানোর সময় সামনে টাইপ করেন, আপনি দেখতে পাবেন যে আপনার ইনপুটটির প্রথম অংশটি অদৃশ্য হয়ে গেছে। এটি সম্ভবত একটি সমস্যা হতে পারে।

ssh remotehost do something that takes 20 seconds
mail bob
Dan has retired. Feel free to save any important files and then do
# ssh exits here, discarding the previous 2 lines
rm -fr *
.

তাই পরে bash fork()s এবং execকমান্ড গুলি, প্রথম কমান্ড এখনো সংযুক্ত STDINব্যাশ শেলের? মনে হচ্ছে উত্তরটি হ'ল না, বাশ পরবর্তী কমান্ডের জন্য বাফার করছে। এটা কি ঠিক?
111 ---

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

তাহলে কি STDINফিফো পদ্ধতিতে পরিচালনা করা হয়? এবং আমি অনুমান করি যে যদি বাশের শিশু প্রক্রিয়াটি সুস্পষ্টভাবে তার উত্তরাধিকার সূত্রে প্রাপ্ত ফাইল হ্যান্ডেলটি বন্ধ না করে STDINতবে এটি অতিরিক্ত টাইপিং থেকে এখনও পড়তে পারে ?
111 ---

হ্যাঁ, সমস্ত টার্মিনাল ইনপুট FIFO পরিচালিত হয়। নিশ্চিত না যে আমি আপনার দ্বিতীয় প্রশ্নটি বুঝতে পেরেছি। শিশু প্রক্রিয়া - কমান্ডটি শেলটি ডেকেছিল - সাধারণত স্পষ্টভাবে তার স্টিডিনটি বন্ধ করে না ; শেলটি প্রস্থান করে এবং কমান্ডটি যা চায় তার সব পড়তে দেয়, তারপরে শিশুটি থামে এবং শেলটি পড়া শুরু করে।
মার্ক প্লটনিক

হ্যাঁ আপনি আমার ফলোআপ প্রশ্ন দুটি খুব সুস্পষ্টভাবে সম্বোধন করেছেন, ধন্যবাদ!
111 ---

12

আপনি যে প্রাথমিক আচরণটি দেখছেন তা হ'ল ইনপুটটি কোথাও না পড়া পর্যন্ত কোনও বাফারে বসে থাকে (ভাল, আপনি যদি যথেষ্ট পরিমাণে টাইপ করেন তবে অবশেষে বাফারগুলি পূর্ণ হবে এবং কিছু হারিয়ে যাবে, যদিও এটি অনেক বেশি টাইপিং হবে)। মেক দ্বারা চালিত বেশিরভাগ জিনিসগুলি STDIN থেকে পড়েন না, তাই এটি বাফারে থাকে।

বিপদটি হ'ল ভুল কমান্ডটি আপনার ইনপুটটি পড়ে। যেমন, makeএমন কিছু কল করে যা আপনাকে প্রম্পট করার সিদ্ধান্ত নেয় এবং তারপরে এটি উত্তর হিসাবে আপনার পরবর্তী আদেশটি পড়তে পারে। এটি যে বিপজ্জনক তা অবশ্যই আদেশের উপর নির্ভর করে। (এগুলি প্রথমে সমস্ত ইনপুট ফ্ল্যাশ করতে পারে, কেবল আপনার পূর্ববর্তী ইনপুটটি বাতিল করে))

একটি কমান্ড, মেকফিলগুলিতে সাধারণত ব্যবহৃত হয়, এটি টেক্স হতে পারে। যদি এটির কোনও ত্রুটির মুখোমুখি হয় (এবং ব্যবহারকারীকে কখনই প্রম্পট করার জন্য কোনও পতাকা দেওয়া হয়নি), আপনি কীভাবে চালিয়ে যেতে চান তা তা জিজ্ঞাসা করবে।

একটি ভালো বিকল্প সম্ভবত রান করা: make && make check


8
  1. আচ্ছা, স্পষ্টতই, আপনি দ্বিতীয় কমান্ডটি চালাবেন না যা প্রথম কমান্ডের উপর নির্ভর করে ( makeআপনার উদাহরণস্বরূপ) সফলভাবে সম্পন্ন হয়েছে। উদাহরণস্বরূপ, make foo Enter> ./foo Enter একটি সমস্যা হতে পারে। আপনি টাইপ করার মতো অভ্যাসে প্রবেশের চেষ্টা করতে পারেন make && make check, যেখানে প্রথম কমান্ডটি সফল হলেই দ্বিতীয় আদেশটি কার্যকর করা হবে।
  2. তাত্ত্বিকভাবে সম্ভব যে প্রথম কমান্ড (প্রক্রিয়া (এস)) দ্বিতীয় কমান্ডের কিছু অংশ পড়তে পারে, বা অন্যথায় এটি টার্মিনাল ইনপুট বাফার থেকে সরিয়ে ফেলতে পারে। যদি এটির প্রথম ছয়টি অক্ষর খেয়ে থাকে তবে make checkআপনি কমান্ডটি কার্যকর করে শেষ করতে পারেন heckযা সম্ভবত আপনার সিস্টেমে নেই (তবে এটি সম্ভবত কিছু দুষ্টু হতে পারে)। যদি প্রথম কমান্ডটি এমন কিছু সৌম্য হয় যা আপনি জানেন এবং বিশ্বাস করেন তবে আমি অবিলম্বে কোনও সমস্যা দেখতে পাচ্ছি না।
  3. কিভাবে / কেন এটি কাজ করে? সিস্টেম কীবোর্ড ইনপুট বাফার করে। এটি সামান্য ই-মেইলের মতো: আপনি স্বল্প সময়ের মধ্যে একজনকে পাঁচটি বার্তা পাঠাতে পারেন এবং তারা তার ইনবক্সে বসে পড়বেন, অপেক্ষা করে অপেক্ষা করুন read একইভাবে, যতক্ষণ না প্রথম কমান্ড কীবোর্ড থেকে না পড়ছে ততক্ষণ আপনি যে কমান্ডটি টাইপ করবেন সেগুলি শেলটি পড়ার জন্য অপেক্ষা করবে। "টাইপ-ফরোয়ার্ড" কতটা বাফার হতে পারে সে সম্পর্কে একটি সীমা রয়েছে তবে এটি সাধারণত কয়েকশ অক্ষর (যদি কয়েক হাজার না হয়)।

2
1 পয়েন্ট বলতে, ধারণা করুন যে কমান্ডগুলি সম্পর্কিত নয়, যেমন lsএবং mountউদাহরণস্বরূপ। আমি কীভাবে বাফার ইনপুট পরিচালনা করা হয় তা বোঝার চেষ্টা করছি। উত্তর করার জন্য ধন্যবাদ.
111 ---
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.