बाश में बिल्ली के प्रतिस्थापन के रूप में कम-से-कम संकेत क्यों काम नहीं करता है?


17

मैंने "बिल्ली के बेकार उपयोग" के बारे में सुना और कुछ सुझाव पाए, लेकिन निम्नलिखित आउटपुट मेरे बैश शेल में कुछ भी नहीं है।

< filename

बिल्ली का उपयोग करना उम्मीद के मुताबिक काम करता है।

cat filename

मैं Fedora Core 18 और GNU बैश, संस्करण 4.2.45 (1) का उपयोग कर रहा हूं।

संपादित करें: पाइप के सामने इसका उपयोग करना या तो काम नहीं करता है।

< filename | grep pattern

जबकि बिल्ली का उपयोग उम्मीद के मुताबिक काम करता है।

cat filename | grep pattern

EDIT2: स्पष्ट करने के लिए, मुझे पता है कि मैं इसका उपयोग कर सकता हूं

grep pattern < filename

लेकिन मैंने यहां /programming/11710552/useless-use-of-cat पढ़ा कि मैं इसे कमांड के सामने भी इस्तेमाल कर सकता हूं। हालांकि यह कमांड के सामने काम नहीं करता है।


2
यह काम करता हैं। बस आपने जो कोशिश की वह जोनाथन लेफ़लर की टिप्पणी के अनुसार नहीं है।
मैनटवर्क

"बिल्ली का उद्देश्य फ़ाइलों (या" कैटेनेट ") को समाप्‍त करना है। यदि यह केवल एक फ़ाइल है, तो इसे बिना किसी चीज के साथ सम्‍मिलित करना समय की बर्बादी है, और आपको एक प्रक्रिया में खर्च करना है।" 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को STDIN फाइल डिस्क्रिप्टर के माध्यम से पढ़ता है , जिसे डिस्क्रिप्टर नंबर 0 के रूप में पहचाना जाता है।

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

1
तो बिल्ली के बेकार उपयोग के बारे में यह बात फर्जी है?
बग

@bug - नहीं, उपयोग हैं। लेकिन catआम तौर पर गलत समझा जाता है और इसका उपयोग तब किया जाता है जब यह आवश्यक नहीं होता है।
SLM

लेकिन यह आवश्यक है जब मैं संचालन के क्रम को बाएं से दाएं करना चाहता हूं? मैंने पढ़ा कि कमांड के सामने कम-से-कम निर्माण का उपयोग करना संभव है।
बग

@bug हाँ अनुप्रेषित कमांड के पहले या बाद में हो सकता है, स्टीफन का उत्तर देखें, वह इस उदाहरण को भी दिखाता है।
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
"बुरा" यहाँ व्यक्तिपरक है। क्योंकि यह है मैं बेहतर समग्र होने के लिए उन मिल जाए, जिस तरह से और अधिक सुसंगत और पढ़ने में आसान। और डेटा का प्रवाह पूरी तरह से बाएं से दाएं है, जैसे कि यह होना चाहिए कि इसमें अधिक पाइप शामिल हैं
इज़काटा

2
@ इज़कट वे इस अर्थ में "बुरे" हैं कि वे बेकार उपयोग हैं cat
terdon

"नीचे! टेबल से उतरो! तुम एक बुरा बिल्ली हो! ;;; लेकिन गंभीर रूप से ...
जी-मैन कहते हैं, 'मोनिका'

1
उल्लेखनीय अच्छा (या कम से कम, उपयोगी) का उपयोग करता है cat(1) शामिल हैं cat file; (हालांकि, अगर फ़ाइल से अधिक समय तक स्क्रीन अधिक है, तो आप का उपयोग करना पसंद हो सकता है स्क्रीन पर उत्पादन / टर्मिनल के साथ moreया less, या ऐसा ही कुछ) (2) cat file1 file2 file3 > all_data( वास्तव में क्या catमतलब है), (3) cat f1 f2 f3 | tr …(या किसी अन्य प्रोग्राम में पाइप जिसे आप फ़ाइलों को सीधे पास नहीं करना चाहते हैं; उदाहरण के लिए, wcजैसे, यदि आप केवल भव्य कुल देखना चाहते हैं) या grep(उदाहरण के लिए, यदि आपके पास एक पुराना संस्करण है जो समर्थन नहीं करता है -h, अर्थात, --no-filename),… (Cont'd)
G-Man Says 'Reinstate Monica'

(Cont'd)… (4) cat -n file | sort … -k1 | sed 's/^ *[0-9]*\t//', (5) sudo cat file600 | untrusted_program(यानी, आप (आपका UID) फ़ाइल नहीं पढ़ सकते हैं, और आप प्रोग्राम को रूट या किसी भी अर्ध-विशेषाधिकारित UID के रूप में चलाना नहीं चाहते हैं)। इसके अलावा, ( ) (यानी, 2 और 3 के बीच एक संख्या) program_that_generates_html | cat static_html_header - static_html_footer(जिसे आप शायद किसी फ़ाइल या पाइप पर पुनर्निर्देशित करना चाहेंगे )।
जी-मैन का कहना है कि 'मोनिका'

13

UUOC में है:

cat somefile | some-cmd

या

cat < somefile | some-cmd

वहां, some-cmdकी सामग्री पढ़ रहा हैsomefile एक पाइप से जाता है catजिसके द्वारा इसे स्वयं पढ़ा जाता है somefile

some-cmdसे सीधे पढ़ सकते हैं somefile(शेल के बाद इसे इसके लिए स्टड पर खोला गया है), इसकी कोई आवश्यकता नहीं हैcat :

some-cmd < somefile

या

< somefile some-cmd

(पुनर्निर्देशन एक साधारण कमांड लाइन पर कहीं भी दिखाई दे सकता है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.