शेल प्रांप्ट में संक्षिप्त निर्देशिका?


23

vim वास्तव में एक अच्छी सुविधा है जो इसे अपने रास्तों में उपयोग करता है जब वे थोड़े लंबे होते हैं:

यहाँ छवि विवरण दर्ज करें

यह शीर्ष पर टैब में दस्तावेज़ का पथ संक्षिप्त करता है। क्या ऐसा करने का कोई तरीका है जिससे मेरा बैश प्रॉम्प्ट इस तरह न दिखे:

rfkrocktk@work-laptop ~/Documents/Projects/Work/maventest/src/main/java/com/tkassembled/ $ 

2
तो, आप क्या चाहते हैं rfkrocktk@work-laptop ~/D/P/W/m/src/main/java/com/tkassembled/ $ ? आदर्श रूप से, अधिकतम शीघ्र लंबाई के लिए कुछ सीमा का उपयोग करना?
नेवसोबोट

वास्तव में, कि मैं क्या देख रहा हूँ।
नौफुली काई

ठीक है, मैंने अपना जवाब दिया।
nicerobot

जवाबों:


14

प्रयास करें इस :

PROMPT_COMMAND='PS1X=$(perl -pl0 -e "s|^${HOME}|~|;s|([^/])[^/]*/|$""1/|g" <<<${PWD})'

या, शुद्ध बैश:

PROMPT_COMMAND='PS1X=$(p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf "${q:1}")'

फिर

PS1='\u@\h ${PS1X} $ '

उत्पादन (के ~लिए नोटिस ${HOME}):

rfkrocktk@work-laptop ~/D/P/W/m/s/m/j/c/tkassembled $

मैंने अपना उत्तर @ enzotib's के लिए धन्यवाद में सुधार किया


1
क्या आप इस बात का उदाहरण प्रदान कर सकते हैं कि पोस्टपार्टी के लिए यह एक संकेत के रूप में कैसा लगेगा?
नातुल्ली काय

(०) आपका गीथूब लिंक टूट गया है। (1) आप $PWD~परीक्षण पर करीब से नज़र डालना चाहते हैं । वर्तमान में, यदि HOMEहै /home/edऔर PWDहै /home/edwina, तो आप ~winaपर्ल संस्करण ~/inaमें और शेल संस्करण में प्राप्त करते हैं। (2) आपका शेल कोड चोक हो जाता है अगर करंट डायरेक्टरी में कोई वाइल्डकार्ड (यानी, पथनाम विस्तार) अक्षर हैं; जैसे, PWD= /abc/*/def। आप इसे जोड़कर set -o noglobया ठीक कर सकते हैं set -f। … (Cont'd)
G-Man कहते हैं मोनिका '

(Cont'd)… (3) आपको लगभग इतने ब्रेसिज़ की आवश्यकता नहीं है। पर्ल कमांड में, $HOME(जो दोहरे कोट्स के अंदर है) और $PWDकाफी अच्छे हैं। शेल कमांड में, पिछले तीन खोल वैरिएबल संदर्भ ठीक हैं, लेकिन पहले तीन हो सकता है "${PWD#$HOME}", "$PWD"और "$p"। (4) mbentley का उत्तर और मेरी टिप्पणियाँ भी देखें ।
जी-मैन का कहना है कि 'मोनिका'

15

@Nicerobot उत्तर के समान, लेकिन कुछ हद तक छोटा:

PROMPT_COMMAND='pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)'
PS1='\u@\h:$pwd2\$ '

यह अनुवर्ती उदाहरण आउटपुट दिखाएगा:

enzotib@acer:/h/enzotib$ cd
enzotib@acer:/h/enzotib$ cd /usr/share/doc/acpid/examples/
enzotib@acer:/u/s/d/a/examples$

13

मुझे PROMPT_DIRTRIMबाश में पसंद है ...

export PROMPT_DIRTRIM=2

अपने उदाहरण को शीघ्र बदल देगा ...

rfkrocktk@work-laptop ../com/tkassembled/ $

इससे मेरा काम बनता है।


वह नहीं करता है जो उसने पूछा, लेकिन मुझे इस सुविधा के बारे में बताने के लिए धन्यवाद।
19

3
@nicerobot हाँ, आपके पास असली जवाब था। :) मुझे पता है कि यह वह संक्षिप्त नाम नहीं दे रहा है जो वह पूछ रहा था, लेकिन अक्सर जब हम सरल विकल्प देखते हैं तो हमारी अपेक्षाएं बदल जाती हैं। इसके अलावा, यह मानक है, और जैसा कि मैंने महसूस किया कि यह एक उल्लेख के योग्य है।
बेंटफ़एक्स

1
मुझे लगता है कि एसई के कार्यों में से एक न केवल प्रश्न का सही उत्तर प्रदान करना है, बल्कि ओपी और अन्य लोगों के लिए अन्य विकल्प प्रदान करना है जो खोज के माध्यम से प्रश्न ढूंढते हैं। मेरे द्वारा दिए गए उत्तर के संदर्भ पर ध्यान दें "मुझे पसंद है ... मेरे लिए काम करता है।" फिर भी कुछ लोगों का मानना ​​है कि यह डाउन वोट का हकदार है।
बेंटफ़एक्स

मैं जवाब देखने के लिए मतदान करता हूं जो सीधे सवाल का जवाब नहीं देते हैं लेकिन मैं आपसे सहमत हूं कि विकल्प प्रदान करना एक वैध प्रतिक्रिया या उत्तर हो सकता है ।
nicerobot

बेंटएफएक्स का जवाब ओपी के सवाल का समग्र रूप से जवाब नहीं देता है, लेकिन वास्तव में विषय शेल प्रांप्ट में संक्षिप्त निर्देशिका है? जो शायद इस विषय के अधिकांश आगंतुकों के लिए है कि वे वास्तव में क्या देख रहे हैं।
टीएनटी

4

Enzotib के उत्तर को जोड़ना , निम्नलिखित स्निपेट होगा:

  1. में कनवर्ट /Path/To/Your/Home/करें ~/(इसलिए एक पथ ~/a/b/cइसके बजाय होगा /P/T/Y/H/a/b/c)
  2. केवल डॉट दिखाने के बजाय 'डॉट फ़ाइल' के पहले अक्षर का उपयोग करें ( /a/./c/dबन जाएगा /a/.b/c/d):

    PROMPT_COMMAND='PS1_PATH=$(sed "s:\([^/\.]\)[^/]*/:\1/:g" <<< ${PWD/#$HOME/\~})'
    export PS1='\u@\h:$PS1_PATH\$ '

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


