বাশ-এর ​​মধ্যে বিড়ালের প্রতিস্থাপন হিসাবে কম-সাইন চিহ্ন কেন কাজ করে না?


17

আমি "বিড়ালের অকেজো ব্যবহার" সম্পর্কে শুনেছি এবং কিছু পরামর্শ পেয়েছি, তবে নিম্নলিখিতগুলি আমার ব্যাश শেলের কিছুই আউটপুট করে না।

< filename

বিড়াল ব্যবহার যদিও প্রত্যাশা হিসাবে কাজ করে।

cat filename

আমি ফেডোরা কোর 18 এবং জিএনইউ ব্যাশ, সংস্করণ 4.2.45 (1) ব্যবহার করছি।

সম্পাদনা: পাইপের সামনে এটি ব্যবহার করাও কার্যকর হয় না।

< filename | grep pattern

যেখানে বিড়াল ব্যবহার করা প্রত্যাশার মতো কাজ করে।

cat filename | grep pattern

সম্পাদনা 2: পরিষ্কার করতে, আমি জানি যে আমি এটি ব্যবহার করতে পারি

grep pattern < filename

তবে আমি এখানে /programming/11710552/useless-use-of-cat পড়েছি যে আমি এটি কমান্ডের সামনেও ব্যবহার করতে পারি। যদিও কমান্ডের সামনে এটি কাজ করে না।


2
এটা কাজ করে। আপনি যা চেষ্টা করেছেন ঠিক তা জোনাথন লেফলারের মন্তব্য অনুসারে নয়।
manatwork

"বিড়ালটির উদ্দেশ্য ফাইলগুলিকে কনটেনেট করা (বা" ক্যাটেনেট ") it's এটি যদি কেবল একটি ফাইল হয় তবে এটিকে কিছু না বলেই যুক্তি দেওয়া সময় নষ্ট করা এবং আপনার জন্য একটি প্রক্রিয়া ব্যয় করে।" partmaps.org/era/unix/award.html
বনসী স্কট

উত্তর:


22

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

উদাহরণ

এই 2 টি উদাহরণগুলি মূলত একই জিনিসটি করে তবে 2 ইনপুটটি কিছুটা ভিন্ন আচরণে পান।

ফাইল খোলে

$ cat blah.txt 
hi

STDIN খোলে

$ cat < blah.txt 
hi

পর্দার পিছনে উঁকি দিচ্ছে

straceকি চলছে তা দেখতে আপনি ব্যবহার করতে পারেন।

আমরা যখন একটি ফাইল থেকে পড়ি

open("blah.txt", O_RDONLY)              = 3
fstat(3, {st_mode=S_IFREG|0664, st_size=3, ...}) = 0
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(3, "", 65536)                      = 0
close(3)                                = 0
close(1)                                = 0

যখন আমরা STDIN থেকে পড়ি (0 হিসাবে চিহ্নিত)

read(0, "hi\n", 65536)                  = 3
write(1, "hi\n", 3hi
)                     = 3
read(0, "", 65536)                      = 0
close(0)                                = 0
close(1)                                = 0

প্রথম উদাহরণে আমরা catএটি ফাইলটি খোলার এবং এটি থেকে পড়তে দেখতে পাই blah.txt। দ্বিতীয়টিতে আমরা দেখতে পাচ্ছি যে এসটিডিআইএন ফাইল বর্ণনাকারীর মাধ্যমে catফাইলের বিষয়বস্তুগুলি পড়ে blah.txt, যা বিবরণী নম্বর 0 হিসাবে চিহ্নিত।

read(0, "hi\n", 65536)                  = 3

1
তাহলে বিড়ালের ব্যবহারহীন ব্যবহার সম্পর্কে এই আলোচনা কি বোগাস?
বাগ

@ বাগ - না, ব্যবহার আছে। তবে catসাধারণত ভুল বোঝাবুঝি হয় এবং এটি যখন প্রয়োজন হয় না তখন ব্যবহৃত হয়।
slm

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

@ বাগ হ্যাঁ, পুনঃনির্দেশ কমান্ডের আগে বা পরে ঘটতে পারে, স্টিফেনের উত্তর দেখুন, তিনি এই উদাহরণটিও দেখান।
slm

আহ, এখন আমি এটি পেয়েছি। আমাকে লিখতে হবে < filename command
বাগ

