पथनाम में रिक्त स्थान के साथ सीडी को निर्देशिका में बैश स्क्रिप्ट


95

मैं मैक एक्स पर बैश का उपयोग कर रहा हूं और मैं एक सरल निष्पादन योग्य स्क्रिप्ट फ़ाइल बनाना चाहूंगा, जो चलने पर किसी अन्य निर्देशिका में बदल जाएगी। हालाँकि, उस निर्देशिका के पथ में रिक्त स्थान हैं। आप यह कैसे करते हैं? यह वही है जो मेरे पास है...

फ़ाइल का नाम: cdcode

फ़ाइल सामग्री:

cd ~/My Code

अब दी गई, यह एक लंबा मार्गनाम नहीं है, लेकिन मेरा वास्तविक मार्गनाम पांच निर्देशिकाओं में गहरा है और उन निर्देशिकाओं में से चार के मार्ग में स्थान हैं।

BTW, मैंने कोशिश की है cd "~/My Code"और cd "~/My\ Code"इनमें से कोई भी काम नहीं किया है।


1
मैं एक समस्या के रूप में वर्णित एक के रूप में कर रहा हूँ। यानी निर्देशिका को बदलने के संभावित तरीकों में से कोई भी इसमें एक जगह नहीं है। ऐसा कुछ नहीं है: cd "My Passport" cd My \ Passport cd मेरा "पासपोर्ट" कुछ भी काम नहीं कर रहा है। शिकायत ठीक काम करती है। मैं सूचीबद्ध कर सकता हूं: ls -l My \ Passport / works ठीक। \> uname -a Linux होस्ट 2.6.18-8.1.8.el5.centos.plus # 1 एसएमपी सोम जुलाई 16 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --helds GNU बैश, संस्करण 3.1 .17 (1) -release- (i686-redhat-linux-gnu) कृपया कोई विचार?
डेनिस सी

जवाबों:


81

जब आप एक पथ को दोहराते हैं, तो आप टिल्ड विस्तार को रोक रहे हैं। तो ऐसा करने के कुछ तरीके हैं:

cd ~/"My Code"
cd ~/'My Code'

यहां टिल्ड को उद्धृत नहीं किया गया है, इसलिए टिल्ड विस्तार अभी भी चलाया जाएगा।

cd "$HOME/My Code"

आप दोहरे चर के अंदर पर्यावरण चर का विस्तार कर सकते हैं; यह मूल रूप से टिल्ड का विस्तार है

cd ~/My\ Code

आप बैकस्लैश के साथ विशेष वर्ण (जैसे स्थान) से भी बच सकते हैं।


3
आप cd ~ / My '' कोड भी कर सकते हैं, लेकिन यह मूर्खतापूर्ण होगा जब आप इसके बजाय एक बैकस्लैश से बच सकते हैं
निक डिक्सन

41

मुझे इस पृष्ठ पर नीचे दिया गया समाधान मिला :

x="test\ me"  
eval cd $x

एक \दोहरे-उद्धरण वाले पाठ में एक संयोजन निरंतर और evalपहले cdएक आकर्षण की तरह काम करता है!


अधिक स्पष्टता: स्क्रिप्ट की फ़ाइल की निर्देशिका के लिए cd'ing के लिए: DIR = $ (dirname "$ 0"); eval cd $ DIR
माइकल स्कॉट कटहबर्ट

1
यह वास्तव में मेरे लिए एक ओएस एक्स मशीन पर बैश-स्क्रिप्ट चलाने में मदद करता है। 🎉
टाइमबिलस्ट्रोम सेप

यहां वास्तव में कोई जरूरत नहीं evalहै।
बेंजामिन डब्ल्यू।

2
ओएस एक्स पर, मुझे बिना काम करने के लिए अन्य / पूर्व उत्तर नहीं मिल सकते थे eval
डी। वुड्स

10
cd ~/My\ Code

मेरे लिए काम करने लगता है ... यदि उद्धरण छोड़ने लेकिन स्लैश रखने से काम नहीं चलता है, तो क्या आप कुछ नमूना कोड पोस्ट कर सकते हैं?


10

आप इनमें से किसी का भी उपयोग कर सकते हैं:

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

आप उपयोग नहीं कर सकते:

cd ~"/My Code"

पहला काम करता है क्योंकि शेल का विस्तार ~ / में $ HOME / है, और फिर दोहरे कोड के बिना My Code पर टैप करता है। दूसरा विफल हो जाता है क्योंकि मैप करने के "लिए ' ' (दोहरा उद्धरण) नामक उपयोगकर्ता नहीं ~"है।


9

एक ही समस्या से जूझने के बाद, मैंने दो अलग-अलग समाधानों की कोशिश की, जो काम करते हैं:

1. ""अपने चर के साथ दोहरे उद्धरण चिह्नों ( ) का उपयोग करें ।

पिछले उत्तर में बताए अनुसार सबसे आसान तरीका आपके चर को दोहराता है:

cd "$yourPathWithBlankSpace"

2. का उपयोग करें eval

इस उत्तर के अनुसार यूनिक्स कमांड रिक्त स्थान से बचने के लिए आप रिक्त स्थान को छीन सकते हैं फिर evalइस तरह का उपयोग करें:

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

4

एक एकल बैकस्लैश मेरे लिए काम करता है:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

