현재 실행 중인 명령과 현재 경로 간에 Xterm 창 제목을 전환하려면 어떻게 해야 합니까?

현재 실행 중인 명령과 현재 경로 간에 Xterm 창 제목을 전환하려면 어떻게 해야 합니까?

두 가지 상태 사이를 전환하기 위해 Xterm 창 제목을 설정하고 싶습니다:

  • 명령이 실행되면 명령 이름을 표시합니다(예: "less")
  • 실행 중인 명령이 없으면 현재 경로를 표시합니다(예: "src")

현재 경로를 사용하여 Xterm 창 제목을 만들 수 있습니다.

$ export PROMPT_COMMAND='echo -ne "\033]0;`basename ${PWD}`\007"'

내가 보여줄 수 있어현재 실행 중인 명령trap문 을 추가하면 다음과 같습니다 .bashrc.

$ trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG

하지만 둘 사이를 자동으로 전환할 수는 없습니다. 가능합니까?

편집하다:@테덴일반 xterm에서 작동하는 솔루션을 보여줍니다. 정말 멋집니다! 하지만 제가 MacOSX Terminal.app을 사용한다는 사실은 언급하지 않았습니다. 명령이 실행되지 않으면 현재 경로 대신 "bash"가 계속 표시되는 것으로 표시됩니다. 좀 만져봐이 문제를 해결하는 방법을 알아냈습니다..

답변1

$BASH_COMMAND설정되어 있는지 확인하고 설정되어 있지 않으면 CWD를 인쇄하는 기능을 사용하면 가능합니다. 다음 줄을 다음 항목에 추가하세요 ~/.bashrc.

trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG
function show_name(){ 
    if [[ -n "$BASH_COMMAND" ]]; 
    then 
    echo -en "\033]0;`pwd`\007"; 
    else 
    echo -en "\033]0;$BASH_COMMAND\007"; 
    fi 
}
export PROMPT_COMMAND='show_name'

이렇게 하면 터미널 이름이 현재 실행 중인 명령(있는 경우) 또는 현재 디렉터리(없는 경우)가 됩니다. 명령을 여러 번 실행하는 긴 루프를 실행하면 약간 정신분열적인 터미널이 발생한다는 점을 명심하세요. while true; do echo foo; done예를 들어 시도해 보세요.

(zsh원천) 루프를 올바르게 처리합니다.

case $TERM in
    xterm*)
      preexec () {
        print -Pn "\e]0;$*\a"
      }
    ;;
esac

답변2

나는 깨달았다MacOSX Terminal.app에서 .bashrc를 읽을 수 없습니다.. 도움을 받아문자열의 첫 번째 단어를 추출하는 방법약간의 수정을 가해 조정했습니다.@terdon 좋은 답변입니다다음을 추가하십시오 .bash_profile.

trap 'echo -ne "\033]0;${BASH_COMMAND%% *}\007"' DEBUG

function show_name { 
    if [[ -n "$BASH_COMMAND" ]]; then
      echo -en "\033]0;`basename ${PWD}`\007"
    fi 
}
export PROMPT_COMMAND='show_name'

바라보다! 그것은 매력처럼 작동합니다.

관련 정보