इस अजीब प्रतीक का क्या मतलब है: ">" अर्थ में


47

मुझे स्क्रिप्ट में कुछ मिला, लेकिन मुख्य स्क्रिप्ट से संबंधित नहीं। था :>एक लाइन में।

क्या आप मुझे समझा सकते हैं कि इसका क्या मतलब है?

:> file
while read A B C D E; do echo "$A;$B;$D;$E;$C" >> file; done < otherfile

6
महत्वपूर्ण रूप से, :>एक भी ऑपरेटर नहीं है। यदि आप : > fileइसके बजाय इसे पढ़ते हैं, तो समझना आसान हो सकता है ।
jpfx1342

इसका मतलब है कि स्क्रिप्ट लिखने वाले व्यक्ति को लूप के आउटपुट को फ़ाइल में पुनर्निर्देशित करना चाहिए while read A B C D E; do echo "$A;$B;$D;$E;$C"; done < otherfile > file:। या बेहतर अभी तक, उन्हें नौकरी के लिए सही उपकरण का उपयोग करना चाहिए था, जैसे कि पीटर ने सुझाव दिया था , जाग । एक तरफ के रूप में, आप लगभग हमेशा -rस्विच का उपयोग करना चाहते हैंread
टॉम फेनेच

बैश के बाहर, यह एक कौवे के लिए एक स्माइली होगा।
23

जवाबों:


46

एक बैश स्क्रिप्ट की एक पंक्ति में था: इसका क्या मतलब है?

:> file

यह कहने का एक छोटा रास्ता है:

  • यदि fileमौजूद नहीं है, तो इसे 0बाइट्स में विभाजित करें।

इसका मतलब है कि आप सुनिश्चित कर सकते हैं कि यह fileमौजूद है और यह खाली है।

आप उपयोग भी कर सकते हैं > fileलेकिन :> fileअधिक पोर्टेबल है।

स्टैक ओवरफ्लो प्रश्न देखें ':' (कोलन) GNU बैश बिलिन का उद्देश्य क्या है? अधिक जानकारी के लिए।


मैं दूसरी पंक्ति नहीं समझता। मैंने सोचा था, कि पढ़ा पढ़ा चर। कमांड गूंज भी अजीब है। क्या आप समझाएँगे?
diego9403

मैं एक यूनिक्स विशेषज्ञ नहीं हूं, लेकिन मुझे लगता है कि दूसरी पंक्ति चीजों को पढ़ती है otherfileऔर echoउन्हें बाहर ले जाती है file। यह जो कुछ भी पढ़ता है उससे भी चर बनाता है ... यदि आप एक निश्चित उत्तर चाहते हैं तो कृपया अपना प्रश्न पूछें।
DavidPostill

2
@ diego9403: स्टड readसे इनपुट मिलता है। अपने आप, यह पढ़ेगा कि आप क्या लिखते हैं। जब से स्टडिन को पुनर्निर्देशित किया गया है तब स्टैनड में "टाइप" <otherfileकी सामग्री otherfileहै। तो readमूल्यों को लाइन-बाय-लाइन में चर $ A, $ B, $ C, $ D और $ E से मिलता है।
17

तो यह सिर्फ truncateकोरुटील्स से अधिक अस्पष्ट विकल्प है ?
फेडरिको पोलोनी

1
@PeterCordes का अर्थ "अस्पष्ट" नहीं था जैसा कि "यह असामान्य है", लेकिन जैसा कि "यह पाठक के लिए कम स्पष्ट है"।
फेडरिको पोलोनी

29

यह एक नई फ़ाइल बनाने के फैंसी तरीके की तरह दिखता है। में bash :एक अशक्त आदेश है:

$ type : 
: is a shell builtin 
$ help : 
:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

>:किसी फ़ाइल का आउटपुट पुनर्निर्देशित करता है।


2
यह भी फ़ाइल काटना अगर यह पहले से मौजूद है ...
DavidPostill

2
हाँ, यह क्या है >करता है
आर्कादिउज़ Drabczyk

2
:के लिए आशुलिपि है true। संभवतः कुछ गोले में, trueएक बेसिन नहीं है? दोनों बिल-इन में बने हैं।
पीटर कॉर्ड्स

12

:का दूसरा नाम है true। दोनों बैश में शेल बिल्ड हैं, लेकिन कोई नहीं है /bin/:, केवल ए /bin/true। आउटपुट पुनर्निर्देशन open(2)फ़ाइल के साथ शेल का कारण बनता है O_CREAT|O_TRUNC। अगर कुछ नहीं लिखा है, तो यह शून्य लंबाई पर रहता है।

उन दो टुकड़ों को एक साथ :> fileरखना, फाइलों को रौंदने के लिए एक बहुत ही सामान्य मुहावरा है। : >fileहालांकि, ज्यादातर लोग इसे लिखकर कम अजीब दिखने की कोशिश करेंगे ।


