PS1 환경 변수 이해

PS1 환경 변수 이해

PS1Stackoverflow에서 방금 Linux 터미널 프롬프트를 담당하는 환경 변수에 대한 질문을 봤습니다 .

내 팁은 다음과 같습니다.

username@PORT-usr:/dir
  • usernameWSL에 로그인할 때 사용하는 사용자 이름입니다.
  • PORT-usr내 노트북 ​​이름이에요.
  • /dir내 현재 디렉토리입니다.

PS1환경 변수는 다음과 같습니다.

Prompt>echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

이렇게 하려고 해도 작동하지 않습니다.

Prompt>echo $($PS1)
\[\e]0;\u@\h:: command not found

Prompt>echo echo $(\[\e]0;\u@\h: \w\a\]${debian_chroot...)
e]0: command not found
u@h:: command not found
32m]u@h[033[00m]:[033[01: command not found
34m]w[033[00m]$: command not found

사용된 변수의 구문은 무엇입니까 $PS1? 이 구문을 이해하는 방법을 배우려면 어떤 명령을 사용할 수 있습니까?

답변1

PS1변수(환경 변수일 수도 있고 아닐 수도 있음)에는 일반 쉘 명령이 포함되지 않습니다. 사용 중인 다양한 쉘에 특정한 특수 프로세스를 사용하여 프롬프트로 확장됩니다. echo일반 명령으로 인식되지 않는 특수 시퀀스가 ​​포함될 수 있습니다 .

쉘 프롬프트는 Debian(및 관련 배포판)의 기본 프롬프트처럼 보입니다. 일반 사용자 계정에 대한 데비안의 기본 셸은 이므로 bash확인해야 합니다 PROMPTING. man bash또는6.9장:제어 프롬프트배쉬 참조 매뉴얼.

내장된 터미널 제어 코드를 이해하려면 터미널 에뮬레이터에 해당하는 문서를 참조해야 할 수도 있습니다.Xterm 제어 시퀀스 참조.

현재 프롬프트가 해석되는 방법은 다음과 같습니다.

\[ ... \]     encapsulates any terminal control codes that will not result in
              any visible output on the prompt line

\e]0;         Xterm control code to set terminal window title and icon name
\u@\h: \w     expands to window title <username>@<hostname>: <workdir>
\a            indicates the end of terminal window title / icon name string
\]            end of encapsulation

${debian_chroot:+($debian_chroot)}
              if variable $debian_chroot is defined, adds text
              "(<contents of $debian_chroot>)" to the prompt

\[            encapsulates terminal control codes, see above
\033[01;32m   set bold output with green foreground color
\]            end encapsulation

\u@\h         expands to "<username>@<hostname>" in the prompt

\[            encapsulates terminal control codes, see above
\033[00m      reset to normal output
\]            end encapsulation

:             outputs a ":" character

\[            encapsulates terminal control codes, see above
\033[01;34m   set bold output with blue foreground color
\]            end encapsulation

\w            outputs the current working directory

\[            encapsulates terminal control codes, see above
\033[00m      reset to normal output
\]            end encapsulation

\$            outputs "$" if a regular user, "#" when UID 0 (root)

\[... 인쇄되지 않는 문자의 줄 바꿈이 올바르게 수행되지 않은 경우 \]명령줄이 터미널 너비보다 길어지면 줄 바꿈 오류가 표시됩니다.

답변2

구문은 PS1자체 언어이므로 echo인쇄할 수 없습니다.

이에 대해 알아보려면 쉘의 문서를 살펴보는 것이 유일한 옵션입니다. https://www.gnu.org/software/bash/manual/html_node/Controlling-the-Prompt.html

답변3

PS1정의 외부의 별도 파일에 정의를 배치 하면 .bashrc파일이 저장될 때마다 프롬프트가 업데이트됩니다.

예:

  • 파일 에서 .bashrc:
    pcmd() {
      _error_value=$?;
      PS1=$(~/.pcmd $_error_value);
    }
    
    PROMPT_COMMAND=pcmd;
    
  • 홈 디렉터리에 새 파일을 만듭니다 .pcmd(실행 가능해야 함 chmod a+x .pcmd).
    #!/bin/bash
    _error_value=$1;
    _now=$(date +%H:%M);                                                                                       
    _error_r_time=$([ "$_error_value" != "0" ] && echo "[\[\e[1;37m\]>\[\e[1;31m\]$_error_value\[\e[1;37m\]<\[\e[m]\]" || echo "[\[\e[1;37m\]$_now\[\e[m\]");
    
    echo "[\[\e[1;32m\]\u\[\e[m\]@\[\e[1;36m\]\h\[\e[m\]](\[\e[1;32m\]\w\[\e[m\])$_error_r_time$ "
    

관련 정보