यह कैसे कानूनी है? "मैं file1 <file2 cat"


61

यह मानते हुए कि file2पहले से ही कमांड मौजूद है

> file1 < file2 cat

की सामग्री को कॉपी प्रतीत होता है file2करने के लिए file1

लेकिन मैं इस संरचना को नहीं समझ सकता।

मैं समझता हूं कि "कुछ भी नहीं" का निर्देशन किया जा रहा है file1, (इसकी सामग्री बनाना या मिटाना)। तब की सामग्री को file2निर्देशित किया जा रहा है file1

क्यों है catके बाद file2? यह कैसे पता चलेगा cat file2कि ऑपरेंड सही क्रम में नहीं हैं?


11
"सही क्रम" क्या है? क्या आप कुछ संसाधन / शिक्षण सामग्री का लिंक प्रदान कर सकते हैं जहाँ "सही क्रम" का वर्णन किया गया है?
ऑर्बिट

7
इस तरह के प्रश्न पूछते समय, आपको शेल निर्दिष्ट करना चाहिए; अलग-अलग लोगों के पास अलग-अलग किनारे हैं, खासकर पुनर्निर्देशन के आसपास।
चिरलीस-स्ट्राइक-

जवाबों:


117

शेल catकमांड लाइन पर कमांड को निष्पादित करने से पहले , यह पुनर्निर्देशन के लिए देखता है।

दो पुनर्निर्देशन हैं:

  1. >file1 यह कमांड के मानक आउटपुट को जाने देगा file1
  2. <file2 यह कमांड के मानक इनपुट से आएगी file2

तथ्य यह है कि इन पुनर्निर्देशनों को कमांड लाइन पर एक स्थान पर रखा जाता है, कोई फर्क नहीं पड़ता।

$ cat <file2 >file1

के समान है

$ <file2 cat >file1

जो जैसा है वैसा है

$ <file2 >file1 cat

etc.¹

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

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

catइसके मानक इनपुट से भी पढ़ेगा यदि इसे ऑपरेंड दिया गया है -। फिर, यह केवल catऔर कुछ अन्य उपयोगिताओं के लिए विशेष है (अर्थात कुछ भी नहीं जो शेल करता है)। catवर्तमान निर्देशिका में एक फ़ाइल का उपयोग करने के लिए जिसका नाम है - , जैसे फ़ाइल नाम के लिए एक पथ जोड़ें ./-

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

² गैर-मौजूदा फ़ाइल खोलते समय प्रश्न " बिल्ली अलग त्रुटि देती है " यह भी देखें ।


तथ्य यह है कि शेल कमांड लाइन पर कमांड को निष्पादित करने से पहले पुनर्निर्देशन सेट करता है यही कारण है कि ये चीजें विफल होती हैं और आप एक खाली आउटपुट फ़ाइल के साथ समाप्त होते हैं:

$ sort file >file

यहां, शेल फ़ाइल के मानक आउटपुट को fileनिष्पादित करने sort fileऔर कनेक्ट करने से पहले फ़ाइल को छोटा (खाली) कर देगा sort। तब sortउपयोगिता fileअपनी सामग्री को खोलेगी और छाँटेगी (जो कुछ भी नहीं है)। परिणाम (कुछ भी नहीं) मानक आउटपुट स्ट्रीम से होकर गुजरा है file

इस विशेष मामले में उपाय (एक फ़ाइल "इन-प्लेस" सॉर्ट करने के लिए) है

$ sort -o file file

या

$ sort file >file.sorted && mv file.sorted file

आउटपुट फ़ाइल नाम निर्दिष्ट करने के sortलिए -oफ़ाइल का उपयोग करते समय कम या ज्यादा क्या होता है ।


केवल इस कथन का समर्थन करने के लिए कि पुनर्निर्देशन कमांड लाइन पर उपयोगिता के वास्तविक नाम से पहले हो सकता है:

एक "सरल कमांड" वैकल्पिक चर असाइनमेंट और पुनर्निर्देशन का एक क्रम है, किसी भी क्रम में, वैकल्पिक रूप से शब्दों और पुनर्निर्देशन के बाद, एक नियंत्रण ऑपरेटर द्वारा समाप्त किया जाता है। [रेफरी: POSIX शेल कमांड भाषा 2.9.1 सरल कमांड]

और उपयोगिता के ऑपरेंड का हिस्सा नहीं होने के बारे में भी पुनर्निर्देशन:

वैकल्पिक संख्या, पुनर्निर्देशन ऑपरेटर, और शब्द कमांड को प्रदान किए जाने वाले तर्कों में दिखाई नहीं देगा (यदि कोई हो)। [रेफरी: पोसिक्स शेल कमांड लैंग्वेज 2.7 रिडायरेक्शन]


14
@Steve चारों ओर पुनर्निर्देशन को स्थानांतरित करने की स्वतंत्रता का उपयोग कुछ आदेशों को स्पष्ट करने के लिए किया जा सकता है, जैसे कि शुरुआत में इनपुट पुनर्निर्देशन के साथ एक पाइपलाइन <in foo | bar >outतार्किक क्रम में सब कुछ डालती है। अगर मैं echo >&2 Something bad happenedशेल स्क्रिप्ट से त्रुटि आउटपुट के लिए भी शौकीन हूं । लेकिन >out <in catबस obfuscation है

2
कैसे sort file >fileसही ढंग से पूरा किया जा सकता है?
seth10

11
साथ @setht sort -o file file
Kusalananda

6
बहुत बढ़िया जवाब। ध्यान दें कि आदेश मायने रखता है। < file1 > file2 catइससे बेहतर > file2 < file1 catहोगा कि file2अगर file1इसे खोला नहीं जा सकता है तो इसे काट दिया जाएगा।
स्टीफन चेज़लस

3
कुछ के बारे में पता होना चाहिए: जब HTML टुकड़ों के साथ POSIX से लिंक किया जाता है, तो सटीक संस्करण (जैसे pubs.opengroup.org/onlinepubs/9699919799.2016edition ) निर्दिष्ट करना बेहतर होता है क्योंकि टुकड़ों को कल्पना के एक ही संशोधन के संस्करणों के बीच बदलने के लिए जाना जाता है। (इस साइट पर उत्तरों में बहुत सी लिंकें शामिल हैं, जो अब गलत हैं क्योंकि 2016 संस्करण जारी होने के बाद टुकड़े गलत स्थान पर हैं)।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.