वर्तमान निर्देशिका में टर्मिनल विंडो का शीर्षक सेट करें


71

मैं अपनी विंडो या टैब शीर्षक में वर्तमान निर्देशिका को प्रदर्शित करने के लिए OS X में Terminal.app कैसे प्राप्त कर सकता हूं?

मैं बैश शेल का उपयोग कर रहा हूं।


मुझे हमेशा आश्चर्य होता है कि सवाल का जवाब देने वाले लोग भी इसे वोट करना क्यों नहीं भूलते।
cregox

जवाबों:


60

अपने खोल पर निर्भर करता है।

यह लेख कई तरीकों को प्रदर्शित करता है।

मैं व्यक्तिगत रूप से zsh का उपयोग करता हूं जिसमें एक सुविधाजनक प्रीमॉड () फ़ंक्शन है जो प्रत्येक प्रॉम्प्ट से पहले चलाया जाता है।

    precmd () { print -Pn "\e]2;%n@%M | %~\a" } # title bar prompt

यद्यपि अन्य प्रश्न बाश विधियों को सूचीबद्ध करते हैं, वे उर्फ ​​सीडी। बैश एक अंतर्निहित विधि प्रदान करता है जो सिर्फ संकेत देता है।

दे घुमा के

बैश एक चर PROMPT_COMMAND की आपूर्ति करता है जिसमें प्रॉम्प्ट से पहले निष्पादित करने के लिए एक कमांड होता है। यह उदाहरण (~ / .bashrc में डाला गया) "उपयोगकर्ता नाम @ होस्टनाम: निर्देशिका" शीर्षक सेट करता है।

 PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

जहाँ ESC के लिए \ 033 चरित्र कोड है, और BEL के लिए \ _7। ध्यान दें कि यहां उद्धरण महत्वपूर्ण है: चर "..." में विस्तारित हैं, और '...' में विस्तारित नहीं हैं। इसलिए PROMPT_COMMAND को एक अनएक्सपैंडेड वैल्यू पर सेट किया गया है, लेकिन PROMPT_COMMAND का उपयोग किए जाने पर "..." के अंदर चर का विस्तार किया जाता है।

हालाँकि, PWD पूर्ण निर्देशिका पथ का निर्माण करता है। यदि हम '~' शॉर्टहैंड का उपयोग करना चाहते हैं, तो हमें प्रॉम्प्ट में एस्केप स्ट्रिंग को एम्बेड करना होगा, जो हमें शेल द्वारा प्रदान किए गए निम्नलिखित त्वरित विस्तार का लाभ उठाने की अनुमति देता है:

\u          expands to $USERNAME
\h          expands to hostname up to first '.'
\w          expands to directory, replacing $HOME with '~'
\[...\]     embeds a sequence of non-printing characters

इस प्रकार, निम्नलिखित "बैश $" का संकेत देता है, और "उपयोगकर्ता नाम @ होस्टनाम: निर्देशिका" का एक xterm शीर्षक ...

 case $TERM in
     xterm*)
        PS1="\[\033]0;\u@\h: \w\007\]bash\$ "
        ;;
     *)
        PS1="bash\$ "
        ;;
 esac

[...] के उपयोग पर ध्यान दें, जो प्रॉम्प्ट की चौड़ाई की गणना करते समय गैर-मुद्रण नियंत्रण वर्णों को अनदेखा करने के लिए बैश बताता है। अन्यथा लाइन एडिटिंग कमांड कर्सर रखते समय भ्रमित हो जाते हैं।


उल्लेख किया जाना चाहिए मैं बैश का उपयोग कर रहा हूं, मैंने सवाल अपडेट किया है।
करीमन

सूचीबद्ध लिंक से बैश विधि को जोड़ा गया।
डैरेन हॉल

