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

10 Tùy Chỉnh PS1 Chuyên Nghiệp Nâng Tầm Dấu Nhắc Linux Bash

10 Tùy Chỉnh PS1 Chuyên Nghiệp Nâng Tầm Dấu Nhắc Linux BashẢnh từ f1r3storm85

Trong bài trước, chúng ta đã thảo luận về các biến môi trường Linux PS[1-4] và PROMPT_COMMAND. Nếu dùng hiệu quả, PS1 có thể cung cấp thông tin giá trị ngay trên dấu nhắc lệnh.

Trong Tomb Raider, Angelina Jolie có tất cả gadget và vũ khí ở đầu ngón tay để giải quyết bí ẩn với phong cách. Mặc dù gadget và phong cách của Angelina Jolie khó bắt chước, nhưng ít nhất hãy thử làm cho dấu nhắc Linux cũ kỹ trở nên rất chức năng và phong cách bằng 10 ví dụ trong bài này.

1. Hiển thị tên người dùng, hostname và thư mục làm việc hiện tại trong dấu nhắc

PS1 trong ví dụ này hiển thị ba thông tin sau trong dấu nhắc:

  • \u – Tên người dùng
  • \h – Hostname
  • \w – Đường dẫn đầy đủ của thư mục làm việc hiện tại
-bash-3.2$ export PS1="\u@\h \w> "
ramesh@dev-db ~> cd /etc/mail
ramesh@dev-db /etc/mail>

2. Hiển thị Thời Gian Hiện Tại Trong Dấu Nhắc

Trong biến môi trường PS1, bạn có thể thực thi trực tiếp bất kỳ lệnh Linux nào, bằng cách chỉ định theo định dạng $(linux_command). Trong ví dụ sau, lệnh $(date) được thực thi để hiển thị thời gian hiện tại bên trong dấu nhắc.

ramesh@dev-db ~> export PS1="\u@\h [$(date +%k:%M:%S)]> "
ramesh@dev-db [11:09:56]>

Bạn cũng có thể dùng \t để hiển thị thời gian hiện tại ở định dạng hh:mm:ss như dưới đây:

ramesh@dev-db ~> export PS1="\u@\h [\t]> "
ramesh@dev-db [12:42:55]>

Bạn cũng có thể dùng \@ để hiển thị thời gian hiện tại ở định dạng 12 giờ am/pm như dưới đây:

ramesh@dev-db ~> export PS1="[\@] \u@\h> "
[04:12 PM] ramesh@dev-db>

3. Hiển thị Kết Quả Bất Kỳ Lệnh Linux Nào Trong Dấu Nhắc

Bạn có thể hiển thị đầu ra của bất kỳ lệnh Linux nào trong dấu nhắc. Ví dụ sau hiển thị ba mục được phân tách bằng | (pipe) trong dấu nhắc lệnh:

  • \!: Số lịch sử của lệnh
  • \h: hostname
  • $kernel_version: Đầu ra của lệnh uname -r từ biến $kernel_version
  • \$?: Trạng thái của lệnh cuối cùng
ramesh@dev-db ~> kernel_version=$(uname -r)
ramesh@dev-db ~> export PS1="\!|\h|$kernel_version|\$?> "
473|dev-db|2.6.25-14.fc9.i686|0>

4. Thay Đổi Màu Nền Trước Của Dấu Nhắc

Hiển thị dấu nhắc màu xanh dương, cùng với thông tin username, host và thư mục hiện tại

