`বিড়াল <> ফাইল` কীভাবে কাজ করে?


42

cat < filestdout এ ফাইলের বিষয়বস্তু মুদ্রণ করে ।

cat > fileCtrlস্ট্যান্ডিন পড়েন যতক্ষণ না + Dসনাক্ত হয় এবং ইনপুট পাঠ্যটি ফাইলে লেখা হয় ।

cat <> fileকমপক্ষে আমার বাশের সংস্করণে ফাইলের সামগ্রীগুলি আনন্দের সাথে (ত্রুটি ছাড়াই) মুদ্রণ করে তবে ফাইলটি পরিবর্তন করে না এবং এটি সংশোধন টাইমস্ট্যাম্পটি আপডেট করে না।

>তৃতীয় বিবৃতিতে বাশ স্ট্যান্ডার্ড আপাতদৃষ্টিতে উপেক্ষা করা কীভাবে ন্যায়সঙ্গত করে - এবং আরও গুরুত্বপূর্ণভাবে, এটি কিছু করছে ?

উত্তর:


47

বাশ একটি পঠন-লিখন ফাইল বিবরণকারী<> তৈরি করতে ব্যবহার করে :

পুনঃনির্দেশ অপারেটর

[n]<>word

যার নাম শব্দের সম্প্রসারণ, ফাইলটি ডেস্ক্রিপ্টর এন-তে পড়া এবং লেখার জন্য, অথবা যদি এন নির্দিষ্ট না করা থাকে তবে ফাইল বর্ণনাকারী 0-তে উভয়ই খোলা থাকে causes ফাইল উপস্থিত না থাকলে, এটি তৈরি করা হয়।

cat <> filefileপঠন-লিখন খোলে এবং এটি বর্ণনাকারী 0 (স্ট্যান্ডার্ড ইনপুট) এ আবদ্ধ করে। এটি মূলত যে < fileকোনও সংবেদনশীলভাবে লিখিত প্রোগ্রামের সমতুল্য , যেহেতু সাধারণভাবে কেউ স্ট্যান্ডার্ড ইনপুটটিতে লেখার চেষ্টা করতে পারে না, তবে যদি কেউ এটি করতে সক্ষম হয়।

এটি সরাসরি পরীক্ষা করার জন্য আপনি একটি সাধারণ সি প্রোগ্রাম লিখতে পারেন - স্ট্যান্ডার্ড ইনপুট দিয়ে write(0, "hello", 6)লিখবেন ।hellofile

<>একই প্রভাব সহ অন্য কোনও পসিক্স-কমপ্লায়েন্ট শেলতেও কাজ করা উচিত ।


1
লিখছি ... স্টিডিনকে? ... এর জন্য কি কোনও বৈধ ব্যবহারের কেস আছে ?
কিউস

3
বন্ধ, আমি কোন ভাল সম্পর্কে ভাবতে পারি না। সুস্পষ্ট বর্ণনাকারী ( 4<>file) সরবরাহ করা কার্যকর এবং আমি মনে করি 0 এটিকে ছাড়ার পরে কোনও ডিফল্ট হিসাবে ভাল। স্টাডাউট থেকে পড়া আরও ভাল কিছু নয়।
মাইকেল হোমার

5
<>অন্য সিস্টেমে এটি লেখার জন্য না খোলা পর্যন্ত কিছু সিস্টেমে (লিনাক্সের মতো) নামযুক্ত পাইপগুলি ব্লক না করে খোলার জন্যও দরকারী।
স্টাফেন চেজেলাস

1
@ কিউস: ওয়েল লিখুন (0, "পাসওয়ার্ড:", 10) আপনি যদি কোনও টাইটির মতো কোনও বিষয়ে প্রম্পট করতে চান তবে পাসওয়ার্ডের জন্য প্রম্পট করার একটি ভাল উপায়। আমি এটি কেবল স্টাডারে দেখার অভ্যস্ত তবে বিশেষত কোনও কারণেই স্টাডিনে একই কৌশলটি কাজ করে না।
জোশুয়া

