프롬프트를 변경하지 않고 Cygwin에서 제목 변경

프롬프트를 변경하지 않고 Cygwin에서 제목 변경

다음 쉘 스크립트 기능이 있습니다이 웹사이트이를 통해 Putty 및 Cygwin에서 헤더를 변경할 수 있습니다. Linux 호스트에 연결된 Putty에서는 제목이 변경되고 프롬프트는 변경되지 않은 상태로 유지됩니다. 그러나 Cygwin에서는 제목이 변경되고 프롬프트가 $ 또는 # 기호로 표시됩니다.

제목은 변경하지만 프롬프트는 변경되지 않은 Cygwin용 버전을 만들고 싶습니다. (여기에 게시하기 전에 직접 만들어 봐야 한다는 것을 알고 있지만 프롬프트 문자열이 항상 혼란스럽다는 것을 알았습니다.)

편집하다:user@hostname보다 구체적으로 Cygwin에서는 현재 디렉토리가 이어지는 기본 프롬프트가 마음에 듭니다 . 그 팁을 간직하고 싶어요.

편집 2: 작업이 더 쉬워지면 기본 Cygwin 프롬프트 색상이 유지되는지 여부는 상관하지 않습니다. 적어도 프롬프트에 디렉토리가 필요합니다.

이것이 내가 가진 것입니다:

function wtitle {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=`echo $PS1 | sed -r 's/^\\\\\[.+\\\\\]//g'`
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

`

답변1

추가해주세요

PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$'

~/.bashrc의 마지막 줄로 다시 로그인하거나 다음을 실행하세요.

source ~/.bashrc

답변2

OP가 요구하는 것은 터미널 에뮬레이터가 실행 중인 창의 제목을 설정하는 것입니다. 이것을 실행함으로써 이를 달성할 수 있기 때문에 PS1에 대한 참조가 혼란스럽습니다...

printf '\e]2;%s\a' "My Title"

적어도 이것은 mintty 2.7(+ Cygwin 2.8)에서는 작동합니다. (질문이 처음 게시된 이후 상황이 변경되었을 수도 있습니다.)

답변3

SSH 서버에 로그인한 후 헤더가 전혀 업데이트되지 않으면 cygwin에서 OpenSSH 패키지를 설치해 보세요.

나에게 있어 cygwin은 헤더 이스케이프 문자를 SSH 스택을 통해 다시 전달하지 않는 일부 Windows 10 Pro OpenSSH 빌드를 사용하고 있었습니다.

누군가가 이것에 한 시간을 소비하는 것을 방지하기 위해 이것을 게시하는 것 같습니다.

답변4

두 가지 질문이 있습니다.

  1. 그렇게 하지 않을 타당한 이유가 없고 자신이 무엇을 하고 있는지 확실히 알고 있지 않는 한 항상 쉘 변수를 인용해야 합니다. echo $PS1그래야 합니다 echo "$PS1". 이로 인해 프롬프트에서 후행 공백이 손실됩니다. 즉 $, . 어떤 경우에는 다른 문제가 발생할 수 있습니다.
  2. Bash는 \[...를 사용하여 \]이스케이프 시퀀스, 즉 프롬프트의 일부로 화면에 표시되지 않는 문자를 구분합니다. 여기에는 창 제목을 설정하는 이스케이프 시퀀스뿐만 아니라 (표시되는) 프롬프트 내에서 색상을 변경하는 이스케이프 시퀀스도 포함됩니다. 귀하의 스크립트는

    s/ ^ \\\\\[ .+ \\\\\] //g
    

    (명확성을 위해 공백이 추가되었습니다). 언뜻 보면 제거하려는 시도로 보입니다.모두 \[…… \]순서. (실제로는 있어요.그렇게 하지 않는 이유. ) 주요 문제는 .+가능한 가장 긴 문자열을 일치시키는 것 입니다.어느수치. 이는 \[첫 번째 시퀀스의 시작 부분 부터 \]마지막 ​​시퀀스의 끝까지 모든 내용 \[, \]즉 마지막 색상 변경까지의 모든 내용 을 삭제한다는 의미입니다 .

    창 제목을 설정하기 위해 이스케이프 시퀀스를 제거하고 싶습니다. 우리는 보통 변화합니다 .+(어디서.성냥어느문자)를 ]. 그러나 이는 창 제목에 대한 이스케이프 시퀀스가 ​​설정되어 있다는 사실로 인해 복잡해집니다.포함하다], 그래서 우리는 통과해야 두번째 ]:

    s/^\\\\\[[^]]+][^]]+\\\\\]//g
    

    나중에 상황에 맞게 보여드리겠습니다...

  3. 이것은 문제가 되지 않습니다그 자체,하지만 `... `오래된 구문입니다. 대신 $(...을 사용하는 것이 좋습니다 ). 일부 게시물에서는 기능적으로 상호 교환이 가능하다고 표시하는 것 같습니다. 다른 인용/이스케이프 규칙이 적용되지 않습니다. 다행히 이 경우에는 이것이 우리에게 유리하게 작용합니다. $(... 로 전환하면  더 적은 수의 백슬래시를 사용하도록 명령을 )변경할 수 있습니다 .sed
  4. 또 다른 문제: function키워드 사용이 권장되지 않습니다. 선호하는 구문은 아래를 참조하세요.

따라서 위의 내용을 모두 종합하면 다음과 같은 결과를 얻습니다.

wtitle() {
  if [ "$TERM" == "xterm" ] ; then
    # Remove the old title string in the PS1, if one is already set.
    PS1=$(echo "$PS1" | sed -r 's/^\\\[[^]]+][^]]+\\\]//g')
    export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
  else
    echo "You are not working in xterm. I cannot set the title."
 fi
}

이것조차 완벽하지는 않다고 말하면 충분합니다. PS1우선 창 제목 이스케이프 시퀀스의 기존 값 에 따라 달라집니다 .

관련 정보