স্টাডআউট ফাইল আউটপুট কমান্ড?


28

আমি জানি এটি catকরতে পারে, তবে এর মূল উদ্দেশ্যটি কেবল সামগ্রীটি প্রদর্শন করার পরিবর্তে সম্মিলিত করা।

আমি এ সম্পর্কেও জানি lessএবং moreতবে আমি এমন কিছু সাধারণ ( পেজার নয় ) সন্ধান করছি যা কেবলমাত্র কোনও ফাইলের বিষয়বস্তু টার্মিনালে আউটপুট করে এবং বিশেষত এটির জন্য এটি তৈরি করা হয়, যদি এই জাতীয় জিনিস থাকে।


1
প্রকৃতপক্ষে আপনি বিড়াল ব্যবহারের 99% বার কোনও বিষয়কে যুক্তিযুক্ত করার পরিবর্তে ফাইল প্রদর্শন করা।
ল্যাটিনসুড

1
@ ল্যাটিনসুড - 100% সময় - সম্মতি দেয় cat
মাইকজার্ভ

@ মিমকিজার: কোনও অপারেশন করে আপনি কী বোঝাতে চাইছেন এটি একটি বিষয়; স্বাভাবিক ভাষার ব্যবহার হ'ল বোঝা যায় এটি কমপক্ষে একবার করা হয়েছে। একটি খালি স্ট্রিং "মুদ্রণ" কোনও অক্ষর মুদ্রণ জড়িত না; এটি কোনও কিছুই মুদ্রণ করছে না তা বলা উচিত হবে। এখন কম্পিউটিংয়ের a+b+cসাথে 2 টি সংযোজন করা জড়িত, এবং কম্পিউটিংয়ে aকিছু যুক্ত করা জড়িত না। একইভাবে মৃত্যুদণ্ড কার্যকর করা cat fকিছু জড়িত জড়িত না (যদিও এটি কেবল "এক ফাইলের ক্রমকে বোঝানো" অর্থ হতে পারে)।
মার্ক ভ্যান লিউউইন

2
@ মাইকজার্ভ: আপনার আউটটি আপনি কী বলতে চান তা আমি পাই না। শিওর catএকটি ফাইল পড়ে এবং অন্য একটি ফাইল (স্ট্রিম) লেখেন তবে এর অর্থ এই নয় যে এটি কোনও কিছুর সাথে মিলিয়ে গেছে। আপনি সম্ভবত বলতে চাইছেন যে cat fএটি আসলে করছে cat - f, এটি ঠিক সত্য নয়।
মার্ক ভ্যান লিউউইন

1
@ বিভ্রান্ত00: catআসলেই বোঝা যাচ্ছিল ( cat file1 file2উভয় ফাইলকে স্টাডাউট করে দেবে)। তবে এর পার্শ্ব প্রতিক্রিয়াটি হ'ল, যখন কেবল 1 টি যুক্তি হিসাবে ফাইল থাকে, তখন এটি একটি ফাইলকে স্টডআউটে আউটপুট করে দেয় (যেখানেই এটি যায়, আপনার টার্মিনাল হয় বা কোনও কিছুর দিকে পুনঃনির্দেশিত হয়)। সুতরাং stdout এ আউটপুট দেওয়ার জন্য অন্য কোনও কমান্ড তৈরি হয়নি, যেমনটি catবিদ্যমান ছিল এবং সহজভাবে এটি অনুমোদিত হয়েছিল। সুতরাং আপনি ব্যবহার করতে চান cat
অলিভিয়ার ডুলাক

উত্তর:


37

সবচেয়ে সুস্পষ্ট এক cat। তবে, দেখুন headএবং tail। এছাড়া আরও কিছু শেল utillities লাইন দ্বারা একটি ফাইল লাইন প্রিন্ট করতে হয়: sed, awk, grep। তবে সেগুলি ফাইলের সামগ্রীর বিকল্প বা ফাইলের অভ্যন্তরে অনুসন্ধান করা।

