웹사이트 검색

Linux VPS에서 Bash 프롬프트를 사용자 정의하는 방법


소개

Linux 서버를 관리할 때 명령줄을 사용하는 데 상당한 시간을 할애하게 됩니다. 대부분의 사람들에게 이는 Bash 셸에서 많은 시간을 보내는 것을 의미합니다.

대부분의 배포판은 사용자 및 루트 프롬프트의 스타일 지정을 위한 적절한 기본값을 제공하지만 프롬프트를 사용자 정의하여 고유한 기본 설정을 추가하는 것이 도움이 될 수 있습니다. 높은 권한으로 작업할 때 방향을 유지하고 상기시키는 데 도움이 되는 많은 유용한 정보를 포함할 수 있습니다.

우리는 실험을 위해 Ubuntu 12.04 VPS를 사용할 것이지만 거의 모든 최신 Linux 배포판은 비슷한 방식으로 작동해야 합니다.

쉘이 Bash인지 확인하십시오.

셸을 실제로 사용자 지정하기 전에 현재 셸이 실제로 Bash인지 확인해야 합니다.

이는 대부분의 시스템에 해당되어야 하지만 배포 관리자가 다른 셸을 선택하거나 사용자가 새 셸을 테스트하는 경우가 있습니다.

/etc/passwd 파일을 확인하면 쉽게 확인할 수 있습니다. 다음과 같이 호출기에서 파일을 엽니다.

less /etc/passwd

이 파일의 각 줄에는 다른 사용자에 대한 정보가 포함되어 있습니다. 콜론(:)으로 구분된 첫 번째 열에서 사용자와 루트 사용자를 찾습니다. 마지막 필드에는 해당 사용자의 기본 로그인 셸이 나열됩니다.

root:x:0:0:root:/root:/bin/bash
. . .
demouser:x:1000:1000:,,,:/home/demouser/bin/bash

마지막 필드가 /bin/bash이면 모두 설정된 것입니다.

마지막 필드가 /bin/bash아니고 기본 셸을 Bash로 변경하려는 경우 루트 권한으로 이 파일을 편집하고 연결된 마지막 필드를 변경할 수 있습니다. 귀하의 사용자:

sudo nano /etc/passwd

변경한 후에는 로그아웃했다가 다시 로그인하여 Bash 셸을 사용하십시오.

현재 값 보기

시작하려면 Bash 프롬프트를 정의하기 위해 구성 파일에 이미 있는 것을 살펴보겠습니다.

Bash는 PS1PS2 환경 변수를 사용하여 프롬프트를 구성합니다.

PS1은 표시되는 기본 프롬프트를 정의합니다. 로그인할 때마다 이 메시지가 표시됩니다. 기본적으로 Ubuntu 시스템에서는 다음과 같은 형식이어야 합니다.

<예비>

끝에 있는 $에 유의하십시오. 이것은 쉘이 일반 사용자 쉘임을 나타냅니다. 루트 사용자의 경우 이것은 #로 대체되어 높은 권한으로 작업하고 있음을 구분하고 알 수 있습니다.

PS2 프롬프트는 여러 줄 명령에 사용됩니다. 터미널에 다음을 입력하여 현재 PS2 변수가 무엇으로 설정되어 있는지 확인할 수 있습니다.

echo \

프롬프트를 보려면 백슬래시 바로 뒤에 Enter 키를 누르십시오. 기본적으로 우분투에서는 >입니다.

일반적으로 대화형 셸이 시작될 때 읽히는 ~/.bashrc 파일에 이러한 변수가 포함될 내용을 정의합니다.

Ubuntu 12.04의 이 파일에서 다음과 같은 섹션을 찾을 수 있습니다.

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
# force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

프롬프트가 색상화되는 시기를 지시하는 몇 가지 논리를 볼 수 있습니다. 색상화된 프롬프트를 원하면 force_color_prompt=yes 줄의 주석을 제거해야 합니다. 나중에 수행할 사용자 지정을 활용하려면 지금 이 작업을 수행하십시오.

force_color_prompt=yes

