"बिल्ली" और "बिल्ली <" के बीच अंतर


70

मैं एक ट्यूटोरियल के माध्यम से काम कर रहा था और दोनों का उपयोग देखा cat myfile.txtऔर cat < myfile.txt। क्या आज्ञाओं के इन दो अनुक्रमों में अंतर है? ऐसा लगता है कि दोनों किसी फ़ाइल की सामग्री को शेल में प्रिंट करते हैं।


जवाबों:


106

पहले मामले में, catफ़ाइल को खोलता है, और दूसरे मामले में, शेल फ़ाइल को खोलता है, इसे catमानक इनपुट के रूप में पारित करता है ।

तकनीकी रूप से, उनके अलग-अलग प्रभाव हो सकते हैं। उदाहरण के लिए, ऐसा शेल कार्यान्वयन होना संभव होगा जो catकार्यक्रम की तुलना में अधिक (या कम) विशेषाधिकार प्राप्त हो । उस परिदृश्य के लिए, कोई फ़ाइल खोलने में विफल हो सकता है, जबकि दूसरा कर सकता है।

यह सामान्य परिदृश्य नहीं है, लेकिन यह इंगित करने के लिए उल्लेख किया गया है कि शेल और catसमान कार्यक्रम नहीं हैं।


83
हां, और उदाहरण के लिए आप कर सकते हैं sudo cat myfile.txtsudo cat < myfile.txtआप फ़ाइल को पढ़ने के लिए विशेषाधिकार नहीं है, लेकिन काम नहीं करेगा।
ज़ुआज़ो

2
ध्यान दें कि ksh93है catbuiltin (डिफ़ॉल्ट रूप से सक्षम नहीं है जब तक कि आप /opt/ast/binअपने में जल्दी $PATHहै)।
स्टीफन चेजेलस

2
कुछ कार्यक्रम अलग-अलग व्यवहार करते हैं, इस पर निर्भर करता है कि उन्हें फ़ाइल नाम का तर्क या स्टड मिलता है। उदाहरण के लिए, wcजब तर्क दिया जाता है, तो गिनती से पहले फ़ाइल नाम प्रिंट करेंगे।
बरमार

21

आपके परीक्षण के मामले में कोई बड़ा अंतर नहीं है। सबसे स्पष्ट एक त्रुटि संदेश आपको मिलेगा यदि myfile.txtवर्तमान निर्देशिका में नाम की कोई फ़ाइल नहीं है , या यदि आपको इसे पढ़ने की अनुमति नहीं है।

पूर्व मामले में, catशिकायत करेंगे और बाद के मामले में, आपका शेल स्पष्ट रूप से दिखाएगा कि कौन सी प्रक्रिया फ़ाइल को खोलने की कोशिश कर रही है, catपूर्व में और शेल पहले वाले में।

$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]

अधिक सामान्य मामले में, एक बड़ा अंतर उपयोग कर रहा है पुनर्निर्देशन का उपयोग एक से अधिक फ़ाइल की सामग्री को प्रिंट करने के लिए नहीं किया जा सकता है, जो कि cat( कैट कैट) कमांड के सभी मूल उद्देश्य के बाद है । ध्यान दें कि शेल वैसे भी पुनर्निर्देशित इनपुट के रूप में पारित सभी फाइलों को खोलने की कोशिश करेगा, लेकिन केवल वास्तव में अंतिम एक पास होगा catजब तक कि आप उपयोग न करें zshऔर इसका multios"ज़िशिज्म"।

$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and 
                  # displays an error message, cat gets nothing on stdin
                  # so shows nothing
ksh93: two: cannot open [No such file or directory]

एक मानक प्रणाली पर, शेल और catफ़ाइल एक्सेस अधिकारों में कोई अंतर नहीं है, इसलिए दोनों समान रूप से विफल होंगे। का प्रयोग sudoबढ़ाने के लिए catथॉमस डिकी जवाब दें और संलग्न टिप्पणियां पहले से ही सुझाव के रूप में की विशेषाधिकार व्यवहार में एक बड़ा अंतर कर देगा।


5
जिज्ञासा से बाहर, क्या आप वास्तव kshमें अपनी खुद की इच्छा का उपयोग करते हैं, और यदि ऐसा है तो ... क्यों ?
बिल्ली

1
@cat - यह प्रश्न स्पष्ट रूप से अज्ञानता पर आधारित है। इसे स्वयं बनाएं और देखें।
दोपहर

2
@ बाइक चलाने का इरादा था कि वह गंभीर रूप से अशिष्ट न हो, लेकिन काफी निष्पक्ष था, मुझे लगता है
बिल्ली

