{1,2,3} और {1..3} के बीच अंतर


17

क्या दृश्यों {1,2,3}और के बीच अंतर है {1..3}?

उदाहरण के लिए अगर मेरे पास कुछ फाइलें हैं

file.1
file.2
file.3

और मैं catउन्हें एक साथ उपयोग करना सुरक्षित है cat file.{1..3} > file?

मुझे पता है कि cat file.*>fileसमस्याएँ हो सकती हैं क्योंकि शेल कभी-कभी फ़ाइलों को यादृच्छिक तरीके से विस्तारित कर सकता है (मुझे लगता है कि यह नोड्स पर निर्भर करता है, क्या यह?)


1
उपयोगcat file.[123] >file
mikeserv

3
के विस्तार का क्रम file.*इनोड्स पर निर्भर नहीं है। यह हमेशा उन्हें शाब्दिक रूप से क्रमबद्ध करता है, जो आपकी खोज सेटिंग पर निर्भर कर सकता है।
बरमार

1
"इनोडेस पर निर्भर करता है" बेहतर शोधित आपराधिक-दिमागों में से एक चरण की तरह लगता है- "कंप्यूटर" दृश्य।
एलेक चैले

1
@ बाइक, मेरा मानना ​​है कि मुझे यह मिल गया है - यह एक शेल ग्लोब है, इसलिए यह केवल उन फाइलों तक फैलता है जो वास्तव में मौजूद हैं, है ना? बनाम file.{1..3}जो इन तीनों का विस्तार करता है या नहीं।
वाइल्डकार्ड

1
@Wildcard - सही है, जब तक कम से कम एक मौजूद है, वह है। यदि ऐसा नहीं है, तो यह बिल्कुल नहीं है और कुछ या बहुत उपयोगी catत्रुटियों के साथ file.[123] not found
15.116 को

जवाबों:


18

{1..3}और {1,2,3}एक ही परिणाम का उत्पादन, लेकिन अलग तरीके से।

सामान्य तौर पर, {n1..n2}(जो पहले से आया था zsh, bashऔर kshबाद में इसे कॉपी किया) जहां n1और n2पूर्णांक के बीच n1और सभी संख्याओं का उत्पादन होता है n2। जबकि {x,y,z}तीन चरित्रों का उत्पादन x, yऔर z

आपके मामले में, आप उपयोग करने के लिए सुरक्षित हैं cat file.{1..3} > file

अब, यदि cat file.*>fileआपने शेल ग्लोबिंग का उपयोग किया है , जो सभी फ़ाइल नाम के साथ शुरू होता है file.और परिणाम वर्तमान लोकेल में टकराव क्रम के आधार पर छांटा जाएगा।

आप अभी भी सुरक्षित हैं, लेकिन अब नहीं जब आपके पास 10 से अधिक फाइलें हैं। {1..10}आपको दे देंगे 1 2 3 4 5 6 7 8 9 10। ग्लोबिंग के साथ, आपको मिलेगा1 10 2 3 4 5 6 7 8 9


8

अंतर यह है कि एक सूची है और दूसरा अनुक्रम है। {1,2,3}तीन विशिष्ट तत्वों के लिए विस्तारित, 1, 2, और 3{1..3}एक और तीन के बीच संख्या की सूची में फैलता है। इस विशेष मामले में, वे समान हैं और आप दोनों में से किसी एक का उपयोग कर सकते हैं। file.*वर्तमान निर्देशिका में सभी फाइलों और निर्देशिकाओं का विस्तार होगा, जिनका नाम शुरू होता है file.। यदि आपके पास केवल है file.1, file.2और file.3फिर वह भी अन्य दो के बराबर है।

इसकी समस्याएँ पैदा करने के लिए, मैं क्यों नहीं देखता। आप सोच रहे होंगे

$ cat file.* > file.txt
cat: file.txt: input file is output file

हालांकि, यह एक पूरी तरह से अलग मुद्दा है। एकमात्र अन्य समस्या जो मैं सोच सकता हूं, वह यह है कि आपका शेल सही क्रम में फाइलों को सूचीबद्ध नहीं कर सकता है। उदाहरण के लिए:

$ touch file1 file11 file2
$ echo file*
file1 file11 file2

इसे हल करने के लिए, आप zshइसके बजाय उपयोग कर सकते हैं bash( विवरण के लिए यहां देखें):

% echo f*(n)
file1 file2 file11

सामान्य तौर पर, तीन दृष्टिकोण समान नहीं हैं। यह आप पर निर्भर करता है की आप क्या करना चाहते हो। उन मामलों में जहां तीनों एक ही आउटपुट लौटाते हैं, हां, आप उनमें से किसी का भी उपयोग कर सकते हैं। इससे कोई फ़र्क नहीं पड़ता। ये सभी विस्तार शेल द्वारा किए जाते हैं और इससे पहले कि वे जो कुछ भी कमांड का उपयोग करते हैं उन्हें पारित किया जाता है।


*अगर मेरे पास अधिक या बराबर 10 फाइलें थीं, तो क्या मैं सही क्रम पर निर्भर करता हूं, इसके साथ कोई समस्या नहीं होगी ?
syss

1
@syss नहीं। अगर आप की तुलना में अधिक था यह एक समस्या हो सकता है ARG_MAXफ़ाइलों लेकिन उस तरह से, अधिक से अधिक 10 तरीका होगा
terdon

1
@terdon वह पूछ रहा था कि क्या वे संख्यात्मक क्रम में दिखाई देंगे (अर्थात "1, 10, 2") नहीं, यदि वे तर्क सरणी को ओवरफ्लो करेंगे।
रैंडम 832

3
@terdon मुझे लगता है कि @syss सही है कि के उत्पादन को cat *अच्छी तरह से परिभाषित नहीं किया गया है। आउटपुट शेल और पर्यावरण पर निर्भर करता है। देखें सेबस्टियन की टिप्पणी
मार्को

जोड़ने .txtसे समस्या हल नहीं होगी file.*?
इस्माइल मिगुएल

6

वे समान हैं, लेकिन यह उपलब्ध होने पर आपके द्वारा इंस्टॉल किए गए बैश संस्करण पर निर्भर करता है।

से इस पेज:

{xxx,yyy,zzz,...} probably in all bash versions

{a..z} introduced in bash 3

{<START>..<END>..<INCR>} new in bash 4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.