क्या आप सुनिश्चित हैं कि समस्या यह नहीं है कि आपकी शेल स्क्रिप्ट अपने उप-संस्करण में निर्देशिका बदल रही है, लेकिन तब आप मुख्य शेल (और मूल dir) में वापस आ जाते हैं जब किया जाता है? मैंने इसका इस्तेमाल करने से परहेज किया। वर्तमान शेल में स्क्रिप्ट को चलाने के लिए, हालांकि अधिकांश लोग इसके लिए केवल एक उपनाम का उपयोग करेंगे। रिक्त स्थान एक लाल हेरिंग हो सकता है।


धन्यवाद, Ry4an (और उत्तरदाताओं के बाकी)। ऐसा लगता है कि मैं स्क्रिप्ट को गलत तरीके से निष्पादित कर रहा था। मैं इसे ऐसे ही चलाने की कोशिश कर रहा था:% ./cdsomedir मुझे नहीं लगा कि मुझे "" का उपयोग करने की आवश्यकता है। स्क्रिप्ट चलाने के लिए जैसा आपने किया:% cdsomedir.sh एक बार जब मैंने ऐसा किया, तो यह काम किया। नौसिखिया गलती। धन्यवाद!


2

लिनक्स के नीचे काम करते समय नीचे का सिंटैक्स सही होता है:

cd ~/My\ Code

हालाँकि जब आप अपनी फ़ाइल निष्पादित कर रहे हैं, तो नीचे दिए गए सिंटैक्स का उपयोग करें:

$ . cdcode

(बस '।' और 'नहीं' / ')


जंगली जिज्ञासा से, वह बात क्यों करता है? मैंने केवल कभी देखा है './' का उपयोग किया है।
व्हेल

./ नया शेल खोल देगा, और फिर डायरेक्टरी को बदल देगा। इसलिए जब स्क्रिप्ट बाहर निकलती है, तो यह उस शेल पर वापस चली जाती है, जिसने नए शेल को जन्म दिया ... आप उस निर्देशिका में होंगे जहां आपने ~ / My Code के बजाय स्क्रिप्ट निष्पादित की थी। '।' दूसरी ओर, शेल के वर्तमान उदाहरण में स्क्रिप्ट को निष्पादित किया जाता है।
Alterlife

बिन्दु "।" एक यूनिक्स कमांड है, जो "स्रोत" कमांड के लिए एक उपनाम है। यह एक फ़ाइल नाम के बाद होना चाहिए। तो "स्रोत myfile" आपके वर्तमान शेल में फ़ाइल चलाएगा। और "माईफाइल" ऐसा ही करेगा। "./" चर का अर्थ "वर्तमान निर्देशिका" है और यह एक कमांड नहीं है।
JPGConnolly

2

दोहरे उद्धरण चिह्नों का उपयोग करें

go () 
{ 
    cd "$*"
}

धन्यवाद। .bashrcनिर्देशिका बदलने के लिए एक फ़ाइल में फ़ंक्शन के लिए एक उपयोगी अतिरिक्त जब निर्देशिका नाम को कमांड लाइन पर रिक्त स्थान से चिपकाने के बिना तब रिक्त स्थान से बाहर निकलें या पूरी बात उद्धृत करें। cdsहालांकि एक बेहतर नाम है।
मैट

क्या इसका विस्तार करने का कोई तरीका है (यदि (बिना) के) ऐसे तो बस होम डायरेक्टरी के goबराबर cdयानी सीडी के बराबर होगा ?
zennhoy

2

ऐसा करने का बहुत ही सरल तरीका है-

 $ cd My\ Folder

बैश में, डीआईआर कमांड चलाएं और परिणामों में आप देखेंगे कि फ़ोल्डर या पथ के नाम जिनके बीच में जगह है, इसके परिणामों में लिखा गया है -

$dir
My\ Folder
New\ Folder

2

यह यह करेगा:

cd ~/My\ Code

मुझे इसका उपयोग करने के लिए iCloud ड्राइव में संग्रहीत फ़ाइलों के साथ काम करना होगा। आप दोहरे उद्धरण चिह्नों (") का उपयोग नहीं करना चाहेंगे, क्योंकि यह एक पूर्ण पथ होना चाहिए। दूसरे शब्दों में, आप दोहरे उद्धरणों को tilde (~) के साथ जोड़ नहीं सकते हैं।

उदाहरण के माध्यम से मुझे हाल की परियोजना के लिए इसका उपयोग करना पड़ा:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

मुझे आशा है कि वह मदद करेंगे।


1

मुझे एक समान समस्या थी अब मैं कुछ डेटा डंप करने के लिए एक बैश स्क्रिप्ट का उपयोग कर रहा था। मैंने स्क्रिप्ट फ़ोल्डर में एक प्रतीकात्मक लिंक बनाना समाप्त कर दिया, जिसमें कोई भी रिक्त स्थान नहीं था। मैंने तब अपनी लिपि को प्रतीकात्मक कड़ी की ओर इंगित किया और यह ठीक काम करती है।

अपना लिंक बनाने के लिए। ln -s [TARGET DIRECTORY OR FILE] ./ [SHSHCUT]

मऊ या नहीं हो सकता है।


0

एकल उद्धरण का उपयोग करें, जैसे:

myPath=~/'my dir'

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