터미널 창 제목을 현재 디렉토리로 설정하십시오.


71

OS X의 Terminal.app에서 창이나 탭 제목에 현재 디렉토리를 표시하려면 어떻게합니까?

나는 bash 쉘을 사용하고있다.


나는 항상 질문에 대답하는 사람들조차도 투표를 기억하지 않는 이유에 대해 항상 궁금해합니다.
2010

답변:


59

당신의 껍질에 달려 있습니다.

기사 에서는 여러 가지 방법을 보여줍니다.

개인적으로 각 프롬프트 앞에 실행되는 편리한 precmd () 함수가있는 zsh를 사용합니다.

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

다른 질문에는 bash 메소드가 나열되어 있지만, cd에는 별칭이 붙습니다. Bash는 프롬프트를 연결하는 고유 한 방법을 제공합니다.

세게 때리다

bash는 프롬프트 앞에 실행될 명령을 포함하는 PROMPT_COMMAND 변수를 제공합니다. 이 예제 (~ / .bashrc에 삽입 됨)는 제목을 "username @ hostname : directory"로 설정합니다.

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

여기서 \ 033은 ESC의 문자 코드이고 BEL은 \ 007입니다. 인용 부호는 여기에서 중요합니다 : 변수는 "..."로 확장되고 '...'에는 확장되지 않습니다. 따라서 PROMPT_COMMAND는 확장되지 않은 값으로 설정되지만 PROMPT_COMMAND가 사용될 때 "..."안의 변수가 확장됩니다.

그러나 PWD는 전체 디렉터리 경로를 생성합니다. 우리가 '~'단축키를 사용하고자한다면 프롬프트에 escape 문자열을 삽입해야합니다. 그러면 쉘이 제공하는 다음과 같은 프롬프트 확장을 이용할 수 있습니다 :

\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

따라서 다음은 "bash $"프롬프트와 "username @ hostname : directory"라는 xterm 제목을 생성합니다.

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

프롬프트의 너비를 계산할 때 비 인쇄 제어 문자를 무시하도록 bash에 알려주는 [...]의 사용에 유의하십시오. 그렇지 않으면 커서를 놓는 동안 줄 편집 명령이 혼란스러워집니다.


bash를 사용하고 있다고 언급 했어야하는데, 나는 질문을 업데이트했다.
2908 kareman

나열된 링크에서 bash 메소드를 추가했습니다.
대런 홀

1
아주 좋아. 프롬프트에서 현재 디렉토리의 제목과 현재 디렉토리 이름 만 가져 오려면 PS1 = "\ [\ 033] 0; \ w \ 007 \] \ W \ $"을 사용했습니다.
2908 kareman

1
"우리가 '~'단축키를 사용하려면 프롬프트에 이스케이프 문자열을 삽입해야합니다. 다음을 사용하여 전체 홈 디렉토리 경로 이름을 물결 표시로 바꿀 수 있습니다 : $ {PWD / # $ {HOME} / \ ~}
크리스 페이지

1
@MattTagg 물론, 당신은 단지 ~/.profile원격 컴퓨터의 자신의 (또는 동등한) 파일에 넣기 만하면 됩니다.
CoreDumpError (CoreDumpError),

31

~ / .profile 파일에 복사하여 붙여 넣기 :
PROMPT_COMMAND="echo -ne \"\033]0;${PWD##*/}\007\"; $PROMPT_COMMAND"

그러면 현재 터미널 탭의 제목이 현재 폴더의 이름으로 설정됩니다 (전체 경로가 아님).
그래서 ...
Developer/Applications/Utilities/Bluetooth/= =>Bluetooth


3
편집자가 편집 할 파일은 ~ / .bash_profile입니다.
Tom

11

Mac OS X Lion 10.7에서 Terminal에는 표준 디렉토리 "proxy"아이콘을 사용하여 터미널이 표시하는 작업 디렉토리 설정을위한 명시적인 이스케이프 시퀀스가 ​​있습니다. 이렇게하면 Command- 클릭하여 경로를 보거나 Finder에 표시하거나 다른 폴더처럼 끌 수 있습니다. 또한 터미널은이 명령을 사용하여 동일한 디렉토리에 다른 터미널을 만들고 터미널을 종료 / 다시 시작할 때 (다시 시작이 활성화 된 경우) 작업 디렉터리를 복원 할 수 있습니다. 또한 창 그룹에 대한 디렉토리를 복원 할 수 있습니다.