3
@Qix - থেকে POSIX নীতি - <>অপারেটর একটি অ্যাপ্লিকেশন বিভিন্ন টার্মিনাল সঙ্গে কাজ করবে এবং মাঝে মাঝে একটি শেল আরম্ভ করতে চেয়েছিলেন লিখিতভাবে দরকারী হতে পারে। এই শেলটি সাধারণত কোনও নিয়ন্ত্রণকারী টার্মিনাল থেকে চালিত অ্যাপ্লিকেশনগুলি চালাতে অক্ষম হবে যদি না এটি ব্যবহার করতে না পারে <>... যেমন ... পেজার more, যা এর কমান্ডগুলি পেতে স্ট্যান্ডার্ড ত্রুটি থেকে পড়ে, সুতরাং স্ট্যান্ডার্ড ইনপুট এবং স্ট্যান্ডার্ড আউটপুট উভয়ই তাদের সাধারণ ব্যবহারের জন্য উপলব্ধ। cat food | more - >/dev/tty03 2<>/dev/tty03
মাইকজার্ভ

38

<> fileট্রান্সকেশন ছাড়াই রিড + রাইটিং মোডে ফাইলটি (ফাইল বর্ণনাকারী 0 ( স্ট্যান্ডিনে ডিফল্টরূপে <) পছন্দ করে এবং ফাইলটি আগে উপস্থিত না থাকলে তৈরি করে

O_RDWR|O_CREATএটি open()সিস্টেম কলের সাথে প্রেরিত পতাকাগুলির সাথে সামঞ্জস্য । বিপরীতে <হয় O_RDONLYএবং >হয় O_WRONLY|O_CREAT|O_TRUNCএবং >> O_WRONLY|O_CREAT|O_APPEND

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

<> এর ব্যবহার থাকতে পারে:

  • আপনি যদি না চান তবে কমান্ডটি ব্যর্থ হতে চাইলে আপনি cat <> fileতার চেয়ে বেশি পছন্দ cat < fileকরতে পারেন fileতবে fileপরিবর্তে একটি খালি তৈরি করা হবে।
  • এর অ-কাটানো দিকটি <>এটি ফাইলগুলিকে জায়গায় ওভাররাইট করতে দরকারী করে। তবে সেই ক্ষেত্রে, আপনি সাধারণত ফাইল বর্ণনাকারী 0 এ এটি ব্যবহার করবেন না:

    printf xxx 1<> file

    এর fileসাথে প্রথম 3 বাইট প্রতিস্থাপন করে xxx

  • লিনাক্সের মতো কিছু সিস্টেমে, <>নামযুক্ত পাইপে (ফিফো) নামক পাইপটি ব্লক না করে খোলে (অন্য প্রান্তটি অন্য প্রান্তটি খোলার জন্য অপেক্ষা না করে), এবং নিশ্চিত করে যে পাইপের কাঠামোটি জীবিত রয়েছে। উদাহরণস্বরূপ:

    mkfifo pipe; sed 's/foo/bar/g' <> pipe

    sedএটি লিখিত অন্য যে কোনও প্রক্রিয়া থেকে আগত ডেটা পরিচালনা করে এবং কখনও দেখেনি eof


1
নোট করুন যে এটিএন্ডটি ksh93 এ, ( স্টিডিন ) এর পরিবর্তে ( স্টাডআউট ) <>ডিফল্ট হয়েছে । এটি একটি পসিক্স কমপ্লায়েন্স বাগ যা আমি রিপোর্ট করেছি এবং এটি পরবর্তী প্রকাশে স্থির করা হবে। github.com/att/ast/issues/75 তবে বর্তমান ksh93 সংস্করণ ব্যবহারের বাইরে চলে যাওয়া অবধি আপনাকে বহনযোগ্যভাবে ফাইল বর্ণনাকারী নম্বর অন্তর্ভুক্ত করতে হবে । 1<>0<><>
মার্টিজন ডেকার

@ মার্তিজজনডেকার, আমি জানি, আমিই সেই ব্যক্তিকে প্রথম স্থান সম্পর্কে আপনাকে বলছিলাম ;-)। মনে রাখবেন এটি কেবল ksh93t + (যেখানে আচরণটি পরিবর্তিত হয়েছে) এবং তারপরের জন্য।
স্টাফেন চেজেলাস

লিনাক্সের বিপরীতে সিস্টেমগুলি কী (বা ছিল) কোথায় mkfifo fifo; exec 3<>fifoব্লক হবে?
চাচা বিলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.