শেল কেন স্বয়ংক্রিয়ভাবে "বিড়ালের অকেজো ব্যবহার" ঠিক করে না? [বন্ধ]


28

অনেক লোক লাইনে বরাবর কোড যুক্ত ওনেলাইনার এবং স্ক্রিপ্ট ব্যবহার করে

cat "$MYFILE" | command1 | command2 > "$OUTPUT"

প্রথমটিকে catপ্রায়শই "বিড়ালের অকেজো ব্যবহার" বলা হয় কারণ প্রযুক্তিগতভাবে এটির জন্য একটি নতুন প্রক্রিয়া শুরু করা প্রয়োজন (প্রায়শই /usr/bin/cat) যেখানে কমান্ডটি থাকলে এটি এড়ানো যেত often

< "$MYFILE" command1 | command2 > "$OUTPUT"

কারণ তখন শেলটি কেবলমাত্র শুরু করা দরকার command1এবং কেবলমাত্র stdinপ্রদত্ত ফাইলটিতে এটি নির্দেশ করতে হবে।

কেন শেল স্বয়ংক্রিয়ভাবে এই রূপান্তরটি করে না? আমি অনুভব করি যে "বিড়ালের অকেজো ব্যবহার" সিনট্যাক্সটি পড়া সহজ এবং শেলটির অকার্যকর বিড়ালটি স্বয়ংক্রিয়ভাবে মুক্তি পাওয়ার জন্য পর্যাপ্ত তথ্য থাকা উচিত। catPOSIX মান সংজ্ঞায়িত করা হয়, যাতে শেল পাথ একটি বাইনারি ব্যবহারের অভ্যন্তরীণভাবে এর পরিবর্তে এটি বাস্তবায়ন করার অনুমতি দেওয়া হবে। শেলটি এমনকি কেবলমাত্র একটি যুক্তির সংস্করণ এবং পথে বাইনারি ফ্যালব্যাকের জন্য বাস্তবায়ন ধারণ করতে পারে।


22
এই কমান্ডগুলি আসলে সমতুল্য নয়, যেহেতু এক ক্ষেত্রে স্টিডিন একটি ফাইল এবং অন্য ক্ষেত্রে এটি একটি পাইপ, সুতরাং এটি কঠোরভাবে নিরাপদ রূপান্তর হবে না। যদিও আপনি এটি করতে পারেন এমন একটি সিস্টেম তৈরি করতে পারেন।
মাইকেল হোমার

14
আপনি যে কোনও ব্যবহারের ক্ষেত্রে কল্পনা করতে পারবেন না তার অর্থ এই নয় যে কোনও অ্যাপ্লিকেশনটিকে নির্ধারিতভাবে আচরণের উপর নির্ভর করতে দেওয়া হয় না। এর থেকে ত্রুটি পাওয়া lseekএখনও সংজ্ঞায়িত আচরণ এবং ভিন্ন পরিণতির কারণ হতে পারে, ভিন্ন ব্লক করা আচরণটি শব্দার্থগতভাবে অর্থবহ হতে পারে ইত্যাদি। যদি আপনি জানতেন যে অন্যান্য আদেশগুলি কী ছিল এবং তারা জানত না যে তারা যত্নশীল নয়, বা যদি আপনি কেবলমাত্র সেই স্তরের সামঞ্জস্যতা সম্পর্কে চিন্তা না করেন তবে সুবিধাটি খুব সামান্য। আমি কল্পনা করি উপকারের অভাব পরিস্থিতি কনফারেন্স ব্যয়ের চেয়ে বেশি চালিত করে।
মাইকেল হোমার

3
শেলটি সম্পূর্ণরূপে catনিজেকে বা অন্য কোনও ইউটিলিটি বাস্তবায়িত করার অনুমতি দেয় । এটি সিস্টেমের সাথে সম্পর্কিত অন্যান্য ইউটিলিটিগুলি কীভাবে কাজ করে তাও জানার অনুমতি দেওয়া হয়েছে (উদাহরণস্বরূপ এটি জানতে পারে যে সিস্টেমের সাথে আসা বাহ্যিক grepবাস্তবায়ন কী আচরণ করে)। এটি করা সম্পূর্ণরূপে কার্যকর, তাই তারা কেন তা করবেন না তা অবাক করে দেওয়া সম্পূর্ণ ন্যায্য।
মাইকেল হোমার

6
@MichaelHomer যেমন তাহা জানিতে পারে কিভাবে বহিরাগত, grep বাস্তবায়ন সিস্টেম আচরণ করবে সাথে আসা শেল তাই এখন এর আচরণের উপর নির্ভরশীলতার হয়েছে grep। এবং sed। এবং awk। এবং du। এবং হাজার হাজার অন্যান্য ইউটিলিটি না হলে কত শত?
অ্যান্ড্রু হেনেল

19
আমার জন্য আমার কমান্ডগুলি সম্পাদনা করা আমার শেলটি থেকে বেশ শান্ত হবে।
আজোর অহাই

উত্তর:


25

দুটি কমান্ড সমতুল্য নয়: ত্রুটি পরিচালনার বিষয়টি বিবেচনা করুন:

cat <file that doesn't exist> | less খালি স্ট্রিম তৈরি করবে যা পাইপযুক্ত প্রোগ্রামে চলে যাবে ... যেমন আপনি কোনও প্রদর্শন না করেই শেষ করেন।

< <file that doesn't exist> less বারটি খুলতে ব্যর্থ হবে এবং তারপরেও কম খুলবে না।

