쉘 스크립트 내에서 현재 터미널 탭 제목 변경

쉘 스크립트 내에서 현재 터미널 탭 제목 변경

현재 터미널 탭 제목을 변경하는 스크립트를 찾았습니다.

#!/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

알아채다이는 chmod를 사용하여 스크립트를 직접 실행하는 경우에만 작동하며(예: ./rename.sh), 그렇지 않으면 다시 bash rename.sh호출해야 합니다 bash -i rename.sh.

편집하다

터미널 제목을 직접 변경하려면 제어 코드를 직접 에코하면 됩니다. 노력하다

echo -e '\033]2;SomeTitle\007'

또는 스크립트 내에서 변수를 사용하여

title="SomeTitle"
echo -e '\033]2;'$title'\007'

관련 정보