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 1trap을 사용하여 현재 명령을 추가합니다 .

# 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.