윈도우 및 탭 제목과 동일한 운영 체제 명령 (OSC) 이스케이프 시퀀스이지만 첫 번째 매개 변수는 7로 설정됩니다.이 값은 백분율 인코딩 특수 문자로 처리 할 수있는 "file :"URL이어야합니다 모든 유효한 경로 이름. 터미널이 로컬 디렉토리인지 여부를 결정할 수 있도록 호스트 이름도 포함시켜야합니다. 터미널은 다른 호스트의 터미널을 현재 작업 디렉토리로 사용하지 않습니다.

관련 노트에서 터미널은 마찬가지로 매개 변수 6을 사용하여 OSC 이스케이프 시퀀스를 사용하여 "표현 된 파일"을 설정하는 것을 지원합니다. 설정하면 프록시 아이콘이 작업 디렉토리 대신이 파일을 표시합니다. 예를 들어, 필자는 이맥스가 있고 프록시 아이콘에 현재 표시된 파일 / 버퍼를 반영하도록 덜 구성되었습니다. 이렇게하면 이러한 tty 기반 프로그램을 주변 OS와보다 통합 할 수 있습니다.

작업 디렉토리 비헤이비어는 기본적으로 bash (Mac OS X의 기본 쉘)에서 사용 가능합니다. 관련 코드는 / etc / bashrc를 참조하십시오.

또한 Lion Terminal이 이제 OSC 이스케이프 시퀀스를 사용하여 창 제목과 별도로 탭 제목을 설정하는 것을 지원한다는 점을 언급 할 필요가 있습니다.


update_terminal_cwd함수는 프록시 아이콘을 현재 작업 디렉토리로 설정합니다. 기본적으로 $PROMPT_COMMAND입니다 update_terminal_cwd.
jtbandes

@jtbandes 그게 내가 "작업 디렉토리 동작은 기본적으로 bash에 대해 활성화되어 있습니다 ..."라고 말했던 때입니다.
Chris Page

네. 방금 작동하는 방식을 발견하고 미래의 Google 직원에게 유용 할 거라고 생각했습니다.
jtbandes

3

그렇다 추천에서 당신은 애플 터미널 특정 운영 체제 명령 이스케이프 시퀀스 사용 인 및 A는 URL을; Mac OS X 10.11 (그리고 아마도 10.7 이후)에는 (코멘트가없는) 편리함을 정의 하는 파일 (10.11 이하는 편집 할 수 없음)이 추가 될 가치가 있습니다 .ESC ] Ps ; Pt BELPs7Ptfile:/etc/bashrc_Apple_Terminalupdate_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"
}

원격 저장소에서도이 방법을 사용할 수 있습니다. 그렇게하고 싶다면 bash에서 파일 URL을 올바르게 인코딩 할 때 머리를 찰칵 수 있습니다.

그리고 PROMPT_COMMAND혼자서 바꾸 .bash_profile거나 .bashrc전화를하는 것을 잊어 버릴 수도 있습니다. 같은 파일에서 그것들을 조금 더 잘 묶는 예제를 보여줍니다 :

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

개인적으로 .bash_profile나는 git 프롬프트를 추가하고 싶었 기 때문에 이렇게했다.

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

디렉토리에 유니 코드 문자가 있다면 PS1과 PROMPT_COMMAND를 포함한 Bash 솔루션은 실패합니다 (적어도 Snow Leopard에서는). 내가 얻을 수있는 최선의 해결책은

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

불행히도 이것은 직접 작동하지 않으므로 대신 쉘 함수를 정의하여 tr호출 을 수행합니다 .

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

이것은 유니 코드 NFD (악센트는 사라지지만 기본 라틴 문자는 그대로 유지됩니다)에있는 라틴 악센트에서는 잘 작동합니다.

불행하게도, 그것은 중국어 같은 것들에 대해 완전히 실패 할 것입니다.


Mac OS X Lion 10.7에서 Terminal에는 작업 디렉토리 설정을위한 명시적인 이스케이프 시퀀스가 ​​있습니다. URL을 사용하므로 특수 문자에 백분율 인코딩을 사용하고 모든 유효한 경로 이름을 지원할 수 있습니다. 자세한 내용은이 질문에 대한 내 대답을 참조하십시오.
크리스 페이지

1

기본 MAC 터미널을 사용한다고 가정하면 새 탭을 열 때 "set_prompt"자체가 루트 폴더로 사용자를 전송할 수 있기 때문에 .profile에서 다음을 사용할 수 있습니다.

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
"첫 번째 줄에는 복사 / 붙여 넣기가 불가능한 두 개의 특수 문자가 포함되어 있습니다" echouse 를 사용 하는 대신 printf이스케이프 시퀀스로 문자 (ESC 및 BEL / Control-G)를 표현할 수 있습니다 :printf '\e]0;$@\a"
Chris Page
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.