Never ask how to use, just wonder how to make...

Mar 22, 2009

Làm chủ Linux Bash shell: Tùy biến command promt với biến $PS1


Tiếp tục seri bài làm chủ Linux Bash shell nào. Bài viết này được tôi dựa vào một tutorial của tôi trên FOTECH và mở rộng thêm, nếu bạn nào thấy hơi quen xin đừng thắc mắc >:).

Bash shell có khả năng hiển thị trước mỗi dòng lệnh một đoạn thông tin ngắn, gọi là dấu nhắc lệnh, hay command promt. Mặc định có dạng:
[user]@[host]:[đường dẫn]$
VD:
thangphamduy@mr-PC:~$
Bạn có thể tùy biến bằng cách sửa lại giá trị của biến môi trường PS1 như sau:
PS1='[Noi dung muon hien thi]'
VD: nếu dòng trên có nội dung là:
PS1='Welcome to my Linux '
thì trước mỗi dòng lệnh sẽ hiển thị đúng xâu trên.

Bạn có thể tùy biến xâu [Noi dung muon hien thi] bằng cách chèn vào một ký tự sau dấu thoát (backslash \) như sau:
\! Hiển thị số thứ tự của lệnh trong history
\# Hiển thị số thứ tự lệnh của lệnh hiện tại
\$ Hiển thị dấu $ nếu là user bình thường và dấu # nếu là user root
\\ Hiển thị dấu backslash (\)
\d Hiển thị ngày hiện tại
\h Hiển thị host name
\n In dấu xuống dòng
\s Hiển thị tên shell
\t Hiển thị giờ hiện tại
\u Hiển thị username
\W Hiển thị tên thư mục hiện hành
\w Hiển thị đường dẫn đầy đủ của thư mục hiện hành
Ví dụ:
PS1='\u\$'
sẽ cho kết quả: "root#"
PS1='\u@\t \w\$'
sẽ cho kết quả: "root@20:49:48 /etc/httpd#
PS1='\t \u@\h \s \$'
sẽ cho kết quả: "20:49:48 root@proLappy -bash #"
[*]Hiển thị màu:
Bạn thử thiết lập biến PS1 như sau và xem kết quả như thế nào ^^
PS1='\[\033[01;32m\]\t \u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
Bây giờ dấu nhắc lệnh đã có màu xanh lá cây :D. Quy tắc ở đây là thư thế nào? Nếu bạn muốn đặt một màu cho một phần tử nào đó của promt, bạn hãy đặt mã màu trước phần tử đó, và mã xóa màu sau phần tử đó.

Mã màu có dạng:
\[\033\[01;32m\]\]
Hãy thay thế 32 với các số trong khoảng 30 - 37 để nhận được các màu khác nhau, thay thế 01 với các số trong khoảng 00 - 07 để nhận được các cách tô màu khác nhau (làm nhạt màu, màu gạch chân, màu highlight,...)

Mã đóng màu:
\[\033[00m\]
[*] Lưu ý:
- Nếu bạn không sử dụng mã đóng màu thì màu đó sẽ còn hiệu lực cho tới khi bạn dùng một mã màu khác thay thế.
- Việc thiết lập mã màu chỉ có ý nghĩa với những terminal có hỗ trợ màu 16bit trở lên như xterm, rxvt, hay gnome-terminal, konsole,...

Okie. Như thế là bạn đã có thể thêm các thông tin hữu ích và đẹp mắt vào trước mỗi dòng lệnh trong terminal. Nhưng nếu bạn logout, giá trị vừa thiết lập cho biến $PS1 sẽ bị reset về giá trị default! Để không phải thiết lập lại giá trị của biến này, hãy thêm vào cuối file ~/.bashrc dòng lệnh sau để export giá trị mới cho biến môi trường PS1:
export PS1='\n\[\033[02;31m\]. ___ ___ ___\[\033[00m\] |--- \[\033[02;33m\]\t \d\n\[\033[02;31m\] /__// _// ./\[\033[00m\] --- \[\033[01;32m\]\w\n\[\033[02;31m\]/ . / \ /__/\[\033[00m\] \[\033[02;35m\]\u@\h \[\033[02;37m\]\$ \[\033[02;38m\]'
Chúc các bạn ngày chủ nhật vui vẻ.

Update: Để xem danh sách các mã màu và một số ví dụ khác, xin đọc entry Command promt và biến PS1 trên blog của tuyetkiem.