কোনটি সবচেয়ে কার্যকর তা অনুমান করার জন্য আমি কয়েকটি পরীক্ষা করেছি। straceসর্বনিম্ন সিস্টেমে কল এসেছে তা দেখতে আমি সমস্ত গর্ত চালাচ্ছি । আমার ফাইলটি 1275 লাইন আছে।

  • awk: 1355 সিস্টেম কল
  • cat: 51 সিস্টেম কল
  • grep: 1337 সিস্টেম কল
  • head: 93 সিস্টেম কল
  • tail: 130 সিস্টেম কল
  • sed: 1378 সিস্টেম কল

আপনি দেখতে পাচ্ছেন, catফাইলগুলি একত্রীকরণের জন্য তৈরি করা হলেও এটি দ্রুত এবং কার্যকর কার্যকর। sed, awkএবং grepফাইল লাইন লাইন প্রিন্ট করেছেন, সে কারণেই তাদের কাছে 1275 সিস্টেমের কল রয়েছে।


8
সিস্টেলগুলি গণনা করার জন্য ভাল ধারণা!
জানুয়ারী

1
+1, উত্তরটি আরও নির্ভুল (বিড়ালের অর্থ সম্পর্কে), আরও সম্পূর্ণ (বিকল্পগুলি), এবং গবেষণা করা হয়েছে (সিস্টেমে)
অলিভিয়ার ডুলাক

23

আমি জানি এটি catকরতে পারে, তবে এর মূল উদ্দেশ্যটি কেবল সামগ্রীটি প্রদর্শন করার পরিবর্তে সম্মিলিত করা।

এর উদ্দেশ্য catহ'ল স্টাডআউট থেকে একটি ফাইল এবং আউটপুট পড়ুন।


1
তবে cat --help"কনক্যাটেনেট ফাইল (গুলি), বা স্ট্যান্ডার্ড আউটপুটে স্ট্যান্ডার্ড ইনপুট" বলে। আমি কিছুতেই মনযোগ দিতে চাই না
বিভ্রান্ত

18
বিশ্বাস করুন বা না করুন, বিড়াল হ'ল আপনি যেভাবেই সন্ধান করছেন।
জানুয়ারী

5
না, @ বিভ্রান্ত00, জান এর অধিকার। জিনিস - টার্মিনাল হল stdout- এ - আপনি দেখতে? না readlink /dev/fd/1- উদাহরণস্বরূপ আপনি সেখানে আপনার TTY নাম পাওয়া উচিত যদি একটি প্রমিত প্রম্পটে চলছে। সুতরাং আউটপুট কনকানটেটিং ইনপুট হল আপনি যা করতে বলছেন।
মাইকজার্ভ

2
@ মিকসার্ভ হ্যাঁ, আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, আমি অনুমান করি যে আমি 'কনটেনেটেট' অর্থের উপর খুব দৃ fixed় ছিল।
বিভ্রান্ত

3
যুক্তিটি হ'ল, একটি ফাইলের বিষয়বস্তু মুদ্রণ করা ক্রমানুসারে এক বা একাধিক ফাইলের বিষয়বস্তু মুদ্রণের জন্য বিশেষ ঘটনা ।
zwol

10