우리가 신경 쓰는 부분은 프롬프트를 설정하는 부분입니다. 이것은 색상 사용 여부에 따라 다른 프롬프트가 있는 if-else 구조에 중첩됩니다.

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

상단 섹션은 색상 지원을 추가합니다. 먼저 몇 가지 기본 사항을 파악하기 위해 색상 없이 두 번째 섹션을 살펴보겠습니다.

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

이것은 상당히 복잡해 보이며 일반적인 쉘 사용에서 볼 수 있는 것과 일치하지 않는 부분이 있습니다.

debian_chroot를 포함하는 부분은 루트 변경 환경에서 작업하는 경우 알림을 위해 프롬프트가 수정됨을 나타냅니다. 프롬프트의 이 부분은 유용한 기능이므로 그대로 유지하는 것이 좋습니다.

나머지 프롬프트 정의는 다음과 같습니다.

\u@\h:\w\$: 

이것은 일부 이스케이프 시퀀스를 사용하여 지금까지 우리가 본 주요 프롬프트를 설명합니다.

Bash 이스케이프 시퀀스

Bash 매뉴얼 페이지에서 가능한 이스케이프 시퀀스의 전체 목록을 찾을 수 있습니다.

<예비>

보시다시피 몇 가지 기본 정보와 아마도 필요하지 않은 정보(ASCII 벨 문자, Bash 버전 등)가 있습니다.

지금 프롬프트에는 사용자 이름(\\u), @ 기호, 호스트 이름의 첫 번째 부분(\\h), 현재 작업 디렉토리(\\w), 마지막으로 일반 사용자를 위한 "$\ 및 \\ 루트 사용자의 경우 #.

다른 옵션 중 일부를 테스트할 수 있도록 ~/.bashrc 파일을 종료하겠습니다.

새 Bash 프롬프트 테스트

결국 우리는 ~/.bashrc 파일을 편집하여 선택 사항을 영구적으로 만들고 싶지만 명령줄 자체에서 프롬프트를 변경하여 실험하는 것이 훨씬 쉽습니다.

수정을 시작하기 전에 PS1의 현재 값을 새 변수에 저장해 보겠습니다. 이렇게 하면 실수할 경우 로그아웃했다가 다시 로그인할 필요 없이 원래 프롬프트로 더 쉽게 전환할 수 있습니다.

ORIG=$PS1

이제 기본 프롬프트의 복사본을 저장할 ORIG라는 환경 변수가 있습니다.

원래 프롬프트로 다시 전환해야 하는 경우 다음을 입력할 수 있습니다.

PS1=$ORIG

실제 프롬프트에 대한 사용자 이름과 $만 있으면 간단하게 시작하겠습니다.

PS1="\u$"

우리는 다음과 같은 것을 얻어야 합니다:

demouser$

좀 더 멋지게 보이도록 약간의 공간을 두자.

PS1="\u $: "
demouser $:

우리는 아마도 "$\ 리터럴 문자를 사용하고 싶지 않을 것입니다. 대신 \\$ 이스케이프 시퀀스를 사용해야 합니다. 이것은 우리가 루트인지 여부에 따라 프롬프트를 동적으로 수정하여 허용합니다. 루트로 올바르게 사용되는 PS1:

PS1="\u \$: "

프롬프트에 원하는 리터럴 문자열을 추가할 수 있습니다.

PS1="Hello, my name is \u! \$: "
Hello, my name is demouser! $:

일반 셸 기능을 사용하여 임의 명령의 결과를 삽입할 수도 있습니다.

여기에서 백틱을 사용하여 /proc/loadavg에 있는 로드 메트릭의 첫 번째 열을 가져와서 명령 결과를 삽입함으로써 프롬프트가 서버의 현재 로드를 제공하도록 할 수 있습니다.

PS1="\u, load: `cat /proc/loadavg | awk '{ print $1; }'` \$: "
demouser, load: 0.01 $:

이것은 시스템에 세금을 부과하고 있는지 알 수 있는 좋은 방법입니다.

프롬프트에 날짜나 시간이 중요한 경우 다음과 같이 시도해 볼 수 있습니다. 또한 일부 괄호와 괄호를 사용하여 데이터를 분류하여 체계적으로 유지해 보겠습니다. 또한 작업 디렉토리를 추적하기 위해 \\w를 다시 추가해 보겠습니다.

PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t) \w \$ "
[demouser@host, load: 0.01] (Thu Feb 20 - 13:15:20) ~ $

이것은 특히 디렉토리를 경로가 긴 것으로 변경하는 경우 약간 다루기 어려워지기 시작합니다.

cd /etc/systemd/system/multi-user.target.wants
[demouser@host, load: 0.01] (Thu Feb 20 - 13:18:28) /etc/systemd/system/multi-user.target.wants $

여전히 이 모든 정보를 원하지만 더 짧게 만들고 싶다면 한 가지 전략은 를 사용하여 두 줄 사이에 정보를 나누는 것입니다.\n 개행 문자:

PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "
[demouser@host, load: 0.00] (Thu Feb 20 - 13:20:00)
/etc/systemd/system/multi-user.target.wants $

어떤 사람들은 여러 줄 프롬프트를 싫어하지만 프롬프트에 더 많은 정보를 제공하는 한 가지 방법입니다.

프롬프트 색상 변경

이제 프롬프트에 영향을 줄 수 있는 다양한 방법을 잘 이해했으므로 몇 가지 색상을 사용해 보겠습니다.

Bash를 사용하면 특수 코드를 사용하여 프롬프트에 색상을 도입할 수 있습니다. 선택된 코드가 그다지 설명적이지 않기 때문에 이들은 종종 혼동의 원인이 됩니다.

실제 색상 코드에 도달하기 전에 실제로 색상 코드를 구현하는 방법에 대해 이야기해야 합니다. Bash 설정에서 색상 코드를 정의하는 옳고 그른 방법이 있습니다.

먼저 전체 색상 코드 설명을 \\[\\] 태그로 래핑해야 합니다. 이 대괄호는 bash에게 첫 번째 시퀀스 이후부터 마지막 시퀀스까지 존재하는 문자가 인쇄되지 않는 문자로 간주되어야 함을 나타냅니다.

Bash는 다음 줄로 넘어가기 전에 인쇄할 수 있는 문자 수를 추정할 수 있도록 이를 알아야 합니다. 색상 코드를 \\[\\] 태그로 묶지 않으면 Bash는 모든 문자를 리터럴 문자로 계산하고 너무 빨리 줄을 바꿉니다.