পূর্বেরটিকে আধুনিক হিসাবে পরিবর্তিত করার চেষ্টা করা এমন কোনও স্ক্রিপ্টকে ভেঙে ফেলতে পারে যা সম্ভাব্য ফাঁকা ইনপুট দিয়ে প্রোগ্রামটি চালানোর আশা করে।


1
আমি আপনার প্রতিক্রিয়াটিকে স্বীকৃত হিসাবে চিহ্নিত করব কারণ আমি মনে করি এটি উভয় বাক্য গঠনের মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য। উইন্ডোটির বৈকল্পিকটি catসর্বদা পাইপলাইনে দ্বিতীয় কমান্ডটি কার্যকর করে whereas
মিক্কো রেন্টালাইনেন

যাইহোক, নোট যে <"missing-file" grep foo | echo 2কার্যকর করা হবে না grepকিন্তু কার্যকর করা হবে echo
মিক্কো রেন্টালাইনেন

51

"স্ক্রিনটি catকার্যকর করার সময় আসলে কী চালায় than তার চেয়ে আপনি কীভাবে আপনার কোডটি লেখেন সে সম্পর্কে " অপ্রয়োজনীয় ব্যবহার "is এটি এক ধরণের ডিজাইনের অ্যান্টি-প্যাটার্ন , এমন কিছু উপায় যাবার উপায় যা সম্ভবত আরও দক্ষ পদ্ধতিতে করা যেতে পারে। একটি নতুন সরঞ্জাম তৈরি করার জন্য প্রদত্ত সরঞ্জামগুলিকে কীভাবে সর্বোত্তমভাবে সমন্বিত করা যায় তা বোঝার ক্ষেত্রে এটি ব্যর্থতা। আমি যুক্তি দিয়েছিলাম যে পাইপলাইনে এক সাথে বেশ কয়েকটি sedএবং / অথবা awkকমান্ডগুলি স্ট্রিং করাও মাঝে মাঝে এই একই অ্যান্টি-প্যাটার্নের লক্ষণ হিসাবে বলা যেতে পারে।

catকোনও স্ক্রিপ্টে "অকেজো ব্যবহারের" উদাহরণগুলি স্থির করে প্রধানত স্ক্রিপ্টের উত্স কোডটি ম্যানুয়ালি ফিক্স করার বিষয়। শেলচেকের মতো একটি সরঞ্জাম এর সাথে সুস্পষ্ট ঘটনাগুলি দেখিয়ে সাহায্য করতে পারে:

$ cat script.sh
#!/bin/sh
cat file | cat
$ shellcheck script.sh

In script.sh line 2:
cat file | cat
    ^-- SC2002: Useless cat. Consider 'cmd < file | ..' or 'cmd file | ..' instead.

শেল স্ক্রিপ্টগুলির প্রকৃতির কারণে স্বয়ংক্রিয়ভাবে শেলটি পাওয়া শক্ত হয়ে উঠবে। স্ক্রিপ্ট কার্যকর করার পদ্ধতিটি তার প্যারেন্ট প্রক্রিয়া থেকে উত্তরাধিকার সূত্রে প্রাপ্ত পরিবেশের উপর এবং উপলভ্য বাইরের কমান্ডগুলির নির্দিষ্ট প্রয়োগের উপর নির্ভর করে।

শেল অগত্যা কী তা জানে না cat। এটি আপনার , বা কোনও ক্রিয়াকলাপের যে কোনও জায়গা থেকে সম্ভাব্যভাবে কোনও আদেশ হতে পারে $PATH

যদি এটি একটি অন্তর্নির্মিত কমান্ড (যা এটি কিছু শেলের মধ্যে থাকতে পারে) হত তবে পাইপলাইনটি পুনর্গঠন করার ক্ষমতা থাকতে পারে কারণ এটি তার বিল্ট-ইন catকমান্ডের শব্দার্থ সম্পর্কে জানত । এটি করার আগে, এটির পরে পাইপলাইনে পরবর্তী কমান্ডটি সম্পর্কে মূল ধারণা পরেও অনুমান করা উচিত cat

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

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


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

4
পছন্দ করেছেন তবে এটি একই নামের একটি ক্রিয়াকলাপ সহ একটি মানক কমান্ডও ওভারলোড করার অনুমতি দেয়।
কুসালানন্দ

2
@ ফিলিপ কাউলিং যতক্ষণ না এটি জানা যায় যে পাইপলাইনের কোনওটিরই যত্ন নেই It's শেলটি বিশেষত বিল্টিনস বা শেল ফাংশনগুলির সাথে ইউটিলিটিগুলি প্রতিস্থাপন করার অনুমতি দেওয়া হয় এবং এগুলির কার্যকরকরণের পরিবেশের কোনও বিধিনিষেধ নেই, যতক্ষণ না বাহ্যিক ফলাফল যতক্ষণ পার্থক্য করতে পারে তার অনুমতি দেওয়া হয়। আপনার ক্ষেত্রে, cat /dev/ttyআকর্ষণীয় এটির সাথে আলাদা হবে<
মাইকেল হোমার

1
@ মিশেলহোমর যতক্ষণ না বহিরাগত ফলাফলটি অবিচ্ছেদ্য হয় তবে এর অর্থ এই যে যেভাবে ব্যবহারযোগ্য সামগ্রীর পুরো সেটটির পদ্ধতি এমনভাবে পরিবর্তিত হতে পারে না । এটি চূড়ান্ত নির্ভরতা নরক হতে হবে।
অ্যান্ড্রু হেনেল