$ export PS1="\e[0;34m\u@\h \w> \e[m"
[Note: This is for light blue prompt]
$ export PS1="\e[1;34m\u@\h \w> \e[m"
[Note: This is for dark blue prompt]
  • \e[ – Bắt đầu dấu nhắc màu
  • x;ym – Mã màu. Sử dụng giá trị mã màu dưới đây.
  • \e[m – Kết thúc dấu nhắc màu

Bảng Mã Màu:

Black 0;30    Blue 0;34    Green 0;32    Cyan 0;36
Red 0;31      Purple 0;35  Brown 0;33
[Note: Thay 0 bằng 1 cho màu đậm]

Làm thay đổi màu vĩnh viễn bằng cách thêm các dòng sau vào .bash_profile hoặc .bashrc

STARTCOLOR='\e[0;34m'; ENDCOLOR="\e[0m"
export PS1="$STARTCOLOR\u@\h \w> $ENDCOLOR"

5. Thay Đổi Màu Nền Sau Của Dấu Nhắc

Thay đổi màu nền bằng cách chỉ định \e[{code}m trong dấu nhắc PS1 như dưới đây.

$ export PS1="\e[47m\u@\h \w> \e[m"
[Note: This is for Light Gray background]

Kết hợp nền và nền trước

export PS1="\e[0;34m\e[47m\u@\h \w> \e[m"
[Note: This is for Light Blue foreground and Light Gray background]

Thêm sau vào .bash_profile hoặc .bashrc để làm vĩnh viễn màu nền và nền trước trên.

STARTFGCOLOR='\e[0;34m'; STARTBGCOLOR="\e[47m"
ENDCOLOR="\e[0m"
export PS1="$STARTFGCOLOR$STARTBGCOLOR\u@\h \w> $ENDCOLOR"

Thử nghiệm với các mã màu nền sau và chọn cái phù hợp:

  • \e[40m
  • \e[41m
  • \e[42m
  • \e[43m
  • \e[44m
  • \e[45m
  • \e[46m
  • \e[47m

6. Hiển Thị Nhiều Màu Trong Dấu Nhắc

Bạn cũng có thể hiển thị nhiều màu trong cùng một dấu nhắc. Thêm hàm sau vào .bash_profile

function prompt {
  local BLUE="\[\033[0;34m\]"
  local DARK_BLUE="\[\033[1;34m\]"
  local RED="\[\033[0;31m\]"
  local DARK_RED="\[\033[1;31m\]"
  local NO_COLOR="\[\033[0m\]"
  case $TERM in
    xterm*|rxvt*)
      TITLEBAR='\[\033]0;\u@\h:\w\007\]'
      ;;
    *)
      TITLEBAR=""
      ;;
  esac
  PS1="\u@\h [\t]> "
  PS1="${TITLEBAR}\ $BLUE\u@\h $RED[\t]>$NO_COLOR "
  PS2='continue-> '
  PS4='$0.$LINENO+ '
}

Bạn có thể đăng nhập lại để thay đổi có hiệu lực hoặc source .bash_profile như dưới đây.

$. ./.bash_profile
$ prompt
ramesh@dev-db [13:02:13]>

7. Thay Đổi Màu Dấu Nhắc Sử Dụng tput

Bạn cũng có thể thay đổi màu của dấu nhắc PS1 sử dụng tput như dưới đây:

$ export PS1="\[$(tput bold)$(tput setb 4)$(tput setaf 7)\]\u@\h:\w $ \[$(tput sgr0)\]"

Khả Năng Màu Của tput:

  • tput setab [1-7] – Thiết lập màu nền sử dụng ANSI escape
  • tput setb [1-7] – Thiết lập màu nền
  • tput setaf [1-7] – Thiết lập màu nền trước sử dụng ANSI escape
  • tput setf [1-7] – Thiết lập màu nền trước

Khả Năng Chế Độ Văn Bản Của tput:

  • tput bold – Thiết lập chế độ in đậm
  • tput dim – Bật chế độ nửa sáng
  • tput smul – Bắt đầu chế độ gạch dưới
  • tput rmul – Thoát chế độ gạch dưới
  • tput rev – Bật chế độ đảo ngược
  • tput smso – Vào chế độ nổi bật (in đậm trên rxvt)
  • tput rmso – Thoát chế độ nổi bật
  • tput sgr0 – Tắt tất cả thuộc tính

Mã Màu Cho tput:

  • 0 – Đen
  • 1 – Đỏ
  • 2 – Xanh lá
  • 3 – Vàng
  • 4 – Xanh dương
  • 5 – Magenta
  • 6 – Cyan
  • 7 – Trắng

8. Tự Tạo Dấu Nhắc Của Bạn Sử Dụng Các Mã Có Sẵn Cho Biến PS1

Sử dụng các mã sau và tự tạo dấu nhắc PS1 Linux cá nhân hóa vừa chức năng vừa hợp gu. Mã nào từ danh sách này sẽ rất hữu ích cho sử dụng hàng ngày? Hãy để lại bình luận và cho biết bạn đã dùng mã PS1 nào cho dấu nhắc Linux của mình.

  • \a ký tự bell ASCII (07)
  • \d ngày ở định dạng "Weekday Month Date" (ví dụ: "Tue May 26")
  • \D{format} – định dạng được truyền cho strftime(3) và kết quả được chèn vào chuỗi dấu nhắc; định dạng rỗng dẫn đến biểu diễn thời gian đặc thù locale. Dấu ngoặc nhọn bắt buộc
  • \e ký tự escape ASCII (033)
  • \h hostname đến phần đầu tiên
  • \H hostname đầy đủ
  • \j số job hiện được quản lý bởi shell
  • \l basename của tên thiết bị terminal của shell
  • \n xuống dòng
  • \r return carriage
  • \s tên shell, basename của $0 (phần theo sau dấu slash cuối)
  • \t thời gian hiện tại định dạng 24-giờ HH:MM:SS
  • \T thời gian hiện tại định dạng 12-giờ HH:MM:SS
  • \@ thời gian hiện tại định dạng 12-giờ am/pm
  • \A thời gian hiện tại định dạng 24-giờ HH:MM
  • \u tên người dùng hiện tại
  • \v phiên bản bash (ví dụ: 2.00)
  • \V bản phát hành bash, phiên bản + cấp bản vá (ví dụ: 2.00.0)
  • \w thư mục làm việc hiện tại, với $HOME viết tắt bằng tilde
  • \W basename của thư mục làm việc hiện tại, với $HOME viết tắt bằng tilde
  • \! số lịch sử của lệnh này
  • \# số lệnh của lệnh này
  • \$ nếu UID hiệu lực là 0, là #, ngược lại là $
  • \nnn ký tự tương ứng với số bát phân nnn
  • \\ dấu gạch chéo ngược
  • \[ bắt đầu chuỗi ký tự không in, có thể dùng để nhúng chuỗi điều khiển terminal vào dấu nhắc
  • \] kết thúc chuỗi ký tự không in

9. Sử Dụng Hàm Shell Bash Bên Trong Biến PS1

Bạn cũng có thể gọi một hàm shell bash trong PS1 như dưới đây.

ramesh@dev-db ~> function httpdcount {
> ps aux | grep httpd | grep -v grep | wc -l
> }
ramesh@dev-db ~> export PS1="\u@\h [`httpdcount`]> "
ramesh@dev-db [12]>
[Note: This displays the total number of running httpd processes]

Bạn có thể thêm dòng sau vào .bash_profile hoặc .bashrc để làm vĩnh viễn thay đổi này:

function httpdcount {
  ps aux | grep httpd | grep -v grep | wc -l
}
export PS1='\u@\h [`httpdcount`]> '

10. Sử Dụng Shell Script Bên Trong Biến PS1

Bạn cũng có thể gọi một shell script bên trong biến PS1. Trong ví dụ dưới, ~/bin/totalfilesize.sh, tính tổng dung lượng file của thư mục hiện tại, được gọi bên trong biến PS1.

ramesh@dev-db ~> cat ~/bin/totalfilesize.sh
for filesize in $(ls -l . | grep "^-" | awk '{print $5}')
do
  let totalsize=$totalsize+$filesize
done
echo -n "$totalsize"
ramesh@dev-db ~> export PATH=$PATH:~/bin
ramesh@dev-db ~> export PS1="\u@\h [$(totalfilesize.sh) bytes]> "
ramesh@dev-db [534 bytes]> cd /etc/mail
ramesh@dev-db [167997 bytes]>
[Note: This executes the totalfilesize.sh to display the total file size of the current directory in the PS1 prompt] 

Bạn đã tùy chỉnh PS1 đến đâu? PS1 của bạn có thể đánh bại Angelina Jolie không? Để lại bình luận và chia sẻ giá trị PS1 của bạn.

Đọc Thêm

Bash Cookbook, tác giả Carl Albing, JP Vossen và Cameron Newham. Bash là một shell rất mạnh. Cuốn sách này sẽ giúp bạn thành thạo bash shell và trở nên hiệu quả cao. Dù bạn là sysadmin, DBA hay developer, bạn phải viết shell script ở một thời điểm nào đó. Một sysadmin khôn ngoan biết rằng khi đã thành thạo kỹ thuật shell-scripting, bạn có thể đặt máy chủ ở chế độ autopilot bằng cách để shell-script làm việc vất vả. Để đạt chế độ autopilot của sysadmin, bạn chắc chắn cần thành thạo các ví dụ trong cuốn cookbook này. Có khá nhiều sách về Bash shell. Nhưng cuốn này đứng đầu bằng cách đưa ra nhiều ví dụ chi tiết.

Đề xuất sách Linux thêm: 12 Cuốn Sách Linux Tuyệt Vời và Cần Thiết Làm Giàu Trí Tuệ và Thư Viện