"~" के संदर्भ में pwd परिणाम बनाएं?


28

pwd मुझे देता है

/data/users/me/some/random/folder

क्या प्राप्त करने का एक आसान तरीका है

~/some/random/folder

से pwd?


क्या सेड के माध्यम से पाइपिंग एक विकल्प है?
मैथ्यू डी। शोलेफील्ड

7
यदि आप ऐसा करने जा रहे हैं, तो मैं दृढ़ता से परिणामी कमान के अलावा कुछ और नाम देने की सलाह दूंगा pwd। अन्यथा, आप उन स्क्रिप्ट को तोड़ देंगे जो संदर्भों में इसके उत्पादन का उपयोग करने की अपेक्षा करती हैं जो टिल्ड विस्तार नहीं करते हैं।
चार्ल्स डफी

जवाबों:


25

यदि आप बैश का उपयोग कर रहे हैं, तो बिलिन का dirsवांछित व्यवहार है:

dirs +0
~/some/random/folder

(ध्यान दें +0, नहीं-0 ।)

के साथ zsh:

dirs
~/some/random/folder

वास्तव में, हमें सबसे पहले निर्देशिका स्टैक को साफ़ करने की आवश्यकता है, अन्यथा dirsसभी सामग्री को प्रिंट करेंगे:

dirs -c; dirs

या साथ zshकी printनिर्मित:

print -rD $PWD

या

print -P %~

(है कि एक बदल जाता है शीघ्र विस्तार पर। %~में $PS1साथ वर्तमान निर्देशिका के लिए फैलता है $HOMEके साथ बदल दिया ~बल्कि अन्य संभालती नामित निर्देशिका अन्य उपयोगकर्ताओं या के घर निर्देशिका की तरह नामित निर्देशिका कि आप अपने आप को परिभाषित)।


मैं हर समय बैश और zsh के बीच स्विच करता हूं। दुर्भाग्य से यह समाधान मुझे गोले के बीच के अंतर को याद करने के लिए मजबूर करता है और यह भी याद रखने के लिए (जांचने के लिए) कि मैं वर्तमान में कहां हूं। @Bichoy द्वारा उत्तर इन दोनों के लिए खोल-अज्ञेय है।
avp

18

आप बैश वैरिएबल विकल्प प्रतिस्थापन सुविधा का उपयोग कर सकते हैं:

$ pwd
/home/vagrant/foo/bar
$ echo ${PWD/#$HOME/'~'}
~/foo/bar

2
यह भी में काम करता है kshऔर zsh
mr.spuratic

1
हालांकि मैंने इस उत्तर को उकेरा है क्योंकि इसका सबसे आसान तरीका है, यहाँ एक छोटा सा चेतावनी है: अंदर / tmp / home / username, यह वापस आएगा / tmp ~। मुझे इसे ठीक करने के लिए $ HOME से पहले एक कैरेट चिन्ह डालने का कोई तरीका नहीं मिल रहा है। यदि आपको अपने समाधान की आवश्यकता है, तो इसका सही उपयोग न करें ...
0fnt

1
@ user18151, इस ओर इशारा करने के लिए आप से। मैंने ${string/#substring/replacement}इस व्यवहार को रोकने के लिए अपने उत्तर को संस्करण में बदल दिया ।
Nyakakin

1
@ mr.spuratic यह केवल सही है (उपयोग के लिए छोड़कर echo) zsh। अन्य गोले में, $HOMEएक पैटर्न के रूप में माना जाएगा और पूरी चीज विभाजित + ग्लोब के अधीन होगी।
स्टीफन चेजलस

टिल्ड से बचकर ('~') ने चाल चली। ध्यान दें कि \ ~ भी काम करता है। यह सुविधाजनक है जब पहले से ही '-context: eg,PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"'
Atafar

7

का उपयोग कर sed:

pwd | sed "s|^$HOME|~|"

यह विचार किसी भी चरित्र का उपयोग करने के लिए है जो sedरेगेक्स में सीमांकक के रूप में एक घर निर्देशिका पथ में प्रकट होने की संभावना कम है । ऊपर दिए गए उदाहरण में मैं उपयोग कर रहा हूं |

इस तकनीक के बारे में अच्छी बात यह है कि यह वास्तव में शेल-स्वतंत्र है।

आप इस व्यवहार को अन्य स्क्रिप्ट्स में प्राप्त pwdकरने के /bin/pwd | sed "s|$HOME|~|"लिए भी अन्य नाम दे सकते हैं जो उपयोग कर रहे हैं pwd


2
आपको ^अपने रेगेक्स में एंकर को शामिल करने की आवश्यकता है । अन्यथा, पथ के बीच में एक खंड को बदलने के लिए इसके लिए (हालांकि संभावना नहीं है) संभव है।
सिल्डोरेथ

वास्तव में रेगेक्स इस प्रकार दिखना चाहिए "s|^/home/user\(/.*\)\?$|~\1|"। अन्यथा यह अन्य उपयोगकर्ताओं के पथ से मेल खाता है, तो उनके नाम की तरह हैं user1, user2, user3और तुम सिर्फ मेल खाते हैंuser
AVP

3
tilde=\~${PWD#~}

मुझे लगता है कि आप क्या चाहते हैं?

टिल्ड के बारे में क्या साफ है जब इसे एक पैटर्न के रूप में विस्तारित किया जाता है तो इसे उद्धृत करने की आवश्यकता नहीं होती है। $HOMEबिना उद्धरण के उसी तरह का उपयोग अप्रत्याशित परिणामों को प्रस्तुत करेगा क्योंकि इसका कोई भी घटक वर्ण पैटर्न वर्ण हो सकता है, और इसलिए यह हमेशा अपेक्षित परिणाम प्रस्तुत नहीं कर सकता है।

लेकिन टिल्ड विस्तार हमेशा अनुमान होता है जैसे कि यह एक उद्धृत विस्तार का परिणाम था, और इसलिए इसके परिणाम अनुमानित हैं। ऐसा लगता है कि व्यावहारिक रूप से प्रत्येक शेल को मैंने अपने caseपैटर्न और पैरामीटर पैटर्न दोनों के लिए उल्लेखनीय अपवादों के साथ ksh93और दोनों mkshकारणों से परीक्षण किया है - जिनमें से कोई भी उस क्षमता में टिल्ड के उद्धृत पहलू का सम्मान नहीं करता है।

इसके बारे में एक और साफ बात यह है कि आप $HOMEकिसी भी डायरेक्टरी को एक ही अंदाज में संभालने के लिए फिर से परिभाषित कर सकते हैं । उदाहरण के लिए:

cd ~
HOME=/some/prefix/I/would/like/to/trim 
#or, perhaps more usefully, some scripted means of arriving at same
tilde=\~${OLDPWD#~}
HOME=$PWD

यहाँ एक और उदाहरण है:

set 1 2 3 4 5 \~
cd ~; cd -; HOME= IFS=/
for d do shift
      HOME=${*#~/}/$d
      set ~ "$d" $HOME
done; cd -; HOME=$PWD
printf %s\\n "$@"
5/4/3/2/1/2/3/4/5/~/1/2/3/4/5/~
~
5
4
3
2
1
2
3
4
5
~
1
2
3
4
5
~

1
यह वास्तव में एक दिलचस्प दृष्टिकोण है। लेकिन यह $PWDमाना जाता है कि इसके अंतर्गत है $HOME। आप इसे अधिक सामान्य बनाने के लिए पैटर्न प्रतिस्थापन के साथ संयुक्त एक ही विचार का उपयोग कर सकते हैं। कैसे है ${PWD/#~/\~}?
मिकेल

1
वास्तव में Nyakakin का उत्तर मूल रूप से यही है।
मिकेल

0

आप अवांछित भाग को बदलने का प्रयास कर सकते हैं sed:

pwd | sed 's,^/data/users/me,~,'

या इससे भी बेहतर:

pwd | sed "s,^$HOME,~,"

1
आपको ^यह सुनिश्चित करने के लिए लंगर का उपयोग करने की आवश्यकता है कि निर्देशिका पथ की शुरुआत में केवल मैचों को प्रतिस्थापित किया जाए। इसके अलावा, आपको उपयोग करने की आवश्यकता नहीं है gक्योंकि कमांड को 1 घटना की जगह पर होना चाहिए।
सिल्डोरेथ

धन्यवाद। मैं अभी भी यह चीजें सीख रहा हूं और आप टिप्पणी करना वास्तव में उपयोगी है।
user1403360

यदि मेरी होम डाइरेक्टरी है /home/aliceऔर मेरी वर्तमान डायरेक्ट्री है तो समस्याग्रस्त है /home/aliceinchains। लेकिन अगर मैं कभी भी इस सुविधा का उपयोग करना चाहता हूं, जब मुझे पता है कि मैं अपनी होम डायरेक्टरी हूं या इसकी एक उपनिर्देशिका हूं, तो यह काम करना चाहिए।
मिहाई डैनिला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.