3
@ মিশেলহোমর অন্যান্য মন্তব্য যেমন বলেছে, অবশ্যই শেলের পক্ষে এটি পুরোপুরি প্রশংসনীয় যেcat ওপি'র ইনপুট দেওয়া থাকলে এটি কার্যকর না করে কমান্ডটি আসলে কী করে তা বলা অসম্ভব । সমস্ত আপনি (এবং শেল) তোমরা জেনে, অপ কমান্ড রয়েছে cat, তার পাথ যা একটি ইন্টারেক্টিভ বিড়াল সিমুলেশন হল "myfile" শুধু সঞ্চিত খেলা রাষ্ট্র, এবং command1এবং command2বর্তমান বাজানো অধিবেশন সম্পর্কে কিছু পরিসংখ্যান postprocessing করছে ...
আলেফজেরো

34

কারণ এটি অকেজো নয়।

এর ক্ষেত্রে cat file | cmd, এর fd 0(stdin) cmdএকটি পাইপ হবে এবং cmd <fileএটির ক্ষেত্রে নিয়মিত ফাইল, ডিভাইস ইত্যাদি হতে পারে

একটি পাইপের একটি নিয়মিত ফাইল থেকে আলাদা শব্দার্থক থাকে, এবং এর শব্দার্থবিজ্ঞানগুলি নিয়মিত ফাইলগুলির উপসেট নয় :

  • একটি নিয়মিত ফাইল অর্থপূর্ণ উপায়ে select(2)সম্পাদনা বা poll(2)এডিট করা যায় না; একটি select(2)এটিতে সর্বদা "জন্য তৈরি" ফিরে আসবে। epoll(2)লিনাক্সের মতো উন্নত ইন্টারফেসগুলি কেবল নিয়মিত ফাইলগুলির সাথে কাজ করবে না।

  • লিনাক্স সেখানে সিস্টেম কল (হয় splice(2), vmsplice(2), tee(2)) যা শুধুমাত্র পাইপ কাজ [1]

যেহেতু catএত বেশি ব্যবহৃত হয়, এটি শেল অন্তর্নির্মিত হিসাবে প্রয়োগ করা যেতে পারে যা অতিরিক্ত প্রক্রিয়া এড়াতে পারে, তবে একবার আপনি যদি সেই পথটি শুরু করেন, তবে একই কাজটি বেশিরভাগ কমান্ডের সাহায্যে করা যেতে পারে - শেলটিকে ধীর এবং ক্লানকিয়ারে রূপান্তরিত করা perlবা python। পরিবর্তে ধারাবাহিকতার জন্য পাইপ-জাতীয় সিনট্যাক্স ব্যবহার করার জন্য আরও একটি স্ক্রিপ্টিং ভাষা লেখার চেয়ে এটি আরও ভাল ;-)

[1] আপনি যদি উপলক্ষটির জন্য তৈরি না করা একটি সাধারণ উদাহরণ চান, তবে আপনি এখানে মন্তব্যটিতে কিছু ব্যাখ্যা সহ আমার "এক্সিকিউটিভ বাইনারি ফর্ম স্টিডিন" গিট গিস্টটি দেখতে পারেন । ইউইউসিবি ব্যতীত এটিকে কাজ করার জন্য এটির ভিতরে এটি প্রয়োগ করে এটি 2 বা 3 গুণ বড় করে তুলতে পারে।cat


2
আসলে, ksh93 অভ্যন্তরীণভাবে কিছু বাহ্যিক কমান্ড প্রয়োগ করে implement cat
jrw32982 মনিকা 19

3
cat /dev/urandom | cpu_bound_programread()একটি পৃথক প্রক্রিয়াতে সিস্টেম কল চালায় । উদাহরণস্বরূপ, লিনাক্সে, সিস্টেম কলটিতে আরও এলোমেলো সংখ্যা তৈরি করার প্রকৃত সিপিইউ কাজ (যখন পুলটি খালি থাকে) হয়, সুতরাং পৃথক প্রক্রিয়া ব্যবহার করে আপনাকে ইনপুট হিসাবে এলোমেলো ডেটা তৈরি করতে একটি পৃথক সিপিইউ কোর ব্যবহার করতে দেয়। উদাহরণস্বরূপ, এলোমেলো অঙ্ক সহ 1 জিবি পাঠ্য ফাইল উত্পন্ন করার দ্রুততম কোনটি?
পিটার কর্ডেস

4
আরও গুরুত্বপূর্ণ বিষয়, বেশিরভাগ ক্ষেত্রে এর অর্থ lseekকাজ করে না। cat foo.mp4 | mpv -কাজ করবে, তবে আপনি এমপিভি বা এমপ্লেয়ারের ক্যাশে বাফারের চেয়ে পিছিয়ে যেতে চাইবেন না। তবে কোনও ফাইল থেকে ইনপুট পুনঃনির্দেশিত করে আপনি এটি করতে পারেন। ফাইলের শুরুতে cat | mpv -কোনও এমপি 4 এর moovপরমাণু রয়েছে কিনা তা যাচাই করার একটি উপায় , সুতরাং এটি শেষ এবং পিছনে না চেয়ে বাজানো যায় (যদি এটি স্ট্রিমিংয়ের জন্য উপযুক্ত হয়)। অন্যান্য ক্ষেত্রে আপনি কল্পনা করা সহজ যেখানে আপনি অ-সন্ধানযোগ্য ফাইলগুলির জন্য কোনও বনাম একটি পুনর্নির্দেশ /dev/stdinদিয়ে চালিয়ে কোনও প্রোগ্রাম পরীক্ষা করতে চান cat
পিটার কর্ডেস