প্রথমে catস্ট্যান্ডার্ড আউটপুট লিখুন, যা একটি টার্মিনাল নয়, এমনকি catইন্টারেক্টিভ শেলটিতে কমান্ডের অংশ হিসাবে টাইপ করা হলেও । স্ট্যান্ডার্ড আউটপুট পুনঃনির্দেশিত হওয়া সত্ত্বেও আপনার যদি সত্যিই টার্মিনালে লেখার জন্য কিছু প্রয়োজন হয় তবে এটি এত সহজ নয় (কোন টার্মিনালটি আপনাকে নির্দিষ্ট করতে হবে এবং কোনও স্ক্রিপ্ট থেকে কমান্ডটি কার্যকর করা হলেও এটি একটি নাও থাকতে পারে), যদিও একটি কমান্ডটি কেবল পাইপলাইনের একটি অংশ হয়ে থাকলে (আব) স্ট্যান্ডার্ড ত্রুটি আউটপুট ব্যবহার করতে পারে। তবে যেহেতু আপনি ইঙ্গিত করেছেন যে catপ্রকৃতপক্ষে কাজটি করে, তাই আমি মনে করি আপনি এমন পরিস্থিতি সম্পর্কে জিজ্ঞাসা করছেন না।

যদি আপনার উদ্দেশ্য হ'ল স্ট্যান্ডার্ড আউটপুটে যা লেখা থাকে তা পাইপলাইনে প্রেরণ করা হয়, তবে ব্যবহার catকরা বিড়াল পুরষ্কারের অকেজো ব্যবহারের যোগ্য হবে , যেহেতু cat file | pipeline(যেখানে pipelineকোনও পাইপলাইন দাঁড়িয়েছে) হিসাবে আরও দক্ষতার সাথে করা যেতে পারে <file pipeline। তবে আবার, আপনার কথাটি থেকে আমি অনুমান করি যে এটি আপনার উদ্দেশ্য নয়।

সুতরাং আপনি কীসের জন্য উদ্বিগ্ন তা এটি পরিষ্কার নয়। আপনি যদি catটাইপ করতে খুব দীর্ঘ খুঁজে পান তবে আপনি একটি- বা দ্বি-চরিত্রের উপন্যাস সংজ্ঞায়িত করতে পারেন (এখনও এমন কয়েকটি নাম রয়েছে যা স্ট্যান্ডার্ড ইউনিক্সে অব্যবহৃত থাকবে)। তবে আপনি যদি উদ্বেগ করছেন যে catএটি অকেজো চক্র ব্যয় করছে, আপনার উচিত হবে না।

যদি এমন কোনও প্রোগ্রাম থাকে nullযা কোনও আর্গুমেন্ট না নেয় এবং কেবল স্ট্যান্ডার্ড ইনপুটটিকে স্ট্যান্ডার্ড আউটপুট (পাইপলাইনের জন্য নিরপেক্ষ বস্তু) অনুলিপি করে, আপনি যা চান তা করতে পারেন <file null। এ জাতীয় কোনও প্রোগ্রাম নেই, যদিও এটি লেখা সহজ হবে (কেবলমাত্র একটি লাইন mainফাংশন সহ একটি সি প্রোগ্রামটি কাজটি করতে পারে), তবে catযুক্তি ছাড়াই কল করা (বা cat -আপনি যদি স্পষ্ট করে বলতে চান) ঠিক তা করে।

যদি এমন কোনও nocatপ্রোগ্রাম ছিল যা সঠিকভাবে একটি ফাইলনাম আর্গুমেন্ট নেয়, ফাইলটি খোলার চেষ্টা করে, না পারলে অভিযোগ করে এবং অন্যথায় ফাইল থেকে স্ট্যান্ডার্ড আউটপুটে অনুলিপি করে এগিয়ে যায়, তবে আপনি যা চান তা ঠিক তাই হবে। এটি লেখার চেয়ে সামান্য কঠিন null, মূল কাজটি ফাইলটি খোলার, পরীক্ষা করা এবং সম্ভবত অভিযোগ করা (আপনি যদি নিখুঁত হন তবে আপনি একটি পরীক্ষাও অন্তর্ভুক্ত করতে পারেন যে সেখানে একটি যুক্তি রয়েছে, এবং অন্যথায় অভিযোগও করতে পারেন)। কিন্তু আবার cat, এখন একটি একক যুক্তি সরবরাহ করা ঠিক তা করে, তাই কোনও nocatপ্রোগ্রামের প্রয়োজন নেই ।