2
@cat - मुझे नहीं लगता। अज्ञानता शर्म की बात नहीं है - यह केवल ज्ञान की कमी है। यदि आप यह नहीं समझते हैं कि कोई व्यक्ति ksh93 का उपयोग करना क्यों चुन सकता है, तो मैं केवल यह मान सकता हूं कि आपने इसका उपयोग कभी नहीं किया है। तो मैं आपको सलाह देता हूं यह सुनिश्चित करने के लिए प्रयास करने के लायक है। और मुझे विश्वास है जब मैं आपको बताता हूँ, कि, की तुलना में bash, ksh93दूर दूर तक बेहतर खोल है। यह खोल लगभग,।
mikeserv

5
जैसा कि @mikeserv ने कहीं और बताया है , उस मामले cat < file1 > file2से बहुत अलग प्रभाव पड़ता है cat file1 > file2, जहां file1अपठनीय या कोई नहीं है। (उत्तरार्द्ध रूप ट्रंकट्स file2; पूर्व नहीं होगा।)
वाइल्डकार्ड

7

cat myfile.txtफ़ाइल को पढ़ता है myfile.txtफिर इसे मानक आउटपुट पर प्रिंट करता है।

cat < myfile.txtयहाँ catकिसी भी फ़ाइल को खोलने के लिए नहीं दिया गया है, जैसे कि कई यूनिक्स कमांड करते हैं- मानक इनपुट से डेटा को पढ़ता है, जो file.txtकि शेल द्वारा निर्देशित होता है , और मानक आउटपुट पर प्रिंट करता है।


6

@ थोमस डिके का जवाब शानदार है।

मैं सिर्फ कई फाइलों को पढ़ने के मामले में कुछ स्पष्ट तथ्य जोड़ना चाहता हूं (आपके प्रश्न से संबंधित, लेकिन फिर भी):

  • cat <file1 <file2 <file3केवल फ़ाइल 3 को पढ़ेगा, कम से कम बैश में। (वास्तव में, यह खोल पर निर्भर करता है, लेकिन सबसे गोले जाएगा dup जो प्रभाव के लिए पिछले एक कारण बनता है stdin के लिए हर निर्दिष्ट फ़ाइल,।)
  • cat file1 file2 file3सभी निर्दिष्ट फ़ाइलों क्रमिक रूप से दिखाया जाएगा (वास्तव में बिल्ली शब्द के रूप छोटा है CONCATENATE )।
  • cat file1 file2 file3 <file4 <file5 <file6 केवल फ़ाइल 1, फ़ाइल 2, फ़ाइल 3 पढ़ेगा (जैसा कि फ़ाइल नाम के तर्क पास होने पर स्टड को अनदेखा करता है)।
    • cat file1 file2 - file3 <file4 <file5 <file6 फ़ाइल 1, फ़ाइल 2, फ़ाइल 6, फाइल 3 (जैसा कि हाइफ़न बलों बिल्ली स्टड को अनदेखा नहीं करना है) पढ़ेंगे।

और त्रुटियों के बारे में। तर्क (बिना ) के रूप में निर्दिष्ट कुछ फ़ाइलों को खोलने में असमर्थता के मामले में <, बिल्ली विफल फ़ाइलों को छोड़ देगी (stderr के लिए प्रासंगिक संदेश आउटपुट के साथ), लेकिन फिर भी अन्य फ़ाइलों को पढ़ें। पुनर्निर्देशन (के साथ <) के रूप में निर्दिष्ट फ़ाइलों में से कम से कम एक खोलने में असमर्थता के मामले में , शेल भी बिल्ली शुरू नहीं करेगा (यह वास्तव में बिल्ली द्वारा उपयोग नहीं किए गए पुनर्निर्देशन के लिए भी होता है)। दोनों ही मामलों में त्रुटिपूर्ण निकास कोड वापस कर दिया जाएगा।


1
ध्यान दें कि आपके पहले उदाहरण में catफिर भी खुल जाएगा file1और file2, साथ ही file4और file5अपने तीसरे उदाहरण में। यह केवल दिखाएगा file3, सम्मान करेगा। file6सामग्री यदि ये पिछले खुले निर्देश सफल होते हैं।
जूलियारे

@ जैलीग्रे, धन्यवाद, मुझे नहीं पता था कि। स्ट्रेस स्पष्ट रूप से आपकी शुद्धता साबित हुई। मैंने केस 1 और 3 ए के लिए कोष्ठक पाठ को सही किया।
साशा

0

हम एक और कमांड का उपयोग कर सकते हैं, ताकि हम इस अंतर को नोटिस कर सकें:

wc –w food2.txt

संभावित उत्पादन:

6 food2.txt

कमांड फ़ाइल नाम बताता है क्योंकि यह जानता है (एक तर्क के रूप में पारित)।

wc –w < food2.txt

संभावित उत्पादन:

6

मानक इनपुट के बारे में जाने बिना कमांड के बिना food2.txt फ़ाइल को रीडायरेक्ट किया जाता है।

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