এটি ব্যবহার করার সময় আরও সত্য xargs cat | somecmd। যদি ফাইল পাথগুলি কমান্ড বাফার সীমা ছাড়িয়ে যায়, একটানা প্রবাহের ফলে একাধিকবার xargsচলতে পারে catতবে xargs somecmdসরাসরি ব্যবহার করা ব্যর্থ হয় কারণ somecmdএকটি বিরামবিহীন ফলাফল অর্জনের জন্য বহুগুণে চালানো যায় না।
ট্যকেট

17

কারণ অকেজো বিড়াল সনাক্ত করা সত্যই শক্ত।

আমি যেখানে লিখেছিলাম সেখানে আমার একটি শেল স্ক্রিপ্ট ছিল

cat | (somecommand <<!
...
/proc/self/fd/3
...
!) 0<&3

শেল স্ক্রিপ্ট উত্পাদনে ব্যর্থ হয়েছিল যদি এটি catসরানো হয় কারণ এটি মাধ্যমে চালিত হয়েছিল su -c 'script.sh' someuser। স্পষ্টতই অতিমাত্রায় ব্যবহারের catফলে স্ট্যান্ডার্ড ইনপুটটির মালিক ব্যবহারকারীর পরিবর্তনে স্ক্রিপ্টটি চলছিল যাতে এটি /procকাজ করে আবার চালু করা যায় ।


এই কেসটি বেশ সহজ হবে কারণ এটি পরিষ্কারভাবে catএকটি প্যারামিটার অনুসরণ করা সাধারণ মডেলটিকে স্পষ্টভাবে অনুসরণ করে না তাই শেলটি catঅনুকূলিত শর্টকাটের পরিবর্তে প্রকৃত এক্সিকিউটেবল ব্যবহার করা উচিত । যদিও বাস্তব প্রক্রিয়াগুলির জন্য সম্ভবত বিভিন্ন শংসাপত্র বা অ-মানক স্টিডিন সম্পর্কে ভাল পয়েন্ট।
মিক্কো রেন্টালাইনেন

13

tl; dr: শেলগুলি স্বয়ংক্রিয়ভাবে এটি করে না কারণ ব্যয়গুলি সম্ভাব্য সুবিধার চেয়ে বেশি exceed

অন্যান্য উত্তরগুলি স্টাইডিনের পাইপ এবং এটি একটি ফাইল হওয়ার মধ্যে প্রযুক্তিগত পার্থক্য নির্দেশ করেছে। এটি মাথায় রেখে শেলটি এর মধ্যে একটি করতে পারে:

  1. বিল্টিন catহিসাবে প্রয়োগ করুন , এখনও ফাইলটি ভি। পাইপ পার্থক্য সংরক্ষণ করে। এটি একটি এক্সিকিউটিভের খরচ এবং সম্ভবত, সম্ভবত একটি কাঁটাচামচ সংরক্ষণ করবে।
  2. ফাইল / পাইপ সম্পর্কিত বিষয়গুলি দেখার জন্য ব্যবহৃত বিভিন্ন কমান্ডের জ্ঞান সহ পাইপলাইনের একটি সম্পূর্ণ বিশ্লেষণ সম্পাদন করুন, তারপরে তার ভিত্তিতে কাজ করুন।

পরবর্তী আপনাকে প্রতিটি পদ্ধতির ব্যয় এবং উপকারিতা বিবেচনা করতে হবে। সুবিধাগুলি যথেষ্ট সহজ:

  1. উভয় ক্ষেত্রেই, একটি নির্বাহী (এর cat) এড়ানো
  2. দ্বিতীয় ক্ষেত্রে, যখন পুনঃনির্দেশিত প্রতিস্থাপন সম্ভব হয়, তখন কাঁটাচামচ এড়ানো।
  3. যে কোনও ক্ষেত্রে আপনাকে পাইপ ব্যবহার করতে হবে , কখনও কখনও কাঁটাচাটি / ভিফোর্ক এড়ানো সম্ভব হতে পারে তবে প্রায়শই তা সম্ভব হয় না। এর কারণ, অন্যান্য পাইপলাইনের মতো একই সময়ে বিড়ালের সমতুল্য চালানো দরকার।

সুতরাং আপনি একটু সিপিইউ সময় এবং মেমরি সঞ্চয় করেন, বিশেষত যদি আপনি কাঁটাচামড়া এড়াতে পারেন। অবশ্যই, যখন আপনি বৈশিষ্ট্যটি আসলে ব্যবহৃত হয় আপনি কেবলমাত্র এই সময় এবং স্মৃতি সংরক্ষণ করেন। এবং আপনি কেবলমাত্র কাঁটাচামচ / এক্সিকিউট সময় সাশ্রয় করছেন; বড় ফাইলগুলির সাথে সময়টি বেশিরভাগ সময় I / O সময় হয় (যেমন, বিড়ালটি ডিস্ক থেকে কোনও ফাইল পড়ছে)। সুতরাং আপনাকে জিজ্ঞাসা করতে হবে: catশেল স্ক্রিপ্টগুলিতে কর্মক্ষমতাটি আসলে কীভাবে গুরুত্বপূর্ণ? এটিকে অন্যান্য সাধারণ শেল বিল্টিনের সাথে তুলনা করুন test- এটি কল্পনা catকরা শক্ত যে এটি ব্যবহারযোগ্য (অযথা) এমনকি দশমিক এক ভাগ এমনকি testযে জায়গাগুলিতে ব্যবহৃত হয় ততবার ব্যবহৃত হয়। এটি একটি অনুমান, আমি পরিমাপ করিনি, যা বাস্তবায়নের কোনও প্রচেষ্টা করার আগে আপনি যা করতে চান তা। (বা অনুরূপভাবে, অন্য কাউকে যেমন বাস্তবায়নের জন্য অনুরোধ করা হচ্ছে, একটি বৈশিষ্ট্য অনুরোধ))