আপনি একবার nocatপ্রোগ্রাম লিখতে সফল হয়ে গেলে , কেন একটি যুক্তি দিয়ে থাম? কোডটিকে একটি লুপে মুড়িয়ে ফেলা for(;*argp!=NULL;++argp)সত্যিই কোনও প্রচেষ্টা নয়, বাইনারিটিতে বেশিরভাগ মেশিনের নির্দেশাবলী যুক্ত করে এবং একটি ভুল সংখ্যক যুক্তি (যা আরও অনেক নির্দেশাবলীর হাতছাড়া করে) সম্পর্কে অভিযোগ না করা এড়িয়ে চলে। Voilà catফাইলগুলির একটি প্রাথমিক সংস্করণ aten (সত্যি কথা বলতে আপনাকে এটিকে কিছুটা টুইট করতে হবে যাতে যুক্তি ছাড়াই এটি এরূপ আচরণ করে null))

অবশ্যই সত্যিকারের catপ্রোগ্রামে তারা কয়েকটি ঘণ্টা এবং হুইসেল যুক্ত করেছে, কারণ তারা সর্বদা করে। তবে সারমর্মটি হ'ল catব্যয়গুলির "কনটেনটেশন" দিকটি প্রোগ্রামার বা মেশিন এটি কার্যকর করার জন্য মোটেই কোনও প্রচেষ্টা করে না। সত্য যে এই জাতীয় প্রোগ্রামের অস্তিত্বকে catসাবমিট করে nullএবং nocatব্যাখ্যা করে। catযদি ফলাফলটি পাইপলাইনে যায় তবে একক যুক্তির সাথে ব্যবহার করা এড়িয়ে চলুন , তবে এটি যদি কেবল টার্মিনালে ফাইল সামগ্রী প্রদর্শন করার জন্য ব্যবহার করা হয়, এমনকি আমি যে পৃষ্ঠাটির সাথে লিঙ্ক করেছি তা স্বীকার করে যে এটি একটি দরকারী ব্যবহার cat, তাই দ্বিধা করবেন না।


আপনি পরীক্ষা করতে পারেন যে catহিপথেটিক্যাল nocatকার্যকারিতা চারপাশে একটি সাধারণ লুপ দ্বারা বাস্তবায়িত হয়েছে , catবেশ কয়েকটি ফাইলের নাম দিয়ে কল করে যার মধ্যে একটি অবৈধ নাম, প্রথম অবস্থানে নেই: এই ফাইলটি উপস্থিত নেই বলে সরাসরি অভিযোগ করার চেয়ে catপ্রথমে প্রিভিডিংকে ডাম্প করে বৈধ ফাইলগুলি এবং তারপরে অবৈধ ফাইল সম্পর্কে অভিযোগ করে (কমপক্ষে এটি আমার বিড়ালের সাথে আচরণ করে)।


7

zshচেষ্টা অধীনে

<file

আমি বিশ্বাস করি এটি কোনও ফাইল মুদ্রণের সবচেয়ে স্বল্পতম উপায়। এটি 'আড়াল' ব্যবহার করে cat(বা moreযদি স্ট্ডআউট টার্মিনাল হয়) তবে মুদ্রণের জন্য ব্যবহৃত কমান্ডটি READNULLCMDভেরিয়েবল দ্বারা নিয়ন্ত্রিত হয় যা আপনি নিরাপদে কমান্ডের নাম বা কোনও ফাংশন দ্বারা সরাসরি ওভাররাইট করতে পারবেন। উদাহরণস্বরূপ লাইন নম্বর সহ ফাইলগুলি মুদ্রণ করতে:

numcat() { nl -s'> ' -w2 - }
READNULLCMD=numcat
<file

5

পসিক্স বিড়ালটিকে এভাবে সংজ্ঞায়িত করে :

NAME এর