1
बहुत अच्छा। शीर्षक में केवल वर्तमान निर्देशिका का पथ और प्रॉम्प्ट में वर्तमान निर्देशिका का नाम प्राप्त करने के लिए मैंने पीएस 1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $ का उपयोग किया।"
करीमन

1
"अगर हम '~' शॉर्टहैंड का उपयोग करना चाहते हैं, तो हमें प्रॉम्प्ट में एस्केप स्ट्रिंग को एम्बेड करना होगा" आप पूर्ण होम निर्देशिका पथनाम को बदलने के लिए निम्नलिखित का उपयोग कर सकते हैं: $ {PWD / # $ {HOME} / \ ~}।
क्रिस पेज

1
@MattTagg ज़रूर, आपको बस इसे ~/.profileदूरस्थ मशीन पर अपनी (या समतुल्य) फ़ाइल में डालने की आवश्यकता है ।
coredumperror

31

फ़ाइल में कॉपी और पेस्ट ~ / .profile:
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

यह वर्तमान टर्मिनल टैब का शीर्षक उस फ़ोल्डर के नाम पर सेट करेगा, जिसमें आप हैं (संपूर्ण पथ नहीं)।
तो ...
Developer/Applications/Utilities/Bluetooth/=> बन जाता हैBluetooth


3
Mavericks पर फ़ाइल को संपादित करने के लिए ~ / .bash_profile
Tom

11

मैक ओएस एक्स लायन 10.7 के रूप में, टर्मिनल में वर्किंग डायरेक्टरी को सेट करने के लिए एक स्पष्ट एस्केप सीक्वेंस है, जो टर्मिनल मानक विंडो "प्रॉक्सी" आइकन का उपयोग करके प्रदर्शित करता है। यह आपको मार्ग देखने, खोजक में प्रकट करने, या किसी अन्य फ़ोल्डर की तरह खींचने के लिए कमांड-क्लिक करने में सक्षम करता है। इसके अलावा, टर्मिनल एक ही निर्देशिका में एक और टर्मिनल बनाने के लिए इसका उपयोग कर सकता है, और टर्मिनल को फिर से शुरू / पुनरारंभ करने (जब रिज्यूमे सक्षम होता है) को काम करने वाली निर्देशिका को पुनर्स्थापित करने के लिए। यह विंडो समूहों के लिए निर्देशिकाओं को पुनर्स्थापित करने में भी सक्षम बनाता है।

यह एक ही ऑपरेटिंग सिस्टम कमांड (OSC) विंडो और टैब टाइटल के लिए एस्केप सीक्वेंस है, लेकिन पहले पैरामीटर के साथ 7 पर सेट किया गया है। वैल्यू में "फाइल:" URL होना चाहिए, जो प्रतिशत-एन्कोडिंग विशेष वर्णों को सक्षम करता है ताकि यह हैंडल हो सके सभी वैध मार्ग। आपको होस्टनाम भी शामिल करना चाहिए ताकि टर्मिनल यह निर्धारित कर सके कि क्या यह एक स्थानीय निर्देशिका है; यदि यह किसी भिन्न होस्ट से है, तो टर्मिनल इसे वर्तमान कार्य निर्देशिका के रूप में उपयोग करने से बचाएगा।

संबंधित नोट पर, टर्मिनल समान रूप से 6. के एक पैरामीटर के साथ OSC एस्केप अनुक्रम का उपयोग करके "प्रतिनिधित्व फ़ाइल" सेट करने का समर्थन करता है। यदि सेट किया गया है, तो प्रॉक्सी आइकन कार्यशील निर्देशिका के बजाय इसे प्रदर्शित करेगा। उदाहरण के लिए, मेरे पास प्रॉक्सी आइकन में वर्तमान में प्रदर्शित फ़ाइल / बफर को प्रतिबिंबित करने के लिए ईमैक्स और कम कॉन्फ़िगर है। यह इन tty- आधारित कार्यक्रमों को आसपास के OS के साथ अधिक एकीकृत करने में सक्षम बनाता है।

कार्य निर्देशिका व्यवहार को डिफ़ॉल्ट रूप से bash (Mac OS X पर डिफ़ॉल्ट शेल) के लिए सक्षम किया जाता है। संबंधित कोड के लिए / etc / bashrc देखें।

यह शायद यह भी ध्यान देने योग्य है कि लायन टर्मिनल अब ओएससी एस्केप अनुक्रम का उपयोग करके विंडो शीर्षक से स्वतंत्र रूप से टैब शीर्षक स्थापित करने का समर्थन करता है।


update_terminal_cwdसमारोह वर्तमान कार्यशील निर्देशिका करने के लिए प्रॉक्सी आइकन सेट हो जाएगा। डिफ़ॉल्ट रूप से $PROMPT_COMMANDहै update_terminal_cwd
jtbandes

@jtbandes वह है जिसका मैं तब उल्लेख कर रहा था जब मैंने लिखा था "कार्यशील निर्देशिका व्यवहार को डिफ़ॉल्ट रूप से bash के लिए सक्षम किया गया है ..."।
क्रिस पेज

हां। मैंने अभी पता लगाया कि यह कैसे काम करता है और सोचा कि यह भविष्य के गोगलर्स के लिए उपयोगी हो सकता है!
jtbandes

3

इसके अलावा सिफारिश करने से आप एप्पल टर्मिनल विशिष्ट ऑपरेटिंग सिस्टम कमान एस्केप अनुक्रम का उपयोग करें: ESC ] Ps ; Pt BELजहां Psहै 7और Ptएक है file:यूआरएल; यह जोड़ने योग्य है कि मैक ओएस एक्स 10.11 में (और शायद 10.7 के बाद से) एक फाइल है /etc/bashrc_Apple_Terminal(10.11 के तहत अनएडिटेबल) जो सुविधाजनक update_terminal_cwd()(टिप्पणियों के बिना ) को परिभाषित करती है :