둘째, 인쇄되지 않는 괄호 안에 [ 또는 [를 입력하여 색상 프롬프트의 시작 부분을 지정해야 합니다. 둘 다 동일한 작업을 수행하고 이스케이프 시퀀스의 시작을 나타냅니다. 이 가이드에서는 [를 사용하겠습니다. 좀 더 명확하다고 생각하기 때문입니다.

\\] 앞에 색상 순서를 지정하고 있음을 나타내기 위해 "m\이 필요합니다.

따라서 기본적으로 색상을 수정하고 싶을 때마다 프롬프트에 다음과 같은 내용을 입력해야 합니다.

<예비>

보시다시피 이것은 프롬프트를 특히 지저분하게 만드는 부분입니다.

색상 코드는 전경 텍스트의 색상을 변경하는 기본 코드는 다음과 같습니다.

  • 30: 블랙
  • 31: 빨간색
  • 32: 녹색
  • 33: 노란색
  • 34: 파란색
  • 35: 보라색
  • 36: 시안
  • 37: 흰색

기본 값 앞에 세미콜론(;)으로 구분된 "속성\을 설정하여 이러한 기본 값을 수정할 수도 있습니다.

사용 중인 터미널의 종류에 따라 다소 다르게 작동할 수 있습니다. 보다 일반적인 속성 중 일부는 다음과 같습니다.

  • 0: 일반 텍스트
  • 1: 터미널에 따라 굵게 또는 밝게
  • 4: 텍스트에 밑줄

따라서 밑줄이 있는 녹색 텍스트를 원하면 다음과 같은 시퀀스를 사용합니다.

\[\e[4;32m\]

그런 다음 원하는 프롬프트를 입력합니다. 나중에 터미널에 입력하는 텍스트의 색상이 이상하게 표시되지 않도록 색상을 원래 값으로 다시 재설정하고 싶을 것입니다.

Bash가 프롬프트 색상을 재설정해야 함을 나타내는 다른 색상 코드를 사용하여 이를 수행할 수 있습니다. 이 코드는 다음과 같습니다.

\[\e[0m\]

따라서 사용자 이름과 호스트가 포함된 간단한 색상 프롬프트는 다음과 같이 표시될 수 있습니다.

PS1="\[\e[4;32m\]\u@\h\[\e[0m\]$ "

더 복잡한 배경색을 지정할 수도 있습니다. 배경색은 속성을 가질 수 없습니다. 그들은:

  • 40: 검정색 배경
  • 41: 빨간색 배경
  • 42: 녹색 배경
  • 43: 노란색 배경
  • 44: 파란색 배경
  • 45: 보라색 배경
  • 46: 청록색 배경
  • 47: 흰색 배경

다음과 같이 배경색, 속성 및 텍스트 색상을 모두 한 번에 지정할 수 있지만:

\[\e[42;1;36m\]

일반적으로 배경 정보를 다른 정보와 분리하면 더 잘 작동합니다.

\[\e[42m\]\[\e[1;36m\]

경우에 따라 "일반\ 텍스트 속성(0)을 사용하는 경우 일부 터미널에서 색상이 깨질 수 있습니다. 어쨌든 기본값이므로 일반 값을 0으로 지정하지 않으면 이를 방지할 수 있습니다.

즉각적인 변경 사항을 영구적으로 적용

잠시 동안 프롬프트를 가지고 놀았으므로 이제 프롬프트가 어떻게 보이길 원하는지 잘 알고 있어야 합니다. 색상이 있는 프롬프트와 색상이 없는 프롬프트를 모두 만들 수 있어야 합니다.

이 예에서는 다음 색상 프롬프트를 사용합니다.

PS1="[\[\e[0;32m\]\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`\[\e[00m\]] (\[\e[00;35m\]\d - \t\[\e[00m\])\n\w \$ "

유색 bash 프롬프트를 원하지 않는 경우에도 무색 등가물을 사용합니다.

PS1="[\u@\h, load: `cat /proc/loadavg | awk '{ print $1; }'`] (\d - \t)\n\w \$ "

이제 원하는 두 가지 버전의 프롬프트가 있으므로 ~/.bashrc 파일에서 PS1을 편집할 수 있습니다.

nano ~/.bashrc

처음에 논의한 것처럼 이제 파일에 있는 프롬프트에는 chroot 환경에 있을 때 이를 명확하게 표시하는 기능이 포함되었습니다. 그 부분은 그대로 두겠습니다. 지금은 다음과 같습니다.

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

현재 PS1 할당을 주석 처리하고 아래의 debian_chroot 로직을 복사하여 다음과 같이 만듭니다.

<예비>

프롬프트 끝에서 마지막 인용문이 닫히기 직전에 구현하려는 프롬프트를 추가할 수 있습니다. 실제로 우리 프롬프트는 작은따옴표를 사용하므로 현재 프롬프트에서 큰따옴표를 사용하도록 인용 유형을 변경하려고 합니다.

첫 번째 PS1 할당에서 프롬프트의 색상 버전을 사용하십시오. 두 번째로 무색을 사용하십시오.

<예비>

완료되면 파일을 닫고 저장할 수 있습니다.

이제 로그아웃했다가 다시 로그인하면 프롬프트가 설정한 값으로 변경됩니다.

결론

구성을 개인화할 수 있는 다양한 방법이 있습니다. 특정 항목에 색상을 지정하면 항목이 눈에 띄게 되고 터미널 기록을 스크롤할 때 마지막 프롬프트를 찾는 데 도움이 될 수 있습니다.

또 다른 인기 있는 아이디어는 루트 사용자에게 특별한 프롬프트를 제공하여 대조를 통해 귀하의 권한을 상기시키는 것입니다. 창의력을 발휘하여 유용한 정보와 잡동사니 사이에서 자신에게 맞는 균형을 찾으십시오.

저스틴 엘링우드