पथ संचलन के बाद बैश ब्रेस का विस्तार


12

मैं ब्रेस विस्तार का उपयोग करके एक ही निर्देशिका में एक अलग नाम पर एक फ़ाइल को कॉपी करने की कोशिश कर रहा हूं। मैं bash 4.4.18 का उपयोग कर रहा हूं।

यहाँ मैंने क्या किया है:

cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}

लेकिन मुझे यह त्रुटि मिली:

cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory

यहां तक ​​कि इस तरह एक साधारण ब्रेस विस्तार भी मुझे वही त्रुटि देता है:

cp {my-file-to-rename.bin, new-name-of-file.bin}

मैं क्या गलत कर रहा हूं?

जवाबों:


29

ब्रेस विस्तार वाक्य रचना के लिए अल्पविराम को स्वीकार करता है, लेकिन यह अल्पविराम के बाद एक अंतरिक्ष स्वीकार नहीं करता। कई प्रोग्रामिंग भाषाओं में, कॉमा के बाद रिक्त स्थान आम हैं, लेकिन यहां नहीं। बैश में, एक अनछुए स्थान की उपस्थिति ब्रेस विस्तार को प्रदर्शन करने से रोकती है।

अंतरिक्ष निकालें, और यह काम करेगा:

cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}

जबकि आवश्यक नहीं है, ध्यान दें कि आप लट के .binबाहर अनुगामी स्थानांतरित कर सकते हैं :

cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin

आप ब्रेस विस्तार के प्रभाव का परीक्षण करना चाहते हैं, तो आप उपयोग कर सकते हैं echoया printf '%s ', या printfजो कुछ भी प्रारूप स्ट्रिंग आप पसंद करते हैं के साथ, कि क्या करना है। (व्यक्तिगत रूप से मैं सिर्फ इसके लिए उपयोग करता हूं echo, जब मैं बैश में हूं, क्योंकि बैश के echoबिलिन डिफ़ॉल्ट रूप से भागने के दृश्यों का विस्तार नहीं करता है, और इस प्रकार यह वास्तव में जांचने के लिए अनुकूल है कि कमांड वास्तव में क्या चलेगा।) उदाहरण के लिए:

ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin

23

string{foo, bar}ब्रेस विस्तार नहीं है; यह दो शब्दों है string{foo,और bar}। ब्रेस विस्तार का उपयोग करने के लिए, ब्रेसिज़ को एक ही शब्द के भीतर होना चाहिए। यदि आपको इसकी आवश्यकता नहीं है, तो आपको अतिरिक्त स्थान को निकालना होगा या यदि आपको इसकी आवश्यकता है तो इसे उद्धृत करना होगा:

$ printf "%s\n" aa{bb, cc}
aa{bb,
cc}
$ printf "%s\n" aa{bb,cc}
aabb
aacc
$ printf "%s\n" aa{bb," cc"}
aabb
aa cc

स्पष्ट उदाहरण के लिए +1, और धन्यवाद। जब मेरी प्रतिष्ठा काफी हो जाएगी तो मैं अपना त्याग कर दूंगा। :)
नानगारसयद

"शेल शब्दों" के बारे में कुछ और बताया जाना चाहिए। । । शेल कैसे पता करता है कि शब्दों को कहाँ विभाजित किया जाना है?)
सर्गी कोलोडियाज़नी

-1

बैश उस जगह को वैसा ही मानते हैं जैसे कि यह कोई और होगा। IFS के रूप में, आंतरिक क्षेत्र विभाजक। यह विस्तार के बाद शब्द विभाजन के लिए और रीड बिलिन कमांड के साथ शब्दों में लाइनों को विभाजित करने के लिए उपयोग किया जाता है।

शेल IFS के प्रत्येक चरित्र को एक सीमांकक के रूप में मानता है, और इन वर्णों पर अन्य विस्तार के परिणामों को शब्दों में विभाजित करता है। यदि IFS परेशान है, या इसका मान बिल्कुल, डिफ़ॉल्ट है, तो पिछले विस्तार के परिणामों की शुरुआत और अंत में, के अनुक्रमों को अनदेखा किया जाता है, और IFS वर्णों के किसी भी क्रम की शुरुआत या अंत में सीमांकित करने का कार्य नहीं करता है शब्दों। यदि आईएफएस में डिफ़ॉल्ट के अलावा एक मूल्य है, तो व्हाट्सएप वर्णों के स्थान और टैब को शब्द की शुरुआत और अंत में नजरअंदाज कर दिया जाता है, जब तक कि व्हाट्सएप चरित्र आईएफएस (एक आईएफएस व्हाट्सएप चरित्र) के मूल्य में है। IFS में कोई भी वर्ण जो IFS व्हाट्सएप नहीं है, साथ ही किसी भी निकटवर्ती IFS व्हाट्सएप वर्ण के साथ, एक क्षेत्र का परिसीमन करता है। IFS व्हॉट्सएप पात्रों का एक क्रम भी एक सीमांकक के रूप में माना जाता है। यदि IFS का मान शून्य है,
-bash (1)

सीमांकक डालकर, unescaped, तो आप अपने आदेश और तर्क को मार रहे हैं कहा:

  1. "Cp"
  2. "~ / कुछ / dir / {मेरी फाइल करने के लिए rename.bin,"
  3. "नए-नाम-ऑफ-द file.bin}"

अगर आपके पास "\" उद्धरण या एक पलायन था, तो आपके पास होगा:

  1. "Cp"
  2. "~ / कुछ / dir / {मेरा-फ़ाइल-से-rename.bin, \ new-name-of-file -bin"

जो भी आप नहीं चाहते थे, जब तक कि "new-name-of-file.bin" नई फ़ाइल का नाम नहीं है जो आप चाहते थे। अंतरिक्ष शामिल है। जैसे कि ब्रेस विस्तार पहले होता है, और फिर टिल्ड विस्तार, बैश निष्पादित होता है:

  1. "Cp"
  2. "/Path/to/home/some/dir/my-file-to-rename.bin"
  3. "/ पथ / से / घर / कुछ / dir / \ new-name-of-file.bin"

बस अंतरिक्ष को हटाने से वह सब ठीक हो जाएगा।


5
यह ज्यादातर अच्छा है, लेकिन आपको लगता है कि शब्द बंटवारे पर होता है cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}और IFSपरिणाम को प्रभावित करता है। न तो ऐसा है। इधर, अंतरिक्ष एक है metacharacter tokenization में ( चरण 2 )। बंटवारा होने पर 3.5.7 देखें । IFS=xफिर कोशिश करें printf '[%s]\n' {a,b} printf '[%s]\n' {a, b} printf '[%s]\n' {a,xb} printf '[%s]\n' {a, xb}
एलियाह कगन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.