Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash PS1 프롬프트 완전 정복: 리눅스 터미널을 스타일리시하게 꾸미는 10가지 실전 예제

Bash PS1 프롬프트 완전 정복: 리눅스 터미널을 스타일리시하게 꾸미는 10가지 실전 예제
사진 출처: f1r3storm85

들어가며

이전 글에서 리눅스 환경 변수인 PS[1-4]PROMPT_COMMAND에 대해 다루었습니다. PS1을 잘 활용하면 명령 프롬프트에서 바로 유용한 정보를 확인할 수 있습니다.

영화 '툼 레이더'의 앤젤리나 졸리는 미스터리를 해결하기 위해 필요한 모든 가젯과 무기를 손끝에서 자유자재로 사용합니다. 그녀의 장비와 스타일을 따라가기는 어렵지만, 적어도 낡은 리눅스 프롬프트라도 이 글에서 소개하는 10가지 예제를 통해 기능적이고 세련되게 만들어 보겠습니다.

1. 프롬프트에 사용자명, 호스트명, 현재 작업 디렉토리 표시하기

이 예제의 PS1은 프롬프트에 다음 세 가지 정보를 표시합니다:

  • \u – 사용자명(Username)
  • \h – 호스트명(Hostname)
  • \w – 현재 작업 디렉토리의 전체 경로
-bash-3.2$ export PS1="\u@\h \w> "

ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>

2. 프롬프트에 현재 시간 표시하기

PS1 환경 변수에서는 $(linux_command) 형식으로 지정하여 리눅스 명령어를 직접 실행할 수 있습니다. 아래 예제에서는 $(date) 명령을 실행해 프롬프트 안에 현재 시간을 표시합니다.

ramesh@dev-db ~> export PS1="\u@\h [\$(date +%k:%M:%S)]> "

ramesh@dev-db [11:09:56]>

또한 \t를 사용하면 hh:mm:ss 형식으로 현재 시간을 표시할 수 있습니다:

ramesh@dev-db ~> export PS1="\u@\h [\t]> "
ramesh@dev-db [12:42:55]>

\@를 사용하면 오전/오후(am/pm) 12시간 형식으로도 표시할 수 있습니다:

ramesh@dev-db ~> export PS1="[\@] \u@\h> "
[04:12 PM] ramesh@dev-db>

3. 프롬프트에 리눅스 명령어 출력 결과 표시하기

프롬프트에는 어떤 리눅스 명령어의 출력 결과든 표시할 수 있습니다. 아래 예제에서는 파이프(|)로 구분된 세 항목을 명령 프롬프트에 표시합니다:

  • \!: 명령어의 히스토리 번호
  • \h: 호스트명
  • $kernel_version: uname -r 명령 결과를 담은 $kernel_version 변수 값
  • \$?: 마지막 실행 명령의 상태 코드
ramesh@dev-db ~> kernel_version=$(uname -r)
ramesh@dev-db ~> export PS1="\!|\h|$kernel_version|\$?> "
473|dev-db|2.6.25-14.fc9.i686|0>

4. 프롬프트 전경색(글자색) 변경하기

사용자명, 호스트, 현재 디렉토리 정보와 함께 프롬프트를 파란색으로 표시하는 방법입니다.

$ export PS1="\e[0;34m\u@\h \w> \e[m"
[참고: 연한 파란색 프롬프트]