বিড়াল - সংযুক্ত এবং ফাইল মুদ্রণ

সংক্ষিপ্তসার

বিড়াল [-u] [ফাইল ...]

বর্ণনা

বিড়াল ইউটিলিটি ফাইলগুলি ক্রমানুসারে পড়বে এবং তাদের বিষয়বস্তুগুলিকে একই অনুক্রমের স্ট্যান্ডার্ড আউটপুটে লিখবে।

সুতরাং আমি মনে করি এখানে একত্রীকরণ মানে ক্রমানুসারে ফাইলগুলি পড়ুন


5

আমি জানি এটি অতীত কালীন প্রশ্ন। প্রযুক্তিগতভাবে, যেহেতু কোনও ফাইলের বিষয়বস্তু মুদ্রণ করা একযোগে stdoutরূপান্তরিত হয় catতাই শব্দার্থগতভাবে উপযুক্ত। ভুলে যাবেন না যে printfশব্দার্থগতভাবে ডেটা ফর্ম্যাট এবং মুদ্রণের উদ্দেশ্যে করা হয়েছে। বাশ ফাইল থেকে ইনপুট এবং আউটপুট পুনর্নির্দেশের সিনট্যাক্স সরবরাহ করে। এগুলির সংমিশ্রণ এটির উত্পাদন করতে পারে:

printf '%s' "$(<file.txt)"

4
বিশেষত চারপাশ ছাড়াও প্রদর্শিত কমান্ডটি সমতুল্য নয় cat file.txt, কারণ এটি কোনও চলমান নিউলাইনগুলি সরিয়ে ফেলবে (এটি $(...)করে)।
মার্ক ভ্যান লিউউইন

+1, দুর্দান্ত ধরা। সেটা জানি না.
জেমস এম। লে

3

bashবিল্টিনগুলি ব্যবহার করা এবং সাব-প্রসেস সৃষ্টি এড়ানো:

{ while IFS='' read -rd '' _bcat_; do printf '%s\0' "${_bcat_}"; done; printf '%s' "${_bcat_}"; unset _bcat_; } <'/path/to/file'

IFSকেবলমাত্র readআদেশে প্রয়োগ করা হবে , সুতরাং আপনার বিশ্বব্যাপী IFSপরিবর্তনগুলি নিয়ে চিন্তা করবেন না ।

নাল অক্ষরগুলি পরিচালনা করার জন্য লুপের প্রয়োজন (স্টাফেন চেজেলাসকে ধন্যবাদ)।

এই উপায়টি বড় ফাইলগুলির জন্য উপযুক্ত নয় কারণ ফাইলের সামগ্রীটি প্রথমে ভেরিয়েবলের (তাই মেমরির) পড়তে পারে। বিটিডাব্লু আমি এইভাবে 39 এম পাঠ্য ফাইলটি মুদ্রণের চেষ্টা করেছি এবং ব্যাশ মেমরির ব্যবহার 5 এম এর বেশি নয়, সুতরাং এই ক্ষেত্রে সম্পর্কে নিশ্চিত হন না।

এটি ধীরে ধীরে ধীরে ধীরে এবং সিপিইউকে অক্ষমও করে: একই 39M ফাইলের জন্য এটি একক কোরের 100% ব্যবহারের সাথে 3 মিনিট সময় নেয়।

বড় ফাইল বা বাইনারিগুলির জন্য আরও ভাল ব্যবহার করা cat '/path/to/file'বা dd if='/path/to/file' bs=1Mসম্ভব হলেও ।


1
আরও দেখুন pv -qযা লিনাক্স ব্যবহার করতে পারেন splice()stdin- র অভ্যন্তরস্থ কিছু ধরনের জন্য / stdout- এ পারফরমেন্স উন্নত করতে হবে পারে।
স্টাফেন চেজেলাস

1

যেমন একটি বিক্ষোভ, আপনি করতে পারেন

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