การโต้ตอบกับ Linux Bash Shell จะเป็นอย่างยิ่งสบายใจ หากคุณใช้ PS1, PS2, PS3, PS4, และ PROMPT_COMMAND อย่างมีประสิทธิภาพ PS ย่อมาจาก Prompt Statement บทความนี้จะให้ Jumpstart เกี่ยวกับ Linux Command Prompt Environment Variables ด้วยตัวอย่างง่ายๆ
1. PS1 – Default Interaction Prompt
Default Interactive Prompt บน Linux ของคุณสามารถปรับเปลี่ยนได้เพื่อให้มีประโยชน์และให้ข้อมูล ตัวอย่างด้านล่าง Default PS1 คือ "\s-\v\$" แสดง Shell Name และ Version Number ให้เปลี่ยนพฤติกรรม Default ให้แสดง Username, Hostname และ Current Working Directory Name
-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>"]
PS1 Codes ที่ใช้ในตัวอย่างนี้:
- \u – Username
- \h – Hostname
- \w – Full Pathname ของ Current Directory โปรดทราบว่าเมื่ออยู่ใน Home Directory จะแสดงแค่ ~
- มี Space ที่ท้ายค่า PS1 ส่วนตัวผมชอบ Space ท้าย Prompt เพื่อ Readability
ทำให้ Setting นี้ Permanent โดยเพิ่ม 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]
ในบทความต่อไป จะเขียนเกี่ยวกับ Practical Examples ของ PS1 อย่างละเอียด
2. PS2 – Continuation Interactive Prompt
Unix Command ยาวมากสามารถแยกเป็นหลายบรรทัดด้วย \ ที่ท้ายบรรทัด Default Interactive Prompt สำหรับ Multi-line Command คือ "> " ให้เปลี่ยนพฤติกรรม Default ให้แสดง "continue->" โดยใช้ PS2 Environment Variable
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]
ผมพบว่ามันช่วยให้อ่านง่ายและเข้าใจง่าย เมื่อแยก Long Commands เป็นหลายบรรทัดด้วย \ มีบางคนไม่ชอบแยก Long Commands คุณชอบแยก Long Commands เป็นหลายบรรทัดไหม?
3. PS3 – Prompt ที่ใช้โดย "select" ภายใน Shell Script
คุณสามารถกำหนด Custom Prompt สำหรับ Select Loop ภายใน Shell Script ได้ โดยใช้ PS3 Environment Variable
Shell Script และ Output WITHOUT 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]
Shell Script และ Output WITH 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" เพื่อ Prefix Tracing Output
PS4 Shell Variable กำหนด Prompt ที่แสดงเมื่อ Execute Shell Script ใน Debug Mode
Shell Script และ Output WITHOUT 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]
Shell Script และ Output WITH PS4:
PS4 ที่กำหนดใน ps4.sh ด้านล่างมี Code 2 ตัว:
$0– ชื่อ Script$LINENO– Line Number ปัจจุบันใน Script
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 Shell Execute เนื้อหาของ PROMPT_COMMAND ก่อนแสดง PS1 Variable
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]
If you liked this article, please bookmark it on del.icio.us and Stumble using the link provided below, under ‘What Next?’ section.