चूंकि आपने दूसरी पंक्ति के बारे में टिप्पणी में पूछा था, इसलिए मैं अपनी टिप्पणियों को उत्तर में बदल दूंगा। (हालांकि आपने अपने प्रश्न में यह नहीं पूछा था।)

दूसरी पंक्ति एक लूप है जो otherfileकुछ नामित चर में से लाइनों को पढ़ती है । लूप बॉडी echoउन्हें ;पहले जो भी व्हाट्सएप के बजाय सेपरेटर के साथ प्रिंट करने के लिए उपयोग करती है । fileबंद किया गया है और प्रत्येक पुनरावृत्ति के लिए फिर से खोला गया है, क्योंकि पुनर्निर्देशन लूप के अंदर है। का उपयोग while ...;do read -r ...;done <otherfile >fileकम चूसना होगा, और पहले फ़ाइल को छोटा करने की आवश्यकता से बचें। भागने के पात्र के रूप में read -rनहीं खाते \

बैश में टेक्स्ट प्रोसेसिंग काफी धीमी है। इसका एक हिस्सा अपरिहार्य है: एक पंक्ति के अंत की निगरानी से बचने के लिए readएक बार में एक बाइट (एक read(2)सिस्टम कॉल प्रति बाइट) पर जाना पड़ता है । नौकरी के लिए सही टूल का उपयोग करना बेहतर होगा:

awk -vOFS=';' '{ print $1, $2, $4, $5, $3 }' -- otherfile  >file

--इसका मतलब यह है कि अगर आपकी स्क्रिप्ट को तोड़ otherfileदिया जाता है तो इसका नाम मूर्खतापूर्ण है --version

आउटपुट फ़ील्ड विभाजक सेट करने का ;मतलब है कि आप प्रिंट करने के लिए कई फ़ील्ड पास कर सकते हैं। शेल, readव्हॉट्सएप के साथ बाकी की पूरी लाइन को आखिरी वेरिएबल में असाइन करता है, लेकिन केवल 5 में विभाजित करने के लिए awk को बताने का कोई तरीका नहीं है। यदि यह महत्वपूर्ण है, तो शायद बस बैश लूप का उपयोग करते रहें, क्योंकि यह awk में असुविधाजनक है। पर्ल यह आसान बनाता है, क्योंकि splitयह एक अधिकतम-फ़ील्ड आर्ग ले सकता है, लेकिन यह जाग की तुलना में शुरू करने के लिए बहुत धीमा है।

वास्तव में, यह इतना कठिन नहीं था, लिखने के लिए सिर्फ एक बदसूरत रेगेक्स। $5जागने के बजाय रेस्ट-ऑफ-द-लाइन प्राप्त करने के लिए , खेतों पर लूपिंग अभी भी अपने मूल व्हाट्सएप को खो देता है। मेरा पहला व्यवहार्य विचार का उपयोग करने के लिए है gensubपर $0, (पूरे लाइन) पहले 4 क्षेत्रों को दूर करने (यानी गैर अंतरिक्ष अंतरिक्ष के बाद) और सब कुछ छोड़ने:

awk -vOFS=';' '{ tail = gensub("[[:space:]]*([^[:space:]]+[[:space:]]+){4}", "", 1); print $1, $2, $4, tail, $3 }' -- otherfile >file

मुझे यह पहली कोशिश में सही लगा, लेकिन इस तथ्य से कि मैं खुद से प्रभावित था, उस awk कोड की पठनीयता के बारे में कुछ कहता है। >। <

ध्यान दें कि यह printपहले की तरह ही कैसा है , लेकिन tailइसके स्थान पर है $5

echo 'A  B c DD    e      f g    f' | 
  awk -vOFS=\; '{ tail = gensub("[[:space:]]*([^[:space:]]+[[:space:]]+){4}", "", 1);
   print $1, $2, $4, tail, $3 }'

A;B;DD;e       f g    f;c

यह अधिक प्रभावशाली होगा यदि मैं शाब्दिक रूप से कॉपी / पेस्ट कर सकता हूं और दिखा सकता हूं कि यह आउटपुट में आया है। ^ Q के साथ बैश में एक टाइप करें। ctrl-Q का मतलब है कि अगले कुंजीपट को एक शाब्दिक चरित्र के रूप में उद्धृत करें, क्योंकि बैश के इमैक-स्टाइल लाइन का संपादन इसके लिए वास्तविक एमएसीएस के समान है।

http://mywiki.wooledge.org/BashFAQ में स्क्रिप्टिंग के बारे में कुछ उपयोगी चीजें हैं जो किसी भी चीज को नहीं तोड़ेंगी जो आप स्क्रिप्ट पर फेंकते हैं।

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