backend

Linux prompt: 리눅스 쉘 프롬프트 기본 및 커스터마이징

seul chan 2020. 12. 18. 22:31

13. Customizing the prompt

가장 기본적인 prompt는 다음처럼 생겼다.

[ec2-user@ip-xxx.xx.xx.xx ~]$

prompt는 전에 살펴봤던 것처럼 PS1이라는 환경변수로 정의되어 있다. (Prompt String 1의 줄임말)

[ec2-user@ip-xxx.xx.xx.xx ~]$ echo $PS1
[\u@\h \W]\$

이 backslashed-escaped special character들은 bash가 prompt string에서 특별하게 사용한다.

  • \a: ASCII bell. computer beep 소리를 낸다 (?)
  • \d: current date (Mon May 26)
  • \h: hostname
  • \H: full hostname
  • \j: 현재 shell 세션에서 실행중인 job 개수
  • \l: 현재 터미널 기기의 이름
  • \n: newline (줄바꿈)
  • \r: carrage return
  • \s: shell 프로그램 이름
  • \t: 현재 시간 (24시간 기준) HH:mm:ss 포멧
  • \T: 12시간 기준 현재시간
  • @: 21시간 기준 + AM/PM 포멧
  • \A: 24시간 기준 현재시간 HH:mm 포멧
  • \u: 현재 유저명
  • \v: shell 버전명
  • \w: 현재 working directory
  • \W: 현재 working directory의 마지막 경로
  • !: 현재 명령어의 히스토리 넘버
  • #: 현재 쉘 세션에서 입력되었던 명령어 수
  • \$: $캐릭터를 표시. superuser 권한일 떄에는 #
  • [: non-printing 캐릭터를 나타내는 시그널 시작
  • ]: non-printing 캐릭터를 나타내는 시그널 시작

Prompt 디자인 변경해보기

[ec2-user@ip-xxx.xx.xx.xx ~]$ ps1_old="$PS1"
[ec2-user@ip-xxx.xx.xx.xx ~]$ echo $ps1_old
[\u@\h \W]\$

# 나중이 이렇게 복구할 수 있다.
[ec2-user@ip-172-31-5-10 ~]$ PS1="$ps1_old"

일단 모두 제거해보자.

[ec2-user@ip-172-31-5-10 ~]$ PS1=

아무것도 표시되지 않는 것을 볼 수 있다. 이제 달러 사인($)만 줘보자.

[ec2-user@ip-172-31-5-10 ~]$ PS1="\$ "
$

이제 적어도 어디에 있는지 정도는 볼 수 있다.

시간과 hostname을 표시해보자.

$ PS1="\A \h \$ "
15:25 ip-xxx-xx-xx-xx $

기존 방식과 거의 흡사하게 만들어보자.

15:26 ip-172-31-5-10 $ PS1="<\u@\h \W>\$ "
<ec2-user@ip-172-31-5-10 ~>$ ls

색깔 변경

캐릭터 색깔은 ANSI escape code로 터미널 에뮬레이터에 보내진다.

# red prompt
<ec2-user@ip-172-31-5-10 ~>$ PS1="\[\033[0;31m\]<\u@\h \W>\$ "

# 기존 색상으로 돌아가라는 신호
<ec2-user@ip-172-31-5-10 ~>$ PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\] "

# red background color
<ec2-user@ip-172-31-5-10 ~>$ PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] "

ANSI 는 \033[X;XXm 형태로 이루어진다.

세미콜론으로 나누어진 첫번째 숫자는 특별한 뜻을 갖고, 숫자는 30부터 시작된다.

  • 0이 기본, 1은 bold, 4는 italic, 5는 밑줄 등이다.

  • 각 숫자 번호는 ANSI escape code 위키피디아에서도 볼 수 있다.

  • 0;30 은 기본 블랙 -> \033[0;30m 이 그래서 검정색이다.

  • \033[0;30m: black

  • \033[0;31m: red

  • \033[0;32m: green

백그라운드 컬러는 40으로 시작한다.

  • \033[0;40m: black
  • \033[0;41m: red
  • \033[0;42m: green

커서 이동

escape code로 커서의 위치도 조정할 수 있다. 보통 시계나 특별한 정보를 스크린의 위치에 고정할 때 쓰인다.

구체적인 sequence는 따로 정리하지 않겠다.

다음은 스크린의 맨 위에 빨간 시계를 고정시키는 prompt.

PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "

이걸 활용하면 zsh를 조금 더 깔끔하게 만들 수 있을듯.

한번 더 보고 실제로 많은 정보를 표시해주는 shell을 만들어보자.

prompt 저장

.bashrc 파일에 두줄을 추가하면 된다.

PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "

export PS1