$ export PS1="\e[1;34m\u@\h \w> \e[m"
[참고: 진한 파란색 프롬프트]
  • \e[ – 색상 프롬프트의 시작을 나타냄
  • x;ym – 색상 코드. 아래의 색상 코드 값을 사용합니다.
  • \e[m – 색상 프롬프트의 끝을 나타냄

색상 코드표:

Black(검정)   0;30
Blue(파랑)    0;34
Green(초록)   0;32
Cyan(청록)    0;36
Red(빨강)     0;31
Purple(보라)  0;35
Brown(갈색)   0;33
[참고: 진한 색상을 원하면 0 대신 1을 사용]

.bash_profile 또는 .bashrc 파일에 다음 줄을 추가하면 색상 변경이 영구적으로 적용됩니다.

STARTCOLOR='\e[0;34m';
ENDCOLOR="\e[0m"
export PS1="$STARTCOLOR\u@\h \w> $ENDCOLOR"

5. 프롬프트 배경색 변경하기

PS1 프롬프트에 \e[{code}m을 지정하여 배경색을 변경할 수 있습니다.

$ export PS1="\e[47m\u@\h \w> \e[m"
[참고: 연한 회색 배경]

배경색과 전경색의 조합:

export PS1="\e[0;34m\e[47m\u@\h \w> \e[m"
[참고: 연한 파란색 글자 + 연한 회색 배경]

위의 배경색과 전경색을 영구 적용하려면 .bash_profile 또는 .bashrc에 다음을 추가합니다.

STARTFGCOLOR='\e[0;34m';
STARTBGCOLOR="\e[47m"
ENDCOLOR="\e[0m"
export PS1="$STARTFGCOLOR$STARTBGCOLOR\u@\h \w> $ENDCOLOR"

아래 배경색 코드들을 하나씩 시도해 보고, 자신의 취향에 맞는 것을 골라보세요:

  • \e[40m
  • \e[41m
  • \e[42m
  • \e[43m
  • \e[44m
  • \e[45m
  • \e[46m
  • \e[47m

6. 프롬프트에 여러 색상 동시에 표시하기

하나의 프롬프트에서도 여러 색상을 표시할 수 있습니다. .bash_profile에 다음 함수를 추가하세요.

function prompt {
  local BLUE="\[\033[0;34m\]"
  local DARK_BLUE="\[\033[1;34m\]"
  local RED="\[\033[0;31m\]"
  local DARK_RED="\[\033[1;31m\]"
  local NO_COLOR="\[\033[0m\]"
  case $TERM in
    xterm*|rxvt*)
      TITLEBAR='\[\033]0;\u@\h:\w\007\]'
      ;;
    *)
      TITLEBAR=""
      ;;
  esac
  PS1="\u@\h [\t]> "
  PS1="${TITLEBAR}\
  $BLUE\u@\h $RED[\t]>$NO_COLOR "
  PS2='continue-> '
  PS4='$0.$LINENO+ '
}

변경 사항을 적용하려면 재로그인하거나, 아래와 같이 .bash_profile을 다시 로드(source)하면 됩니다.

$. ./.bash_profile
$ prompt
ramesh@dev-db [13:02:13]>

7. tput 명령으로 프롬프트 색상 변경하기

tput 명령을 사용해서도 PS1 프롬프트의 색상을 변경할 수 있습니다:

$ export PS1="\[$(tput bold)$(tput setb 4)$(tput setaf 7)\]\u@\h:\w $ \[$(tput sgr0)\]"

tput 색상 관련 기능:

  • tput setab [1-7] – ANSI escape 방식으로 배경색 설정
  • tput setb [1-7] – 배경색 설정
  • tput setaf [1-7] – ANSI escape 방식으로 전경색 설정
  • tput setf [1-7] – 전경색 설정

tput 텍스트 모드 기능:

  • tput bold – 굵은 글씨(bold) 모드 설정
  • tput dim – 반투명(half-bright) 모드 켜기
  • tput smul – 밑줄 모드 시작
  • tput rmul – 밑줄 모드 종료
  • tput rev – 반전(reverse) 모드 켜기
  • tput smso – 강조(standout) 모드 진입 (rxvt에서는 bold)
  • tput rmso – 강조(standout) 모드 종료
  • tput sgr0 – 모든 속성 끄기

tput 색상 코드:

  • 0 – 검정(Black)
  • 1 – 빨강(Red)
  • 2 – 초록(Green)
  • 3 – 노랑(Yellow)
  • 4 – 파랑(Blue)
  • 5 – 마젠타(Magenta)
  • 6 – 청록(Cyan)
  • 7 – 흰색(White)

8. PS1 변수용 특수 코드로 나만의 프롬프트 만들기

아래 코드들을 활용해 기능적이면서 취향에 맞는 개성 있는 PS1 리눅스 프롬프트를 직접 만들어 보세요. 일상적인 사용에 어떤 코드가 가장 유용할까요? 댓글로 여러분이 사용 중인 PS1 코드를 알려주세요.

  • \a – ASCII 벨 문자(07)
  • \d – "요일 월 일" 형식의 날짜 (예: "Tue May 26")
  • \D{format} – format이 strftime(3)에 전달되며 그 결과가 프롬프트 문자열에 삽입됨; 빈 format은 로케일별 시간 표현이 됨. 중괄호({})는 필수
  • \e – ASCII 이스케이프 문자(033)
  • \h – 첫 번째 마침표(.)까지의 호스트명
  • \H – 전체 호스트명
  • \j – 셸이 현재 관리 중인 작업(job) 수
  • \l – 셸 터미널 디바이스 이름의 basename
  • \n – 새 줄(newline)
  • \r – 캐리지 리턴(carriage return)
  • \s – 셸 이름($0의 basename, 마지막 슬래시 뒤 부분)
  • \t – 24시간 HH:MM:SS 형식의 현재 시간
  • \T – 12시간 HH:MM:SS 형식의 현재 시간
  • \@ – 오전/오후 12시간 형식의 현재 시간
  • \A – 24시간 HH:MM 형식의 현재 시간
  • \u – 현재 사용자의 사용자명
  • \v – bash 버전 (예: 2.00)
  • \V – bash 릴리즈 버전+패치 수준 (예: 2.00.0)
  • \w – 현재 작업 디렉토리 ($HOME은 물결표(~)로 축약)
  • \W – 현재 작업 디렉토리의 basename ($HOME은 물결표(~)로 축약)
  • \! – 해당 명령의 히스토리 번호
  • \# – 해당 명령의 명령 번호
  • \$ – 유효 UID가 0이면 #, 아니면 $
  • \nnn – 8진수 nnn에 해당하는 문자
  • \\ – 백슬래시
  • \[ – 비출력(non-printing) 문자 시퀀스 시작 (터미널 제어 시퀀스를 프롬프트에 삽입할 때 사용)
  • \] – 비출력 문자 시퀀스 끝

9. PS1 변수 안에서 bash 셸 함수 사용하기

PS1 안에서 bash 셸 함수를 호출할 수도 있습니다.

ramesh@dev-db ~> function httpdcount {
>  ps aux | grep httpd | grep -v grep | wc -l
> }

ramesh@dev-db ~> export PS1="\u@\h [`httpdcount`]> "
ramesh@dev-db [12]>
[참고: 실행 중인 httpd 프로세스의 총 개수를 표시]

.bash_profile 또는 .bashrc에 다음 줄을 추가하면 이 변경 사항이 영구 적용됩니다:

function httpdcount {
  ps aux | grep httpd | grep -v grep | wc -l
}
export PS1='\u@\h [`httpdcount`]> '

10. PS1 변수 안에서 셸 스크립트 사용하기

PS1 변수 안에서 셸 스크립트를 호출하는 것도 가능합니다. 아래 예제에서는 현재 디렉토리의 전체 파일 크기를 계산하는 ~/bin/totalfilesize.sh 스크립트를 PS1 변수 내에서 실행합니다.

ramesh@dev-db ~> cat ~/bin/totalfilesize.sh

for filesize in $(ls -l . | grep "^-" | awk '{print $5}')
do
  let totalsize=$totalsize+$filesize
done
echo -n "$totalsize"

ramesh@dev-db ~> export PATH=$PATH:~/bin
ramesh@dev-db ~> export PS1="\u@\h [\$(totalfilesize.sh) bytes]> "
ramesh@dev-db [534 bytes]> cd /etc/mail
ramesh@dev-db [167997 bytes]>
[참고: totalfilesize.sh를 실행하여 현재 디렉토리의 전체 파일 크기를 PS1 프롬프트에 표시]

마무리하며

여러분은 PS1을 얼마나 커스터마이징했나요? 여러분의 PS1이 앤젤리나 졸리를 능가한다고 생각하시나요? 댓글로 여러분만의 PS1 프롬프트 값을 공유해 주세요!

추천 도서

Bash Cookbook (Carl Albing, JP Vossen, Cameron Newham 지음). Bash는 매우 강력한 셸입니다. 이 책은 bash 셸을 마스터하고 생산성을 극대화하는 데 도움을 줍니다. 시스템 관리자(sysadmin), DBA, 개발자 등 누구나 언젠가는 셸 스크립트를 작성하게 됩니다. 숙련된 시스템 관리자는 셸 스크립팅 기법을 마스터하면 반복적인 단순 작업을 셸 스크립트에 맡겨 서버를 오토파일럿(auto-pilot) 모드로 운영할 수 있다는 것을 알고 있습니다. 시스템 관리의 오토파일럿 모드에 도달하려면 이 요리책(cookbook) 스타일의 예제들을 반드시 익혀야 합니다. 시중에 bash 셸 관련 책이 많지만, 상세한 예제가 풍부한 이 책이 단연 돋보입니다.

추가 리눅스 도서 추천: 두뇌와 서재를 풍부하게 해줄 12가지 놀랍고 필수적인 리눅스 도서

이 글이 도움이 되었다면 북마크하고 공유해 주세요!