update_terminal_cwd () 
{ 
    local url_path='';
    { 
        local i ch hexch LC_CTYPE=C LC_ALL=;
        for ((i = 0; i < ${#PWD}; ++i))
        do
            ch="${PWD:i:1}";
            if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
                url_path+="$ch";
            else
                printf -v hexch "%02X" "'$ch";
                url_path+="%${hexch: -2:2}";
            fi;
        done
    };
    printf '\e]7;%s\a' "file://$HOSTNAME$url_path"
}

यदि आप ऐसा करने के बारे में सोच रहे थे, तो आप अपने रिमोट बॉक्स पर भी इसका इस्तेमाल कर सकते थे और फिर अपने URL को bash में फाइल URL को सही तरीके से स्क्रैच करने पर कर सकते थे।

और अगर आप PROMPT_COMMANDअपने आप में बदल जाते हैं .bash_profileया .bashrcआप इसे कॉल करना भूल जाते हैं। उसी फ़ाइल में वे इसके साथ थोड़ा बेहतर तरीके से पीछा करने का एक उदाहरण दिखाते हैं:

PROMPT_COMMAND="update_terminal_cwd${PROMPT_COMMAND:+; $PROMPT_COMMAND}"

व्यक्तिगत रूप से मेरे मन .bash_profileमें जीआईटी प्रॉम्प्ट जोड़ना चाहता था इसलिए मैंने ऐसा किया:

local git_path=/Applications/Xcode.app/Contents/Developer/usr/share/git-core
for f in $git_path/git-completion.bash $git_path/git-prompt.sh
do
  if [[ -f "$f" ]]; then
    . "$f"
  fi
done
get_sha() {
    git rev-parse --short HEAD 2>/dev/null
}
if [ "function" = $(type -t __git_ps1) ]; then
    export GIT_PS1_SHOWDIRTYSTATE=1
    GIT_PS1_SHOWSTASHSTATE=1
    GIT_PS1_SHOWUNTRACKEDFILES=1
    GIT_PS1_SHOWCOLORHINTS=1
    GIT_PS1_DESCRIBE_STYLE="branch"
    GIT_PS1_SHOWUPSTREAM="auto git"
    export PROMPT_COMMAND="$PROMPT_COMMAND${PROMPT_COMMAND:+; }"'__git_ps1 "\[\e[0;32m\]\u\[\e[1;32m\]@\h\[\e[0m\]:\[\e[0;34m\]\w\[\e[0m\]" "\$ " "\n{%s $(get_sha)}"'
fi

1

यदि पीएस 1 और PROMPT_COMMAND से जुड़े बैश समाधान दोनों विफल हो जाते हैं, तो निर्देशिका में यूनिकोड वर्ण हैं (कम से कम हिम तेंदुए पर)। सबसे अच्छा समाधान मैं कर सकता था के बराबर करने के लिए

PS1="\[\033]0;\`pwd | tr -dC '[\000-\177]'\`\007\]\$ "

दुर्भाग्य से यह सीधे काम नहीं करता है, इसलिए मैंने trकॉल करने के लिए शेल फ़ंक्शन को परिभाषित किया :

termtitlefilter () { tr -dC '[\000-\177]'; }
PS1="\[\033]0;\`pwd | termtitlefilter\`\007\]\$ "

यह लैटिन उच्चारणों के लिए अच्छी तरह से काम करता है, जो यूनिकोड एनएफडी में होगा (उच्चारण गायब हो जाएगा लेकिन अंतर्निहित लैटिन चरित्र रहेगा)।

दुर्भाग्य से, यह चीनी जैसी चीजों के लिए पूरी तरह से विफल हो जाएगा।


मैक ओएस एक्स लायन 10.7 के रूप में, टर्मिनल में कार्यशील निर्देशिका को स्थापित करने के लिए स्पष्ट रूप से भागने का क्रम है। यह एक URL का उपयोग करता है, इसलिए आप विशेष वर्णों के लिए प्रतिशत-एन्कोडिंग का उपयोग कर सकते हैं और सभी मान्य पथनामों का समर्थन कर सकते हैं। विवरण के लिए इस प्रश्न का मेरा उत्तर देखें।
क्रिस पेज

1

मान लें कि आप डिफ़ॉल्ट मैक टर्मिनल का उपयोग कर रहे हैं, तो आप निम्नलिखित में से एक का उपयोग कर सकते हैं। जब से आप एक नया टैब खोलते हैं, तो "set_prompt" अपने आप को रूट फ़ोल्डर में भेज सकता है:

set_prompt () {
    BASE_PATH="${PWD##*/}"
    echo -ne "\033]0;$BASE_PATH\007"
}
set_my_tab () {
   update_terminal_cwd
   set_prompt
}

PROMPT_COMMAND=set_my_tab

0

इसे अपनी ~ / .profile या समकक्ष फ़ाइल में दर्ज करें:

function settitle() { echo -n "]0;$@"; }
function cd() { command cd "$@"; settitle `pwd -P`; }

export PS1='\W \$ '

settitle `pwd`

पहली पंक्ति में दो विशेष वर्ण हैं जिन्हें कॉपी / पेस्ट नहीं किया जा सकता है, लेकिन आप यहां से पाठ डाउनलोड कर सकते हैं: http://blog.nottoobadsoftware.com/files/setterminaltitle.sh


1
"पहली पंक्ति में दो विशेष वर्ण हैं जिन्हें कॉपी / पेस्ट नहीं किया जा सकता" उपयोग echoकरने के बजाय printf, जो आपको भागने के दृश्यों के साथ उन पात्रों (ईएससी और बीईएल / कंट्रोल-जी) को व्यक्त करने की अनुमति देता है:printf '\e]0;$@\a"
क्रिस पेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.