xterm 제목 표시 줄에 명령 표시


23

내 배시 프롬프트는 현재 다음 순서로 xterm 제목 표시 줄을 설정하고 있습니다.

PS1='\033]0;\u@\h>\w\007'

제목 표시 줄에 현재 명령을 표시하는 쉬운 방법이 있습니까? 예를 들어,을 사용하여 파일을 마무리하는 경우 tail -f foo.log제목 표시 줄을 말하고 싶습니다 tail -f foo.log.

답변:


16

기본적으로 다음이 필요합니다.

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

당신의 .bashrc또는 유사한 끝에 . 이 문제를 해결하는 데 시간이 걸렸습니다. 자세한 내용은 여기 를 참조하십시오 :)


이 솔루션 simon에 감사합니다! 그러나 이것을 .bashrc내 쉘의 각 명령 뒤에 추가 하면이 출력이 나타납니다 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. trap 명령을 PS1? 로 할당하여이 출력을 억제 할 수 있다고 가정합니다 . 그러나 PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG작동하지 않습니다. 오류가 발생 bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found합니다.
— orschiro

BTW, 방금 stackoverflow.com/questions/48407130/…을 보냈으며,이 조언이 적용된 결과로 추정됩니다. 트랩은 stdout이 아닌 stderr 또는 TTY에 직접 작성해야합니다.
— Charles Duffy

1
@orschiro, trap명령 을 별도 의 명령 으로 실행하여 PS1에 지정하지 말 것을 권장합니다 .
— Charles Duffy

12

( 이 SU 답변에서 영감을 얻음 )

몇 가지 bash 트릭을 결합 할 수 있습니다.

  • DEBUG 신호를 포착하면 각 명령이 실행되기 전에 핸들러가 호출됩니다.
  • 변수 $BASH_COMMAND는 현재 실행중인 명령을 보유

따라서 DEBUG를 트랩하고 핸들러가 제목을 $BASH_COMMAND다음 과 같이 설정하도록하십시오 .

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

이렇게하면 제목이 변경 될 때까지 제목이 변경된 상태로 유지되지만 $PS1동일한 상태를 유지하는 한 문제가되지 않습니다. 명령을 시작하면 DEBUG 핸들러가 제목 표시 줄을 변경하고 명령이 끝나면 bash가 새로운 것을 그립니다. 프롬프트하고 제목 표시 줄을 다시 재설정하십시오.

여기에 있는 유용한 팁 (SU 답변의 출처)은 다음과 같습니다.

set -o functrace

이것은 bash가 시작하는 서브 쉘에 DEBUG 트랩을 전파하게합니다. 그렇지 않으면 제목 표시 줄이 변경되지 않습니다


하아! 정확히 동시에 같은 대답! 서브 쉘 처리를 위해 +1이지만 파이프 문제에 대한 답변이 있습니까? (SO 질문에 대한 내 링크 참조)
— simon

작동하지 않습니다ssh
— 심연. 7

또한 "탭"에서 완료를 "살해"
— abyss. 7

BTW, 방금 stackoverflow.com/questions/48407130/…을 보냈으며,이 조언이 적용된 결과로 추정됩니다. 트랩은 stdout이 아닌 stderr 또는 TTY에 직접 작성해야합니다.
— Charles Duffy

/dev/ttystderr 대신에 리디렉션하는 것이 낫지 않습니까?
— Aaron Digulla

2

나는 다양한 게시물에서 내 자신의 솔루션을 해결했습니다. 이것은 사용자, 호스트 이름, pwd, tty 및 현재 실행중인 명령 (bash)을 포함하는 제목을 만듭니다.

이것은 다음과 같습니다 (명령이 실행되지 않음).

.:[user@hostname:/home/user][pts/10]:.

그리고 이와 같이 (명령을 실행) :

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

.bashrc 어딘가에서 PS1을 확장했습니다.

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

history 1 과 trap을 사용하여 현재 명령을 추가합니다 .

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

필요에 따라 자유롭게 채택하십시오.


BTW, 방금 stackoverflow.com/questions/48407130/…을 보냈으며,이 조언이 적용된 결과로 추정됩니다. 트랩은 stdout이 아닌 stderr 또는 TTY에 직접 작성해야합니다.
— Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.