2012-04-05 10 views
19

मैं पथ के साथ काम करने की कोशिश कर रहा हूं और घर निर्देशिका को बाल्ड में टिल्ड के साथ प्रतिस्थापित कर रहा हूं, मैं उम्मीद करता हूं कि इसे आवश्यकतानुसार छोटे बाहरी कार्यक्रमों के साथ किया जाए। बस बैश के साथ ऐसा करने का कोई तरीका है। मुझेक्या बिल्डर में tilde के साथ घर निर्देशिका को बदलने का कोई अच्छा तरीका है?

${PWD/#$HOME/\~} 

लेकिन यह बिल्कुल सही नहीं है। यह जरूरत है परिवर्तित करने के लिए:

/home/alice to ~ 
/home/alice/ to ~/ 
/home/alice/herp to ~/herp 
/home/alicederp to /home/alicederp 

ब्याज की एक नोट के रूप में, यहाँ कैसे बैश स्रोत यह जब परिवर्तित करता है \w value in the prompt:

/* Return a pretty pathname. If the first part of the pathname is 
    the same as $HOME, then replace that with `~'. */ 
char * 
polite_directory_format (name) 
    char *name; 
{ 
    char *home; 
    int l; 

    home = get_string_value ("HOME"); 
    l = home ? strlen (home) : 0; 
    if (l > 1 && strncmp (home, name, l) == 0 && (!name[l] || name[l] == '/')) 
    { 
     strncpy (tdir + 1, name + l, sizeof(tdir) - 2); 
     tdir[0] = '~'; 
     tdir[sizeof(tdir) - 1] = '\0'; 
     return (tdir); 
    } 
    else 
    return (name); 
} 
+0

यह बैश नहीं है अधिक सी कोड की तरह। लेकिन लगभग कोई संदर्भ के साथ एक स्ट्रिंग को प्रतिस्थापित करना त्रुटि प्रवण है। आप वाकई इस तरह आगे बढ़ना चाहते हैं? – pizza

+1

क्षमा करें अगर यह स्पष्ट नहीं था। सी कोड एक उदाहरण है कि इसे कैसे करें। यह कैसे बैश खुद करता है। सी में लिखे गए एक प्रोग्राम होने के नाते बैश। अब मैं बैश भाषा में ऐसा करना चाहता हूं। – Jake

+1

क्या आप हमें बता सकते हैं कि यह अभी क्या आउटपुट करता है? – birryree

उत्तर

7

this unix.stackexchange answer देखें: आप बैश उपयोग कर रहे हैं

, तो dirs builtin वांछित व्यवहार है:

dirs +0 
~/some/random/folder 

शायद वह बैश के अपने सी कोड का उपयोग करता है जिसे आपने चिपकाया था। :)

और यहाँ कैसे आप इसका इस्तेमाल कर सकते हैं:

dir=...      # <- Use your own here. 
pushd "$dir" > /dev/null # Switch to the given directory; 
          # suppress output. 
dir_with_tilde=$(dirs +0) # Run "dirs" and save to variable. 
popd > /dev/null   # Switch back to where we were 
+1

की ओर जाता है आप शायद 'dirs + 0' चाहते हैं, अन्यथा निर्देशिका स्टैक (' pushd foo') का उपयोग करते समय यह मूल निर्देशिका दिखाएगा (ढेर के नीचे) वर्तमान की बजाय। – dcoles

+0

धन्यवाद; ठीक कर दिया। अगली बार, सीधे सुधार करने के लिए स्वतंत्र महसूस करें। –

+0

आप 'dir_with_tilde = "$ (cd" $ {dir} "&& dirs +0)" 'एक लाइनर के रूप में ... कर सकते हैं, लेकिन यह निर्देशिका काम नहीं करता है, क्योंकि यह निर्देशिका मौजूद नहीं है आप एक अस्तित्वहीन निर्देशिका में नहीं बदल सकते हैं। आप इसे बनाने के लिए एक पथ बना रहे हैं और इसे एक दोस्ताना तरीके से लॉग करना चाहते हैं। –

12

मैं के रूप में सीधे यह करने के लिए एक तरह से की पता नहीं है एक चर प्रतिस्थापन का हिस्सा है, लेकिन आप इसे एक कमांड के रूप में कर सकते हैं:

[[ "$name" =~ ^"$HOME"(/|$) ]] && name="~${name#$HOME}" 

नोट इस वास्तव में ऐसा नहीं करता है कि आपके लिए क्या पूछा: इसके साथ "~ /" के बजाय "/ घर/ऐलिस /" की जगह "~" से यह जानबूझकर है, क्योंकि वहां ऐसे स्थान हैं जहां पिछला स्लैश महत्वपूर्ण है (उदा। cp -R ~ /backupscp -R ~/ /backups से कुछ अलग है)।

+3

यह समाधान मेरे लिए काम नहीं करता है, क्योंकि यह "~" के बाद सब कुछ में कटौती करता है। जैसे/घर/एलिस/दस्तावेज सिर्फ "~" में बदल दिए जाते हैं, जबकि मैं चाहता था कि यह सिर्फ होम निर्देशिका भाग को प्रतिस्थापित करे और "~/दस्तावेज़" लौटाए। जाहिर है, यह मूल पोस्टर के लिए कोई समस्या नहीं थी। हालांकि, मैं 'name = $ (echo $ name | sed" s:^$ HOME: ~: ") 'के साथ आया, जो ऐसा लगता है कि _I_ चाहता था। बस सोचा कि मैं साझा करूंगा, क्योंकि समाधान के लिए पहली बार यहां आया था। – Steinar

+1

@Steinar: यह वही करना चाहिए जो आप चाहते हैं - '$ {name # $ HOME} 'भाग' $ name' लेता है और आपके उदाहरण में 'i.e."/दस्तावेज़ "से' $ HOME' हटा देता है)। क्या यह संभव है कि आप इसमें एक टाइपो था? –

+0

@ गॉर्डन डेविसन: आप सही हैं, यह _does_ जिस तरह से मैं चाहता था काम करता हूं ... इसे जांचते समय मुझे एक टाइपो होना चाहिए था। – Steinar

6

मैं इस सादे ol बैश स्ट्रिंग प्रतिस्थापन :) के साथ किया गया

> echo $HOME 
/Users/fots 
> mypath="/Users/fots/some/cool/path" 
> echo ${mypath/$HOME/\~} 
~/some/cool/path 
+2

'mypath ="/उपयोगकर्ता/उपयोगकर्ता/fots "' '/ उपयोगकर्ता ~ 'की ओर जाता है क्योंकि आपका कमांड प्रतिस्थापन पथ के सामने नहीं लगाया जाता है, लेकिन स्ट्रिंग में कहीं भी इसे बदल देगा। 'mypath =" उपयोगकर्ता/fotssss "' 'sss' –

संबंधित मुद्दे