현재 터미널 탭 제목을 변경하는 다음 스크립트를 찾았습니다.
#!/usr/bin/env bash
T=$1
ORIG=$PS1
TITLE="\e]2;$T\a"
PS1=${ORIG}${TITLE}
echo "Terminal tab title changed to $T"
터미널에 직접 입력하면 제대로 작동합니다(예: TITLE="\e]2;HELLO\a"
).
그러나 쉘 스크립트(rename.sh)에서는 $PS1이 비어 있고 스크립트가 작동하지 않습니다.
rename.sh HELLO 는 출력되지만 "Terminal tab title changed to HELLO"
터미널 제목은 변경되지 않습니다. $PS1 스크립트는 내부적으로 비어 있습니다.
누구든지 내가 이것을 이해하도록 도와줄 수 있나요?
답변1
xterm
스크립트는 창 제목을 조작하기 위한 제어 코드가 포함된 문자열에 쉘의 대화형 프롬프트를 설정하여 작동합니다 . 쉘의 프롬프트가 표시될 때마다 창 제목을 변경하는 제어 코드가 출력됩니다.
그러나 물론 스크립트 내부에는 대화형 프롬프트가 표시되지 않으므로 이러한 명령은 눈에 띄는 효과가 없습니다(비록 스크립트 내에서 다른 대화형 셸을 실행하면 창 제목이 변경되는 것을 볼 수 있지만). 그리고 어떤 스크립트도 상위 프로세스의 환경을 변경할 수 없으므로 스크립트가 종료되면 변경 사항이 손실됩니다.
어쨌든 스크립트에서 제어 코드를 직접 인쇄할 수도 있습니다.
printf '\033]2;Hello\a'
이렇게 하면 창 제목이 한 번 변경되지만 나중에 다른 프로그램에서 다시 변경하면 이전 제목이 손실됩니다. 과거의 일부 인기 프로그램에서는 원하는 대로 창 제목을 변경하자마자 창 제목을 변경하는 경우가 많았기 때문에 프롬프트를 변경하는 방법은 일반적입니다(비록 이것이 더 이상 일반적인 문제는 아니라고 생각하지만). 단점은 창 제목을 변경해야 하는 실제 이유가 있는 경우 쉘에 프롬프트가 다시 표시되면 변경 사항이 대체된다는 것입니다.
코드에서 현재 셸의 프롬프트를 변경하려면 이를 일반 스크립트에 넣을 수 없지만 source
스크립트 파일을 사용하거나 명령을 셸 함수(일반적으로 Bash 구성 파일에서 수행)에 넣을 수 있습니다. 지속되게 만드세요 ).
그런데 프롬프트의 표시 너비를 계산하는 측면에서 Bash 프롬프트에는 프롬프트의 일부가 실제로 너비가 0일 때 Bash에게 알려주는 추가 제어 코드가 포함되어야 합니다. 예를 들어 긴 명령을 입력한 후 백스페이스를 수행해야 하는 경우 줄 바꿈이 불규칙하다는 것을 알게 됩니다. Bash는 프롬프트를 다시 그리려고 시도하지만 화면 제어 코드가 너비에 영향을 미친다고 생각하기 때문에 잘못된 위치에 있습니다. 프롬프트. 이들 \[
과 그 주위에 Bash 제어 코드를 추가해야 합니다 \]
.
PS1="$ORIG\[$TITLE\]"
(중괄호는 실제로 어떤 목적으로도 사용되지 않고 가독성을 방해하므로 제거했습니다.)
답변2
이 변수는 PS1
대화형 셸에서만 사용되며, 이에 액세스하려면 bash -i rename.sh
.
최소한의 예:
$ echo 'echo $PS1' > test
그런 다음 비교
$ bash test
$ bash -i test
스크립트를 실행 파일로 직접 실행하려면 초기 줄에 다음을 추가하세요.
#!/bin/bash -i
알아채다./rename.sh
이는 를 사용하는 대신 chmod를 직접 실행하고 스크립트(예: )를 실행하는 경우에만 작동합니다 . 그렇지 않으면 다시 호출 bash rename.sh
해야 합니다 .bash -i rename.sh
편집하다
터미널 제목을 직접 변경하려면 제어 코드를 직접 에코하면 됩니다. 노력하다
echo -e '\033]2;SomeTitle\007'
또는 스크립트 내에서 변수를 사용하십시오.
title="SomeTitle"
echo -e '\033]2;'$title'\007'