मैं एक ट्यूटोरियल के माध्यम से काम कर रहा था और दोनों का उपयोग देखा 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
है cat
builtin (डिफ़ॉल्ट रूप से सक्षम नहीं है जब तक कि आप /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 फ़ाइल को रीडायरेक्ट किया जाता है।