현재 터미널 탭 제목을 변경하는 스크립트를 찾았습니다.
#!/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'