পরবর্তী আপনি জিজ্ঞাসা: ব্যয়গুলি কি কি? যে দুটি ব্যয় মনে পড়বে তা হ'ল (ক) শেলের অতিরিক্ত কোড, যা এর আকার বাড়িয়ে তোলে (এবং সম্ভবত মেমরির ব্যবহার করে), আরও রক্ষণাবেক্ষণের কাজ প্রয়োজন, বাগগুলি ইত্যাদির জন্য এটি অন্য একটি স্পট; এবং (খ) পিছনে সামঞ্জস্যতা বিস্মিত করে, catপসিক্স উদাহরণস্বরূপ, জিএনইউ কোর্টিলসগুলির অনেকগুলি বৈশিষ্ট্য বাদ দেয় cat, তাই বিল্টিন কী catপ্রয়োগ করবে তা আপনাকে অবশ্যই যত্নবান হতে হবে।

  1. অতিরিক্ত বিল্টিন বিকল্পটি সম্ভবত এটি খারাপ নয় - আরও একটি বিল্টিন যুক্ত করে যেখানে গুচ্ছ ইতিমধ্যে বিদ্যমান রয়েছে। যদি এটির সাহায্যের তথ্য প্রদর্শন করে আপনার কাছে প্রোফাইলিং ডেটা থাকে, তবে আপনি সম্ভবত আপনার পছন্দসই শেলটির লেখককে এটি যুক্ত করতে রাজি করতে পারেন।

  2. পাইপলাইন বিশ্লেষণের জন্য, আমি মনে করি না যে শেলগুলি বর্তমানে এই জাতীয় কিছু করে (কিছু লোক পাইপলাইনটির শেষে বুঝতে পারে এবং একটি কাঁটাচামচ এড়াতে পারে)। মূলত আপনি শেলের সাথে একটি (আদিম) অপ্টিমাইজার যুক্ত করবেন; অপ্টিমাইজারগুলি প্রায়শই জটিল কোড এবং প্রচুর বাগের উত্স হিসাবে দেখা দেয়। এবং এই বাগগুলি আশ্চর্যজনক হতে পারে - শেল স্ক্রিপ্টে সামান্য পরিবর্তনগুলি এড়ানো বা ত্রুটিটিকে ট্রিগার করতে পারে।

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


10

