Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Bash Shell:Kiểm soát PS1, PS2, PS3, PS4 và PROMPT_COMMAND

Bash Shell:Kiểm soát PS1, PS2, PS3, PS4 và PROMPT_COMMAND Tương tác của bạn với Linux Bash shell sẽ trở nên rất dễ chịu, nếu bạn sử dụng PS1, PS2, PS3, PS4 và PROMPT_COMMAND một cách hiệu quả. PS là viết tắt của câu lệnh nhắc nhở. Bài viết này sẽ cung cấp cho bạn một bước khởi động về các biến môi trường dấu nhắc lệnh Linux bằng các ví dụ đơn giản.

1. PS1 - Lời nhắc tương tác mặc định

Lời nhắc tương tác mặc định trên Linux của bạn có thể được sửa đổi như hình dưới đây thành một thứ hữu ích và nhiều thông tin. Trong ví dụ sau, PS1 mặc định là “\ s- \ v \ $”, hiển thị tên trình bao và số phiên bản. Hãy để chúng tôi thay đổi hành vi mặc định này để hiển thị tên người dùng, tên máy chủ và tên thư mục làm việc hiện tại như hình dưới đây.

-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] 

Các mã PS1 sau được sử dụng trong ví dụ này:

  • \ u - Tên người dùng
  • \ h - Tên máy chủ
  • \ w - Tên đường dẫn đầy đủ của thư mục hiện tại. Xin lưu ý rằng khi bạn đang ở trong thư mục chính, điều này sẽ chỉ hiển thị ~ như hình trên
  • Lưu ý rằng có một khoảng trắng ở cuối giá trị của PS1. Cá nhân tôi thích khoảng trống ở cuối lời nhắc để dễ đọc hơn.

Đặt cài đặt này vĩnh viễn bằng cách thêm xuất PS1 =”\ u @ \ h \ w>” vào .bash_profile (hoặc) .bashrc như được hiển thị bên dưới.

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]

Trong bài đăng tiếp theo, tôi sẽ viết chi tiết về một số ví dụ thực tế về việc sử dụng PS1.

2. PS2 - Lời nhắc tương tác tiếp tục

Một lệnh unix rất dài có thể được chia thành nhiều dòng bằng cách cho \ vào cuối dòng. Lời nhắc tương tác mặc định cho lệnh nhiều dòng là “>“. Hãy để chúng tôi thay đổi hành vi mặc định này để hiển thị “continue->” bằng cách sử dụng biến môi trường PS2 như được hiển thị bên dưới.

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]

Tôi thấy nó rất hữu ích và dễ đọc, khi tôi ngắt các lệnh dài của mình thành nhiều dòng bằng cách sử dụng \. Tôi cũng đã thấy những người khác không thích ngắt các lệnh dài. Sở thích của bạn là gì? Bạn có thích chia nhỏ các lệnh dài thành nhiều dòng không?

3. PS3 - Lời nhắc được sử dụng bởi "select" bên trong tập lệnh shell

Bạn có thể xác định lời nhắc tùy chỉnh cho vòng lặp chọn bên trong tập lệnh shell, bằng cách sử dụng biến môi trường PS3, như được giải thích bên dưới.

Tập lệnh shell và đầu ra KHÔNG CÓ 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]


Tập lệnh shell và đầu ra VỚI 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 - Được sử dụng bởi “set -x” để đầu ra theo dõi tiền tố

Biến shell PS4 xác định lời nhắc được hiển thị khi bạn thực thi một script shell ở chế độ gỡ lỗi như được hiển thị bên dưới.

Tập lệnh shell và đầu ra KHÔNG CÓ 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]


Tập lệnh shell và đầu ra VỚI PS4:
PS4 được định nghĩa bên dưới trong ps4.sh có hai mã sau:

  • $ 0 - cho biết tên của tập lệnh
  • $ LINENO - hiển thị số dòng hiện tại trong tập lệnh
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 thực thi nội dung của PROMPT_COMMAND ngay trước khi hiển thị biến 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]

Nếu bạn muốn hiển thị giá trị của PROMPT_COMMAND cùng dòng với PS1, hãy sử dụng echo -n như hình dưới đây.

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]

Nếu bạn thích bài viết này, vui lòng đánh dấu trang trên del.icio.us và Stumble bằng cách sử dụng liên kết được cung cấp bên dưới, trong phần "Tiếp theo là gì?".