কম ফাইল 1 ফাইল 2 | বিড়াল - কেন এটি কাজ করে?


21

আমি যখন ইউএসএস less file1 file2করি তখন উভয় ফাইলই "কম বাফার ভিউয়ার" এ দেখানো হয় তবে স্টাডআউটে less file1 file2 | catসংযুক্ত দুটি ফাইলের সামগ্রী মুদ্রণ করে। এটি "কম বাফার ভিউয়ার" দেখানো উচিত বা পরবর্তী কমান্ডের জন্য স্টাডআউটে আউটপুট উত্পাদন করবে কিনা তা কম কীভাবে জানবে? এটি করার জন্য কোন পদ্ধতি ব্যবহার করা হয়?

উত্তর:


30

lessstdout পাঠ্য মুদ্রণ। stdout যায়

  • একটি টার্মিনাল (/ dev / tty?) এ গিয়ে ডিফল্ট বাফার ভিউয়ারটি খোলে
  • | ব্যবহার করে অন্য প্রোগ্রামে পাইপ দেওয়ার সময় পাইপের মাধ্যমে ( less text | cut -d: -f1)
  • > ( ) এর সাথে পুনর্নির্দেশের সময় কোনও ফাইলেless text > tmp

"ইসা টিটিআই " নামে একটি সি ফাংশন রয়েছে যা আউটপুটটি টিটিটি (৪.৮১, মেন। যদি তা হয় তবে এটি বাফার ভিউয়ার ব্যবহার করে অন্যথায় এটির মতো আচরণ করে cat

ব্যাশে আপনি পরীক্ষা ব্যবহার করতে পারেন (দেখুন man test)

  • -t এফডি ফাইল বর্ণনাকারী এফডি টার্মিনালে খোলা হয়
  • -p ফাইল উপস্থিত এবং এটি একটি নামযুক্ত পাইপ

উদাহরণ:

[[ -t 1 ]] && \
    echo 'STDOUT is attached to TTY'

[[ -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a pipe'

[[ ! -t 1 && ! -p /dev/stdout ]] && \
    echo 'STDOUT is attached to a redirection'

1
@tfh যদি STDOUT কোনও পাইপ বা পুনঃনির্দেশের সাথে সংযুক্ত না থাকে তবে এটি সঠিক যে তারা প্রিন্ট করে না যে STDOUT কোনও পাইপ বা পুনঃনির্দেশের সাথে সংযুক্ত। তিনটি একটি স্ক্রিপ্টে রাখুন। কল bash script.sh, bash script.sh | cat, bash script.sh > file, এবং দেখুন সেখানে কি আউটপুট পাবেন।
এইচডিভি

1
stdoutএমন কিছু নয় যা "কোনও ফাইলের কাছে লেখা যেতে পারে"। এটা আপনি কিছু write() করতেlessএর আউটপুট কোনও ফাইল, পাইপ, সকেট, বা ব্লক ডিভাইস, বা যাই হোক না কেন তার উপর নির্ভর করে আলাদাভাবে কিছু করতে হবে না। এটি কেবল গুরুত্বপূর্ণ যে এটি কোনও tty নয়, তাই এটি ঠিক এর মতো আচরণ করে cat। (আমি ধরে নিলাম আপনি এটি জানেন এবং এটি ব্যাখ্যা করার জন্য কেবল ভুল শব্দগুলি বেছে নিয়েছিলেন, তবে আমি ভেবেছিলাম এটি অন্য পাঠকদের জন্য তুলে ধরছি)।
পিটার কর্ডেস

সুতরাং আপনার অর্থ হ'ল আমার নির্দিষ্ট প্রশ্নে বিড়ালের মতো আচরণ করা কম কাজ - বা আরও সাধারণ: পাইপলাইনে পরবর্তী কমান্ডের মতো আচরণ করা। আমি যা বুঝতে পেরেছিলাম তা থেকে আমি ধরে নিতে পারি না যে ঠিক একই আচরণটি অন্য কোনও সরঞ্জামেও প্রয়োগ করা হয়েছে।
tfh

@ টিএফএফ: না, এরপরে less"চিত্র" খুঁজে পাবে না cat। এটি কেবল catপরবর্তী কী তা নির্বিশেষে আচরণ করে , যদি এটি স্টাডাউটটি টিটিআই না হয়।
পিটার কর্ডেস

@ মিশেলডি: ধন্যবাদ, আমার উত্তরটি সংশোধন করেছেন। আমি কেবল অনুমান করেছি যে lessএগিয়ে গিয়ে একটি টিসিজিইটিএস ব্যবহার করবে টার্মিনাল মাত্রা পেতে বা আবিষ্কার করলাম যে এটি টিটিটি নয়, তবে দৃশ্যত আমি ভুল অনুমান করেছি।
পিটার কর্ডেস

6

lessstdoutএটি কোনও টার্মিনাল কিনা তা যাচাই করে এবং catএটি কখন না হয় তার মতো আচরণ করে (ইওএফ না হওয়া পর্যন্ত স্টিডিনের অনুলিপি করে)।

এই বৈশিষ্ট্যটি আপনাকে এমন স্ক্রিপ্ট বা প্রোগ্রাম লিখতে দেয় যা সবসময় তাদের আউটপুট (যেমন --helpআউটপুট) প্রেরণ করে lessযখন কোনও ফাইলে সহজে পুনঃনির্দেশের অনুমতি দেয়। some_command --fullhelp > help.txtস্ট্যান্ডিনে পাঠ্য বা কোনও কিছুর মাধ্যমে পৃষ্ঠায় স্পেস-বারের জন্য অপেক্ষা করা থাকলে এটি স্তন্যপান হবে । কিছু কমান্ড (যেমন man) পেজারের মাধ্যমে তাদের আউটপুট প্রেরণ করবে কিনা তা নির্ধারণের জন্য তাদের নিজস্ব আউটপুট পরীক্ষা করে দেখুন। আপনি যদি চালনা করেন তবে man ls > ls.txtএটি কখনই আপনার অনুরোধ করে না $PAGER

lessকোনও পাইপলাইনে আরও স্টেজ যুক্ত করার সময় আপনি যদি ওয়ান-লাইনারের বাইরে সম্পাদনা করতে ভুলে যান তবে আপনার বিড়ালের মতো আচরণটি সুবিধাজনক।


lessটার্মিনাল মাত্রা (পর্দার আকার, একবারে কতগুলি লাইন প্রদর্শন করতে হবে তা জানতে) প্রয়োজন। ioctl(2)এটিতে ব্যবহার stdoutএকটি অ-টার্মিন্যালে ENOTTY ফিরে আসবে, তাই এটি যাহাই হউক না কেন অ টার্মিনাল মামলাটি পরিচালনা এড়াতে পারে না। lessপ্রকৃতপক্ষে isatty(3)টার্মিনালের মাত্রা যাচাই করার আগে ব্যবহার করে তবে isattyকেবলমাত্র টাইটি-আইওসিটিএল চেষ্টা করে এবং ত্রুটির অভাবে পরীক্ষা করে কাজ করে।

এমনকি একটি সাধারণ পেজারের মতো more(1)(কমপক্ষে ইউজ-লিনাক্স সংস্করণ) এই বৈশিষ্ট্যটি রয়েছে কারণ এটি সম্ভবত বাস্তব ক্ষেত্রে সবচেয়ে সহজ বুদ্ধিমান আচরণ that


মনে রাখবেন যে আপনি যখন কোনও কিছু পাইপ করেন less (যেমন grep foo bar.txt | less) তখন /dev/ttyকীবোর্ড ইনপুটটির জন্য এটি খুলতে হবে । (আপনি এটি দেখতে এটি দেখতে পারেন echo foo | strace less)।

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