Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

Bash Shell:เข้าควบคุม PS1, PS2, PS3, PS4 และ PROMPT_COMMAND

Bash Shell:เข้าควบคุม PS1, PS2, PS3, PS4 และ PROMPT_COMMANDการโต้ตอบของคุณกับ Linux Bash shell จะกลายเป็นเรื่องที่น่าพอใจมาก ถ้าคุณใช้ 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 – ข้อความโต้ตอบแบบโต้ตอบต่อเนื่อง

คำสั่ง unix ที่ยาวมากสามารถแบ่งออกเป็นหลายบรรทัดโดยให้ \ ที่ท้ายบรรทัด พรอมต์แบบโต้ตอบเริ่มต้นสำหรับคำสั่งหลายบรรทัดคือ “> “ ให้เราเปลี่ยนพฤติกรรมเริ่มต้นนี้เพื่อแสดง “continue->” โดยใช้ตัวแปรสภาพแวดล้อม PS2 ดังที่แสดงด้านล่าง

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 ที่กำหนดไว้ด้านล่างใน ps4.sh มีสองรหัสต่อไปนี้:

  • $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 shell ดำเนินการเนื้อหาของ PROMPT_COMMAND ก่อนแสดงตัวแปร PS1

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 โดยใช้ลิงก์ด้านล่าง ในส่วน "อะไรต่อไป"