Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành Thạo Tùy Chỉnh Dấu Nhắc Bash: Điều Chỉnh PS1-PS4 và PROMPT_COMMAND

Thành Thạo Tùy Chỉnh Dấu Nhắc Bash: Điều Chỉnh PS1-PS4 và PROMPT_COMMANDTươ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 hiệu quả. PS là viết tắt của prompt statement. Bài viết này sẽ cho bạn khởi đầu về các biến môi trường dấu nhắc lệnh Linux sử dụng các ví dụ đơn giản.

1. PS1 – Dấu Nhắc Tương Tác Mặc Định

Dấu nhắc tương tác mặc định trên Linux của bạn có thể được sửa đổi như dưới đây thành một cái gì đó hữu ích và đầy thông tin. Trong ví dụ sau, PS1 mặc định là "\s-\v\$", hiển thị tên shell và số phiên bản. Hãy thay đổi hành vi mặc định này để hiển thị tên người dùng, hostname và tên thư mục làm việc hiện tại 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>"] 

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

  • \u – Tên người dùng
  • \h – Hostname
  • \w – Đường dẫn đầy đủ của thư mục hiện tại. Lưu ý khi bạn ở thư mục home, nó chỉ hiển thị ~ như trên
  • Lưu ý có một khoảng trắng ở cuối giá trị PS1. Cá nhân tôi thích khoảng trắng ở cuối dấu nhắc để dễ đọc hơn.

Làm cài đặt này vĩnh viễn bằng cách thêm export PS1="\u@\h \w> " vào .bash_profile (hoặc) .bashrc như dưới đây.

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 tiếp theo, tôi sẽ viết về một số ví dụ thực tế của việc sử dụng PS1 chi tiết.

2. PS2 – Dấu 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 đưa \ ở cuối dòng. Dấu nhắc tương tác mặc định cho lệnh nhiều dòng là "> ". Hãy thay đổi hành vi mặc định này để hiển thị "continue->" bằng biến môi trường PS2 như dưới đây.

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 rất hữu ích và dễ đọc, khi chia lệnh dài thành nhiều dòng dùng \. Tôi cũng thấy người khác không thích chia lệnh dài. Sở thích của bạn thế nào? Bạn có thích chia lệnh dài thành nhiều dòng không?

3. PS3 – Dấu Nhắc Dùng Bởi "select" Bên Trong Shell Script

Bạn có thể định nghĩa dấu nhắc tùy chỉnh cho vòng lặp select bên trong shell script, sử dụng biến môi trường PS3, như giải thích dưới.

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

Shell script và đầu ra CÓ 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 – Dùng Bởi "set -x" Để Tiền Tố Đầu Ra Theo Dõi

Biến shell PS4 định nghĩa dấu nhắc được hiển thị khi bạn thực thi shell script ở chế độ debug như dưới đây.

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

Shell script và đầu ra CÓ PS4:
PS4 định nghĩa dưới trong ps4.sh có hai mã sau:

  • $0 – chỉ tên script
  • $LINENO – hiển thị số dòng hiện tại trong 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 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 trên cùng dòng với PS1, dùng echo -n 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]