Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash Shell:PS1, PS2, PS3, PS4 및 PROMPT_COMMAND 제어

Bash Shell:PS1, PS2, PS3, PS4 및 PROMPT_COMMAND 제어PS1, PS2, PS3, PS4 및 효과적으로 PROMPT_COMMAND. PS는 프롬프트 문을 나타냅니다. 이 문서에서는 간단한 예제를 사용하여 Linux 명령 프롬프트 환경 변수에 대한 빠른 시작을 제공합니다.

1. PS1 – 기본 상호작용 프롬프트

Linux의 기본 대화형 프롬프트는 아래와 같이 유용하고 유익한 것으로 수정할 수 있습니다. 다음 예에서 기본 PS1은 쉘 이름과 버전 번호를 표시하는 "\s-\v\$"였습니다. 아래와 같이 사용자 이름, 호스트 이름 및 현재 작업 디렉토리 이름을 표시하도록 이 기본 동작을 변경하겠습니다.

-bash-3.2$ export PS1="\u@\h \w> "

ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>
[Note: Prompt changed to "username@hostname current-dir>" format] 

이 예에서는 다음 PS1 코드가 사용됩니다.

  • \u – 사용자 이름
  • \h – 호스트 이름
  • \w – 현재 디렉토리의 전체 경로 이름. 홈 디렉토리에 있을 때는 위와 같이 ~만 표시됩니다.
  • PS1 값의 끝에 공백이 있습니다. 개인적으로 더 나은 가독성을 위해 프롬프트 끝에 공백을 넣는 것을 선호합니다.

아래와 같이 export PS1=”\u@\h \w> ”를 .bash_profile(또는) .bashrc에 추가하여 이 설정을 영구적으로 만드십시오.

ramesh@dev-db ~> vi ~/.bash_profile (or)
ramesh@dev-db ~> vi ~/.bashrc
[Note: Add export PS1="\u@\h \w> " to one of the above files]

다음 포스트에서는 PS1의 실제 활용 사례에 대해 자세히 써보도록 하겠습니다.

2. PS2 – 연속 대화식 프롬프트

매우 긴 유닉스 명령은 줄 끝에 \를 붙여 여러 줄로 나눌 수 있습니다. 여러 줄 명령에 대한 기본 대화식 프롬프트는 "> "입니다. 이 기본 동작을 아래와 같이 PS2 환경 변수를 사용하여 "continue->"가 표시되도록 변경해 보겠습니다.

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
> --key_buffer_size=512M --sort_buffer_size=512M \
> --read_buffer_size=4M --write_buffer_size=4M \
> /var/lib/mysql/bugs/*.MYI
[Note: This uses the default ">" for continuation prompt]

ramesh@dev-db ~> export PS2="continue-> "

ramesh@dev-db ~> myisamchk --silent --force --fast --update-state \
continue-> --key_buffer_size=512M --sort_buffer_size=512M \
continue-> --read_buffer_size=4M --write_buffer_size=4M \
continue-> /var/lib/mysql/bugs/*.MYI
[Note: This uses the modified "continue-> " for continuation prompt]

\를 사용하여 긴 명령을 여러 줄로 나눌 때 매우 유용하고 읽기 쉽다는 것을 알았습니다. 긴 명령을 분리하는 것을 좋아하지 않는 다른 사람들도 보았습니다. 당신의 취향은 무엇입니까? 긴 명령을 여러 줄로 나누는 것을 좋아합니까?

<센터>

3. PS3 – 쉘 스크립트 내에서 "select"가 사용하는 프롬프트

아래에 설명된 대로 PS3 환경 변수를 사용하여 쉘 스크립트 내에서 선택 루프에 대한 사용자 정의 프롬프트를 정의할 수 있습니다.

PS3 없이 셸 스크립트 및 출력:

ramesh@dev-db ~> cat ps3.sh

select i in mon tue wed exit
do
 case $i in
 mon) echo "Monday";;
 tue) echo "Tuesday";;
 wed) echo "Wednesday";;
 exit) exit;;
 esac
done

ramesh@dev-db ~> ./ps3.sh

1) mon
2) tue
3) wed
4) exit
#? 1
Monday
#? 4
[Note: This displays the default "#?" for select command prompt]


PS3를 사용한 쉘 스크립트 및 출력:

ramesh@dev-db ~> cat ps3.sh

PS3="Select a day (1-4): "
select i in mon tue wed exit
do
 case $i in
 mon) echo "Monday";;
 tue) echo "Tuesday";;
 wed) echo "Wednesday";;
 exit) exit;;
 esac
done

ramesh@dev-db ~> ./ps3.sh
1) mon
2) tue
3) wed
4) exit
Select a day (1-4): 1
Monday
Select a day (1-4): 4
[Note: This displays the modified "Select a day (1-4): "
 for select command prompt]

4. PS4 – "set -x"에서 추적 출력 접두사로 사용

PS4 셸 변수는 아래와 같이 디버그 모드에서 셸 스크립트를 실행할 때 표시되는 프롬프트를 정의합니다.

PS4 없이 쉘 스크립트 및 출력:

ramesh@dev-db ~> cat ps4.sh

set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh

++ echo 'PS4 demo script'
PS4 demo script
++ ls -l /etc/
++ wc -l
243
++ du -sh /home/ramesh
48K /home/ramesh
[Note: This displays the default "++" while tracing the output using set -x]


PS4를 사용한 쉘 스크립트 및 출력:
ps4.sh에서 아래에 정의된 PS4에는 다음과 같은 두 개의 코드가 있습니다.

  • $0 – 스크립트 이름을 나타냅니다.
  • $LINENO – 스크립트 내의 현재 줄 번호를 표시합니다.
ramesh@dev-db ~> cat ps4.sh

export PS4='$0.$LINENO+ '
set -x
echo "PS4 demo script"
ls -l /etc/ | wc -l
du -sh ~

ramesh@dev-db ~> ./ps4.sh
../ps4.sh.3+ echo 'PS4 demo script'
PS4 demo script
../ps4.sh.4+ ls -l /etc/
../ps4.sh.4+ wc -l
243
../ps4.sh.5+ du -sh /home/ramesh
48K /home/ramesh
[Note: This displays the modified "{script-name}.{line-number}+"
 while tracing the output using set -x]

5. PROMPT_COMMAND

Bash 쉘은 PS1 변수를 표시하기 직전에 PROMPT_COMMAND의 내용을 실행합니다.

ramesh@dev-db ~> export PROMPT_COMMAND="date +%k:%m:%S"
22:08:42
ramesh@dev-db ~>
[Note: This displays the PROMPT_COMMAND and PS1 output on different lines]

PROMPT_COMMAND의 값을 PS1과 같은 줄에 표시하려면 아래와 같이 echo -n을 사용하십시오.

ramesh@dev-db ~> export PROMPT_COMMAND="echo -n [$(date +%k:%m:%S)]"
[22:08:51]ramesh@dev-db ~>
[Note: This displays the PROMPT_COMMAND and PS1 output on the same line]

이 기사가 마음에 들면 del.icio.us 및 Stumble에 북마크하세요. '다음은 무엇입니까?' 섹션 아래에 제공된 링크를 사용합니다.