3

अपने में उपयोग के लिए प्रारूप PS1है \W(देखें PROMPTINGमें अनुभाग bashआदमी पृष्ठ)।

PS1="\u@\h \W\$ "

और आप वहां अन्य विकल्पों को पढ़ना चाह सकते हैं, आप अपनी कमांड लाइन के साथ कुछ अच्छा काम कर सकते हैं।


2
मुझे लगता है कि वह क्या पूछ रहा है, वह बिल्कुल नहीं करता।
नेवसोबोट

1
@nicerobot यह पथ के प्रत्येक घटक का पहला आरंभिक नहीं देता है, लेकिन यह वर्तमान कार्यशील निर्देशिका को छोटे रूप में देता है। मुझे पूरा यकीन है कि प्रत्येक प्रॉम्प्ट को निष्पादित किए गए कुछ बदसूरत स्क्रिप्ट का उपयोग किए बिना उस तरीके से निर्देशिका को संक्षिप्त करना संभव नहीं है। हम देखेंगे कि इस बारे में उनका क्या कहना है।
केविन

1

मुझे nicerobot के उदाहरण से आउटपुट बहुत पसंद है लेकिन मुझे एक मुद्दा मिला। मेरे पास एक निर्देशिका है जिसमें एक हाइफ़न है A-E, और यह -Eएक तर्क के रूप में देख रहा था कि printfयह मेरी वर्तमान कार्यशील निर्देशिका कब थी। इसे ठीक करने के लिए, मैंने आउटपुट --के अंतिम printfऔर जोड़े गए उद्धरणों के मामले में आउटपुट के लिए कुछ भी नहीं है:

p="${PWD#${HOME}}"; [ "${PWD}" != "${p}" ] && printf "~";IFS=/; for q in ${p:1}; do printf /${q:0:1}; done; printf -- "${q:1}"

(1) -दूसरे चरित्र के रूप में निर्देशिका नाम के मुद्दे पर अच्छी पकड़ । हालांकि यह सच है कि --शुरुआत के साथ तर्कों के मुद्दे का सामान्य समाधान है -, printfकहने के लिए एक बेहतर तरीका है printf "%s" "${q:1}", क्योंकि यह तर्क युक्त मुद्दों से भी बचाता है %। (उदाहरण के लिए, कोशिश करें PWD= /home/mbentley/Documents/Projects/Work/maventest/src/main/java/com/abc%def। (2) नेसरोबोट के उत्तर पर मेरी टिप्पणियाँ भी देखें।
जी-मैन कहते हैं, 'मोनिका'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.