14

এর ক্লাসিক অকেজো ব্যবহার catযখন আপনি এটি সরাসরি প্রোগ্রাম খোলার জন্য পুরোপুরি সক্ষম প্রোগ্রামগুলিতে ইনপুট দেওয়ার জন্য ব্যবহার করেন। উদাহরণ স্বরূপ:

খারাপ

cat file | grep foo
cat file | while read line; do echo "$line"; done
cat file | sed 's/a/b/'
cat file | awk '{print $1}'

ভাল

grep foo file
while read line; do echo "$line"; done < file 
sed 's/a/b/' file
awk '{print $1}' file

এছাড়াও ভাল ( <fileকমান্ডের উভয় পক্ষের হতে পারে)

<file grep foo
 sed 's/a/b/' < file
<file awk '{print $1}' 

6
"খারাপ" এখানে সাবজেক্টিভ। কারণ এটি আমি ভাল সামগ্রিক হতে ঐ খুঁজে পথ আরও বেশি সঙ্গতিপূর্ণ পড়ার জন্য সহজ। এবং ডেটা প্রবাহ পুরোপুরি বাম থেকে ডান, অন্য কোনও পাইপ জড়িত থাকলে এটি হওয়া উচিত
Izkata

2
@ ইজকাটা তারা এই অর্থে "খারাপ" যে তারা এর অপ্রয়োজনীয় ব্যবহার cat
টেরডন

"নিপাত যাক! টেবিল থেকে নাম! আপনি একটি খারাপ বিড়াল! ";-) তবে গুরুত্ব সহকারে…
জি-ম্যান

1
লক্ষণীয় ভাল (বা, কমপক্ষে, দরকারী) এর catমধ্যে অন্তর্ভুক্ত রয়েছে (1) cat file(স্ক্রিন / টার্মিনালের আউটপুট সহ; যদিও, ফাইলটি যদি পর্দার চেয়ে বেশি দীর্ঘ হয় তবে আপনি ব্যবহার করতে পছন্দ করতে পারেন moreবা এর lessমতো কিছু), (২) cat file1 file2 file3 > all_data( ঠিক কী catবোঝাতে cat f1 f2 f3 | tr …চাইছে ), (৩) (বা অন্য কোনও প্রোগ্রামের পাইপ যা আপনি সরাসরি ফাইলগুলিতে পাস করতে চান না; যেমন, wc(উদাহরণস্বরূপ, আপনি যদি কেবলমাত্র গ্র্যান্ড টোটাল দেখতে চান)) বা grep(যেমন, যদি আপনার কোনও পুরানো সংস্করণ থাকে যা সমর্থন করে না -h, অর্থাত্ --no-filename)), ... (অবিরত)
জি-ম্যান

(চালিয়ে যাওয়া) ... (4) cat -n file | sort … -k1 | sed 's/^ *[0-9]*\t//', (5) sudo cat file600 | untrusted_program(অর্থাত্, আপনি (আপনার ইউআইডি) ফাইলটি পড়তে পারবেন না, এবং আপনি প্রোগ্রামটি মূল হিসাবে বা কোনও আধা-সুবিধাযুক্ত ইউআইডি হিসাবে চালাতে চান না)। এছাড়াও, ( ) (অর্থাত্ 2 এবং 3 এর মধ্যে একটি সংখ্যা) program_that_generates_html | cat static_html_header - static_html_footer(যা আপনি সম্ভবত কোনও ফাইল বা পাইপে পুনর্নির্দেশ করতে চান)।
জি-ম্যান

13

ইউইউসি রয়েছে:

cat somefile | some-cmd

অথবা

cat < somefile | some-cmd

সেখানে, কোনও পাইপ থেকে প্রাপ্ত some-cmdসামগ্রী পড়ছে যা somefileখাওয়ানো হয় catযার দ্বারা এটি নিজে পড়ে somefile

some-cmdসরাসরি somefileশেলটি পড়তে পারে (শেল এটির জন্য স্ট্যান্ডিনে এটি খোলার পরে), এর দরকার নেই cat:

some-cmd < somefile

অথবা

< somefile some-cmd

(পুনর্নির্দেশগুলি একটি সাধারণ কমান্ড লাইনে যে কোনও জায়গায় উপস্থিত হতে পারে)।

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