मैं एक ट्यूटोरियल के माध्यम से काम कर रहा था और दोनों का उपयोग देखा cat myfile.txtऔर cat < myfile.txt। क्या आज्ञाओं के इन दो अनुक्रमों में अंतर है? ऐसा लगता है कि दोनों किसी फ़ाइल की सामग्री को शेल में प्रिंट करते हैं।
मैं एक ट्यूटोरियल के माध्यम से काम कर रहा था और दोनों का उपयोग देखा cat myfile.txtऔर cat < myfile.txt। क्या आज्ञाओं के इन दो अनुक्रमों में अंतर है? ऐसा लगता है कि दोनों किसी फ़ाइल की सामग्री को शेल में प्रिंट करते हैं।
जवाबों:
पहले मामले में, catफ़ाइल को खोलता है, और दूसरे मामले में, शेल फ़ाइल को खोलता है, इसे catमानक इनपुट के रूप में पारित करता है ।
तकनीकी रूप से, उनके अलग-अलग प्रभाव हो सकते हैं। उदाहरण के लिए, ऐसा शेल कार्यान्वयन होना संभव होगा जो catकार्यक्रम की तुलना में अधिक (या कम) विशेषाधिकार प्राप्त हो । उस परिदृश्य के लिए, कोई फ़ाइल खोलने में विफल हो सकता है, जबकि दूसरा कर सकता है।
यह सामान्य परिदृश्य नहीं है, लेकिन यह इंगित करने के लिए उल्लेख किया गया है कि शेल और catसमान कार्यक्रम नहीं हैं।
sudo cat myfile.txt। sudo cat < myfile.txtआप फ़ाइल को पढ़ने के लिए विशेषाधिकार नहीं है, लेकिन काम नहीं करेगा।
ksh93है catbuiltin (डिफ़ॉल्ट रूप से सक्षम नहीं है जब तक कि आप /opt/ast/binअपने में जल्दी $PATHहै)।
wcजब तर्क दिया जाता है, तो गिनती से पहले फ़ाइल नाम प्रिंट करेंगे।
आपके परीक्षण के मामले में कोई बड़ा अंतर नहीं है। सबसे स्पष्ट एक त्रुटि संदेश आपको मिलेगा यदि 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थॉमस डिकी जवाब दें और संलग्न टिप्पणियां पहले से ही सुझाव के रूप में की विशेषाधिकार व्यवहार में एक बड़ा अंतर कर देगा।
kshमें अपनी खुद की इच्छा का उपयोग करते हैं, और यदि ऐसा है तो ... क्यों ?
bash, ksh93दूर दूर तक बेहतर खोल है। यह खोल लगभग,।
cat < file1 > file2से बहुत अलग प्रभाव पड़ता है cat file1 > file2, जहां file1अपठनीय या कोई नहीं है। (उत्तरार्द्ध रूप ट्रंकट्स file2; पूर्व नहीं होगा।)
cat myfile.txtफ़ाइल को पढ़ता है myfile.txtफिर इसे मानक आउटपुट पर प्रिंट करता है।
cat < myfile.txtयहाँ catकिसी भी फ़ाइल को खोलने के लिए नहीं दिया गया है, जैसे कि कई यूनिक्स कमांड करते हैं- मानक इनपुट से डेटा को पढ़ता है, जो file.txtकि शेल द्वारा निर्देशित होता है , और मानक आउटपुट पर प्रिंट करता है।
@ थोमस डिके का जवाब शानदार है।
मैं सिर्फ कई फाइलों को पढ़ने के मामले में कुछ स्पष्ट तथ्य जोड़ना चाहता हूं (आपके प्रश्न से संबंधित, लेकिन फिर भी):
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 के लिए प्रासंगिक संदेश आउटपुट के साथ), लेकिन फिर भी अन्य फ़ाइलों को पढ़ें। पुनर्निर्देशन (के साथ <) के रूप में निर्दिष्ट फ़ाइलों में से कम से कम एक खोलने में असमर्थता के मामले में , शेल भी बिल्ली शुरू नहीं करेगा (यह वास्तव में बिल्ली द्वारा उपयोग नहीं किए गए पुनर्निर्देशन के लिए भी होता है)। दोनों ही मामलों में त्रुटिपूर्ण निकास कोड वापस कर दिया जाएगा।
catफिर भी खुल जाएगा file1और file2, साथ ही file4और file5अपने तीसरे उदाहरण में। यह केवल दिखाएगा file3, सम्मान करेगा। file6सामग्री यदि ये पिछले खुले निर्देश सफल होते हैं।
हम एक और कमांड का उपयोग कर सकते हैं, ताकि हम इस अंतर को नोटिस कर सकें:
wc –w food2.txt।
संभावित उत्पादन:
6 food2.txt।
कमांड फ़ाइल नाम बताता है क्योंकि यह जानता है (एक तर्क के रूप में पारित)।
wc –w < food2.txt।
संभावित उत्पादन:
6।
मानक इनपुट के बारे में जाने बिना कमांड के बिना food2.txt फ़ाइल को रीडायरेक्ट किया जाता है।