catকমান্ড গ্রহণ করতে পারে -জন্য একটি চিহ্নিতকারী হিসাবে stdin । ( পজিক্স , " যদি কোনও ফাইল '-' হয় তবে বিড়ালের ইউটিলিটি ক্রমানুসারে সেই বিন্দুতে স্ট্যান্ডার্ড ইনপুট থেকে পড়তে পারে " ") এটি কোনও ফাইল বা স্টিডিনের সহজ পরিচালনা করতে দেয় যেখানে অন্যথায় এটি অনুমোদিত নয়।

এই দুটি তুচ্ছ বিকল্প বিবেচনা করুন, যেখানে শেল আর্গুমেন্টটি $1রয়েছে -:

cat "$1" | nl    # Works completely transparently
nl < "$1"        # Fails with 'bash: -: No such file or directory'

আর একটি সময় catকার্যকর যেখানে এটি ইচ্ছাকৃতভাবে শেল সিনট্যাক্স বজায় রাখতে কোনও অপ-বিকল্প হিসাবে ব্যবহৃত হয়:

file="$1"
reader=cat
[[ $file =~ \.gz$ ]] && reader=zcat
[[ $file =~ \.bz2$ ]] && reader=bzcat
"$reader" "$file"

অবশেষে, আমি বিশ্বাস করি যে কেবলমাত্র ইউইউসিএইচকে সঠিকভাবে ডাকা যেতে পারে যখন catএমন কোনও ফাইল নাম ব্যবহার করা হয় যা নিয়মিত ফাইল হিসাবে পরিচিত (যেমন কোনও ডিভাইস বা নামযুক্ত পাইপ নয়), এবং কোনও পতাকা কমান্ডটিতে দেওয়া হয় না:

cat file.txt

অন্য যে কোনও পরিস্থিতিতে নিজের oroperties catপ্রয়োজন হতে পারে।


6

ক্যাট কমান্ড এমন কিছু করতে পারে যা শেল অগত্যা করতে পারে না (বা কমপক্ষে সহজেই করতে পারে না)। উদাহরণস্বরূপ, ধরুন আপনি এমন অক্ষরগুলি মুদ্রণ করতে চান যা অন্যথায় অদৃশ্য হতে পারে, যেমন ট্যাব, ক্যারেজ রিটার্ন বা নিউলাইন। কেবল শেল বিল্টিন কমান্ডের সাহায্যে এটি করার * উপায় থাকতে পারে তবে আমি আমার মাথার উপরের দিকের কোনওটিই ভাবতে পারি না। বিড়ালের জিএনইউ সংস্করণ -Aআর্গুমেন্ট বা আর্গুমেন্টের সাহায্যে এটি করতে -v -E -Tপারে (যদিও আমি বিড়ালের অন্যান্য সংস্করণ সম্পর্কে জানি না)। আপনি প্রতিটি লাইনটি একটি লাইন নম্বর ব্যবহার করে উপস্থাপন -nকরতে পারেন (আবার, ID- যদি নন-জিএনইউ সংস্করণগুলি এটি করতে পারে)।

বিড়ালের আরেকটি সুবিধা হ'ল এটি সহজেই একাধিক ফাইল পড়তে পারে। এটি করতে, কেউ কেবল টাইপ করতে পারেন cat file1 file2 file3। শেল দিয়ে একই কাজ করার জন্য, জিনিসগুলি জটিল হয়ে উঠবে, যদিও সাবধানতার সাথে কারুকৃত লুপ সম্ভবত একই ফলাফল অর্জন করতে পারে। এটি বলেছিল, এমন সরল বিকল্প উপস্থিত থাকলে আপনি কি সত্যিই এমন লুপটি লেখার জন্য সময় নিতে চান? আমি না!

বিড়ালের সাথে ফাইলগুলি পড়া শেলের তুলনায় সম্ভবত কম সিপিইউ ব্যবহার করবে, কারণ বিড়াল একটি প্রাক-সংকলিত প্রোগ্রাম (স্পষ্ট ব্যতিক্রম কোনও বিল্টিন বিড়াল রয়েছে এমন কোনও শেল) is একটি বড় গ্রুপ ফাইল পড়ার সময়, এটি স্পষ্ট হয়ে উঠতে পারে তবে আমি আমার মেশিনগুলিতে কখনও এটি করি নি, তাই আমি নিশ্চিত হতে পারি না।

ক্যাট কমান্ডটি কোনও কমান্ডকে স্ট্যান্ডার্ড ইনপুট গ্রহণ না করার জন্য বাধ্য করার জন্য কার্যকর হতে পারে। নিম্নোক্ত বিবেচনা কর:

echo 8 | sleep

"8" নম্বরটি "ঘুম" কমান্ড দ্বারা গৃহীত হবে না, যেহেতু এটি আসলে স্ট্যান্ডার্ড ইনপুট গ্রহণ করার জন্য কখনই বোঝানো হয়নি। সুতরাং, ঘুম সেই ইনপুটটিকে উপেক্ষা করবে, যুক্তির অভাব সম্পর্কে অভিযোগ করবে এবং প্রস্থান করবে। তবে, যদি এক প্রকার:

echo 8 | sleep $(cat)

অনেকগুলি শেল এটিতে প্রসারিত হবে sleep 8এবং প্রস্থানটি বেরোনোর ​​আগে ঘুম 8 সেকেন্ড অপেক্ষা করবে। আপনি ssh এর সাথেও অনুরূপ কিছু করতে পারেন:

command | ssh 1.2.3.4 'cat >> example-file'

"কমান্ড" থেকে আউটপুট যা পাওয়া যায় তার সাথে 1.2.3.4 ঠিকানার ঠিকানায় মেশিনে অ্যাপেল উদাহরণ-ফাইল সহ এই কমান্ডটি রয়েছে।

এবং এটি (সম্ভবত) কেবল পৃষ্ঠটি স্ক্র্যাচ করে। আমি নিশ্চিত যে আমি চাইলে বিড়ালটির দরকারী হওয়ার আরও উদাহরণ খুঁজে পেতে পারি, তবে এই পোস্টটি এটি যথেষ্ট দীর্ঘ। সুতরাং, আমি এটি বলে শেষ করব: শেলকে এই সমস্ত পরিস্থিতিতে (এবং আরও বেশ কয়েকটি) প্রত্যাশার জন্য জিজ্ঞাসা করা সত্যিই সম্ভব নয়।


আমি শেষ বাক্যটি "সহজেই সম্ভব হয় না" দ্বারা শেষ করতাম
বেসাইল স্টারিনকিভিচ

3

মনে রাখবেন, কোনো ব্যবহারকারী একটি হতে পারে যে catতার মধ্যে $PATHযা ঠিক POSIX নয় cat(কিন্তু সম্ভবত কিছু বৈচিত্র যা কিছু কোথাও লগ ইন করুন পারে)। সেক্ষেত্রে আপনি শেলটি অপসারণ করতে চান না।

PATH পরিবর্তনশীল পরিবর্তন হতে পারে, এবং তারপর cat নয় তুমি কি বিশ্বাস এটা। আপনি যে অপটিমাইজেশনটির স্বপ্ন দেখেছেন তা করে শেল লেখা বেশ কঠিন হবে।

এছাড়াও, অনুশীলনে, cat একটি বেশ দ্রুত প্রোগ্রাম। এটি এড়ানোর জন্য কয়েকটি ব্যবহারিক কারণ রয়েছে (নান্দনিকতা বাদে)।

FOSDEM2018 এ ইয়ান রেজিস-জিয়ানাসের দুর্দান্ত পার্সিং পসিক্স [গুলি] জাহান্নামের আলোচনাও দেখুন। আপনি শেলের মধ্যে যা স্বপ্ন দেখেছেন তা করার চেষ্টা করা এড়ানোর জন্য এটি অন্যান্য ভাল কারণ দেয়।

কর্মক্ষমতা যদি সত্যিই শাঁসের জন্য সমস্যা হয়ে থাকে তবে কেউ এমন একটি শেল প্রস্তাব করেছিলেন যা পরিশীলিত পুরো প্রোগ্রাম সংকলক অপটিমাইজেশন, স্ট্যাটিক সোর্স কোড বিশ্লেষণ, এবং ইন-টাইম সংকলন কৌশলগুলি ব্যবহার করে (এই তিনটি ডোমেইনেই কয়েক দশকের অগ্রগতি এবং বৈজ্ঞানিক প্রকাশনা এবং উত্সর্গীকৃত সম্মেলন, যেমন সিগপ্লেনের আওতায় )। দুঃখের বিষয়, এমনকি একটি আকর্ষণীয় গবেষণা বিষয় হিসাবে এটি বর্তমানে গবেষণা সংস্থাগুলি বা উদ্যোগী পুঁজিপতিদের দ্বারা অর্থায়ন করা হয় না এবং আমি অনুমান করছি যে এটি কেবল চেষ্টা করার মতো নয়। অন্য কথায়, শেলগুলি অনুকূল করার জন্য সম্ভবত কোনও উল্লেখযোগ্য বাজার নেই । আপনার যদি এই জাতীয় গবেষণায় ব্যয় করতে অর্ধ মিলিয়ন ইউরো থাকে তবে আপনি সহজেই এটি করার জন্য কাউকে পাবেন এবং আমি বিশ্বাস করি এটি কার্যকর ফল দেবে।

ব্যবহারিক দিক থেকে, পুনর্লিখন, এর কার্যকারিতা উন্নত করার জন্য, কোনও ভাল স্ক্রিপ্টিং ভাষার (পাইথন, এডাব্লু কে, গাইল, ...) একটি ছোট (আন-শত লাইন) শেল স্ক্রিপ্ট সাধারণত করা হয়। এবং বড় শেল স্ক্রিপ্টগুলি যুক্তিযুক্ত (অনেকগুলি সফ্টওয়্যার ইঞ্জিনিয়ারিং কারণে) যুক্তিযুক্ত নয়: আপনি যখন একশ লাইনের বেশি শেল স্ক্রিপ্ট লিখছেন, তখন আপনাকে আরও কিছু উপযুক্ত ভাষায় এটি পুনরায় লেখার (এমনকি পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের কারণেও) বিবেচনা করা উচিত : প্রোগ্রামিং ভাষা হিসাবে শেলটি খুব দরিদ্র। তবে, এখানে অনেকগুলি বড় উত্পন্ন শেল স্ক্রিপ্ট রয়েছে এবং ভাল কারণে (যেমন জিএনইউ অটোকনফ উত্পাদিত configureস্ক্রিপ্টগুলি)।

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


3
"এড়াতে বেশ কয়েকটি ব্যবহারিক কারণ" - যে কেউ cat some-huge-log | tail -n 5দৌড়ানোর জন্য অপেক্ষা করেছিল (যেখানে tail -n 5 some-huge-logসরাসরি প্রান্তে ঝাঁপিয়ে পড়তে পারে, যেখানে catকেবল সামনের দিকে-পিছনে পড়ে) এটি অসম্মতি জানায়।
চার্লস ডাফি

মন্তব্য পরীক্ষা করে দেখুন cat। কয়েক দশক জিবি রেঞ্জের একটি বৃহত পাঠ্য ফাইল প্রবেশ করানো (যা পরীক্ষার জন্য তৈরি হয়েছিল) বেশ দীর্ঘ সময় নেয়। সুপারিশ করবে না।
সের্গেই কলডিয়াজনি

1
BTW, পুনরায়: "নিখুঁত শাঁস জন্য কোন উল্লেখযোগ্য বাজার" - ksh93 হয় একটি সর্বোচ্চকরন শেল, এবং একটি বেশ ভাল এক। এটা তোলে ছিল , কিছুদিনের জন্য, সফলভাবে একটি বাণিজ্যিক পণ্য হিসাবে বিক্রি। (দুঃখের বিষয়, বাণিজ্যিকভাবে লাইসেন্স পেয়েও এটিকে পর্যাপ্ত কুলুঙ্গিত করে যে দুর্বল-লিখিত ক্লোনস এবং অন্যান্য কম-দক্ষ-কিন্তু-মুক্ত-দামের উত্তরসূরিরা লাইসেন্সের জন্য অর্থ প্রদান করতে ইচ্ছুক সেই সাইটগুলির বাইরে বিশ্বকে দখল করে নিয়েছিল, যার ফলে আমরা পরিস্থিতিটি আমাদের সামনে নিয়ে যাই we আজ আছে)।
চার্লস ডাফি

(আপনি যে নির্দিষ্ট কৌশলগুলি লক্ষ্য করেছেন সেগুলি ব্যবহার না করে, তবে প্রকৃতপক্ষে, সেই কৌশলগুলি প্রক্রিয়া মডেলকে বিবেচনা করে বোঝায় না ; এটি যে কৌশলগুলি প্রয়োগ করে সেগুলি হ'ল, ভাল, ভাল প্রয়োগ এবং ভাল প্রভাবের জন্য )।
চার্লস ডাফি

2

@ কুসালানন্দ জবাব (এবং @ এলফজারো মন্তব্য) যুক্ত করে বিড়াল কিছু হতে পারে:

alias cat='gcc -c'
cat "$MYFILE" | command1 | command2 > "$OUTPUT"

অথবা

echo 'echo 1' > /usr/bin/cat
cat "$MYFILE" | command1 | command2 > "$OUTPUT"

কোনও কারণ নেই যে সিস্টেমে বিড়াল (তার নিজেরাই) বা / usr / bin / cat আসলে ক্যাটেনেটেট টুল।


3
এর আচরণ ব্যতীত catঅন্যটি POSIX দ্বারা সংজ্ঞায়িত করা হয় এবং তাই বন্যার চেয়ে আলাদা হওয়া উচিত নয়।
রোয়াইমা

2
@ রাইমা: PATH=/home/Joshua/bin:$PATH cat ...আপনি catএখন নিশ্চিত কী জানেন ?
জোশুয়া

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

@ জোশুয়া: বেশিরভাগ প্ল্যাটফর্মে শেলগুলি জানেন (বা জানতে পারে ) কোন ডিরেক্টরিগুলি পসিক্স কমান্ড প্রয়োগ করে এমন এক্সিকিউটেবল রাখে। সুতরাং আপনি কেবল উপন্যাসের প্রসার এবং পথের সমাধানের পরে অবধি বিকল্পটি স্থগিত করতে পারবেন এবং কেবল এটির জন্য এটি করুন /bin/cat। (এবং আপনি এটি বন্ধ করতে পারেন এমন একটি বিকল্প তৈরি করতেন)) অথবা আপনি catএকটি শেল বিল্ট ইন (যা সম্ভবত /bin/catএকাধিক আর্গের জন্য ফিরে আসে ?) তৈরি করতে চান যাতে ব্যবহারকারীরা বাহ্যিক সংস্করণটি স্বাভাবিকভাবে চান কিনা বা না নিয়ন্ত্রণ করতে পারে উপায়, সাথে enable cat। মত kill। (আমি ভাবছিলাম যে বাশ command catকাজ করবে, কিন্তু এটি বিল্টিনগুলি এড়িয়ে যায় না)
পিটার

যদি আপনি কোনও উপাধি সরবরাহ করেন তবে শেলটি জানতে পারবে যে catসেই পরিবেশে আর স্বাভাবিকটিকে বোঝায় না cat। স্পষ্টতই, এলিয়াসগুলি প্রক্রিয়া করার পরে অপ্টিমাইজেশনটি প্রয়োগ করা উচিত। আমি শেল বিল্ট-ইনগুলিকে ভার্চুয়াল ডিরেক্টরিতে কমান্ডগুলি উপস্থাপন করতে বিবেচনা করি যা সর্বদা আপনার পথে চালিত হয়। আপনি যদি কোনও কমান্ডের শেল অন্তর্নির্মিত সংস্করণ এড়াতে চান (উদাহরণস্বরূপ test) আপনাকে একটি পথ সহ একটি বৈকল্পিক ব্যবহার করতে হবে।
মিক্কো রেন্টালাইনেন

1

বিড়ালের জন্য দুটি "অকেজো" ব্যবহার:

sort file.txt | cat header.txt - footer.txt | less

... এখানে catফাইল এবং পাইপযুক্ত ইনপুট মিশ্রিত করতে ব্যবহৃত হয়।

find . -name '*.info' -type f | sh -c 'xargs cat' | sort

... এখানে xargsভার্চুয়ালি অসীম সংখ্যক ফাইলের নাম গ্রহণ করতে পারে এবং এগুলি catসমস্ত একটি স্ট্রিমের মতো আচরণ করার সময় প্রয়োজনের হিসাবে বহুবার চালানো যেতে পারে। সুতরাং এটি বড় ফাইল তালিকার জন্য কাজ করে যেখানে সরাসরি ব্যবহার xargs sortনা করে।


এই দুটি ব্যবহারের ক্ষেত্রেই কেবলমাত্র catএকটি যুক্তি দিয়ে ডাকা হলে কেবল ধাপে ইন-ইন শেল তৈরি করে তুচ্ছভাবে এড়ানো হবে । বিশেষত ক্ষেত্রে যেখানে shস্ট্রিং পাস হয়ে যায় এবং সরাসরি xargsকল করবে catশেলটি বিল্ট-ইন বাস্তবায়নের কোনও উপায় নেই।
মিক্কো রেন্টালাইনেন

0

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

কমান্ডগুলি স্ট্যান্ডার্ড স্ট্রিমগুলি নিয়ে কাজ করে, তখন তাদের কেবল স্ট্যান্ডার্ড ফাইল বর্ণনাকারীর কাছে পড়া / লেখার বিষয়ে যত্ন নেওয়া উচিত। কমান্ডগুলি জানতে পারে যে স্টিডিন সন্ধানযোগ্য / সন্ধানযোগ্য কিনা , যা কোনও পাইপ বা ফাইলকে নির্দেশ করে।

যদি আমরা মিশ্রণটি যুক্ত করে যা প্রসেসটি আসলে সেই স্টিডিন সামগ্রী সরবরাহ করে তবে আমাদের পাইপের ওপারে প্রক্রিয়াটি সন্ধান করতে হবে এবং উপযুক্ত অপ্টিমাইজেশন প্রয়োগ করতে হবে। কাইল জোন্স কর্তৃক সুপার ইউজার পোস্টে এবং শেলের ক্ষেত্রে এটি শেল নিজেই শর্তে করা যায় that's

(find /proc -type l | xargs ls -l | fgrep 'pipe:[20043922]') 2>/dev/null

লিঙ্কযুক্ত পোস্টে প্রদর্শিত হিসাবে। এটি আরও 3 টি কমান্ড (তাই অতিরিক্ত fork()গুলি এবং exec()গুলি) এবং পুনরাবৃত্তির ট্র্যাভারসাল (এতগুলি সম্পূর্ণ readdir()কল)।

সি এবং শেল উত্স কোডের শর্তে, শেলটি ইতিমধ্যে শিশু প্রক্রিয়াটি জানে, সুতরাং পুনরাবৃত্তির কোনও প্রয়োজন নেই, তবে কখন কীভাবে অনুকূলিত করা যায় এবং কখন catবাস্তবে অকেজো হয় তা আমরা কীভাবে জানি ? সেখানে আসলে বিড়াল দরকারী ব্যবহার রয়েছে যেমন

# adding header and footer to file
( cmd; cat file; cmd ) | cmd
# tr command does not accept files as arguments
cat log1 log2 log3 | tr '[:upper:]' '[:lower:]'

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

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