Một thời gian ngắn, chúng tôi liệt kê 8 Lời nhắc hữu ích và thú vị Bash. Điều đó hóa ra lại là một trong những bài viết phổ biến nhất của chúng tôi và vẫn tạo ra phản hồi và phản hồi của người dùng. Lần này chúng tôi đã tìm thấy một vài đá quý hơn, cũng như một số mẹo và thủ thuật hữu ích để có dấu nhắc shell thú vị nhất trên khối ngôn ngữ.

Sử dụng những lời nhắc này

Một số lời nhắc sau đây là một lớp lót và có thể được dán trực tiếp vào thiết bị đầu cuối của bạn để sử dụng (tạm thời). Để đặt chúng vĩnh viễn, bạn sẽ phải dán mã vào .bashrc hoặc .bash_profile của mình .

Các lời nhắc lớn hơn, phức tạp hơn như Twtty nên được lưu vào tập tin kịch bản của riêng họ (như myprompt.sh), và bạn đặt một dòng như

 nguồn myprompt.sh 

trong tệp .basrc của bạn để "nhập" chúng.

Twtty Prompt

Đây là lời nhắc hai dòng chứa khá nhiều thông tin bao gồm tên người dùng, tên máy chủ, thư mục làm việc, thời gian và số lịch sử lệnh. Do sự phức tạp về mặt kỹ thuật và hình ảnh, tốt nhất nên đặt tập lệnh nhắc này trong tệp riêng của nó, sau đó mã nguồn từ tệp .bashrc hoặc .bash_profile của bạn như được mô tả ở trên.

 function prompt_command {TERMWIDTH = $ {COLUMNS} # Tính chiều rộng của dấu nhắc: hostnam = $ (echo -n $ HOSTNAME | sed -e "s /[\.].*//") # "whoami" và "pwd "bao gồm một dòng mới usernam = $ (whoami) cur_tty = $ (tty | sed -e" s /.* tty \ (. * \) / \ 1 / ") newPWD =" $ {PWD} "# Thêm tất cả phụ kiện bên dưới ... cho phép nhắc = $ (echo -n "- ($ {usernam} @ $ {hostnam}: $ {cur_tty}) --- ($ {PWD}) -" \ | wc -c | tr -d "") cho fillsize = $ {TERMWIDTH} - $ {promptsize} fill = "" trong khi ["$ fillsize" -gt "0"] điền fill = "$ {fill} -" let fillsize = $ {fillsize } -1 được thực hiện nếu ["$ fillsize" -lt "0"] sau đó để cắt = 3 - $ {fillsize} newPWD = "... $ (echo -n $ PWD | sed -e" s / \ (^. \ {$ cut \} \) \ (. * \) / \ 2 / ")" fi} PROMPT_COMMAND = prompt_command chức năng twtty {local GRAY = "\ [\ 033 [1; 30m \]" địa phương LIGHT_GRAY = "\ [ \ 033 [0; 37m \] "địa phương WHITE =" \ [\ 033 [1; 37m \] "địa phương NO_COLOUR =" \ [\ 033 [0m \] "địa phương LIGHT_BLUE =" \ [\ 033 [1; 34m \ ] "local YELLOW =" \ [\ 033 [1; 33m \] "case $ TERM in xterm *) TITLEBAR = '\ [\ 033] 0; \ u @ \ h: \ w \ 007 \]' ;; *) TITLEBAR = "" ;; esac PS1 = "$ TITLEBAR \ $ VÀNG- $ LIGHT_BLUE - (\ $ VÀNG \ $ usernam $ LIGHT_BLUE @ $ VÀNG \ $ hostnam $ LIGHT_BLUE: $ WHITE \ $ cur_tty \ $ {LIGHT_BLUE}) - $ {YELLOW} - \ $ {fill} $ {LIGHT_BLUE} - (\ $ YELLOW \ $ {newPWD} \ $ LIGHT_BLUE) - $ VÀNG- \ \ n \ $ VÀNG- $ LIGHT_BLUE - (\ $ VÀNG \ $ (ngày +% H% M) $ LIGHT_BLUE: $ YELLOW \ $ (ngày \ "+% a, % d% b% y \") \ $ LIGHT_BLUE: $ WHITE \ $$ LIGHT_BLUE) - \ $ VÀNG- \ $ NO_COLOUR "PS2 =" $ LIGHT_BLUE- $ VÀNG- $ VÀNG- $ NO_COLOUR "} 

Một điều quan trọng cần lưu ý về dấu nhắc này là thanh nằm ngang cân đối cho vừa với chiều rộng của thiết bị đầu cuối của bạn, và rằng đường dẫn thư mục làm việc sẽ cắt ngắn chính nó khi nó quá lớn.

Nếu bạn có bất kỳ vấn đề nào với đoạn mã trên, bạn có thể tải xuống phiên bản thuần văn bản tại đây.

Nhắc tối giản hiệu suất cao

Tất cả các phức tạp của một dấu nhắc lạ mắt như Twtty làm mất thêm chu kỳ CPU, và trong khi nó chắc chắn sẽ không xay hệ thống của bạn để ngăn chặn, nó có thể tăng lên. Nếu bạn muốn một cái gì đó mà gói rất nhiều thông tin mà không làm chậm bạn xuống, tôi đề nghị này:

 PS1 = "[\ d | \ T -> \ w ... \ $?] \ N #" 

Một điều thú vị cần lưu ý ở đây là việc sử dụng biến $? cuối cùng. Điều này biểu thị trạng thái thoát của lệnh cuối cùng được nhập. 0 có nghĩa là tất cả là tốt, bất kỳ số nào khác thường chỉ ra một lỗi.

Lời nhắc của Rob

Đây là một trong những lời nhắc phổ biến hơn nổi trên Internet. Mã nhỏ và đơn giản, nhưng nó cung cấp nhiều tính năng được tìm thấy trong các ví dụ lớn hơn, phức tạp hơn.

 PS1 = "\ [\ 033 [0; 33m \] [\!] \` Nếu [[\ $? = "0"]]; sau đó lặp lại "\\ [\\ 033 [32m \\]"; "\\ [\\ 033 [31m \\]"; fi \ `[\ u. \ H: \` nếu [[`pwd | wc -c | tr -d" "`> 18]]; sau đó lặp lại " \\ W "; else echo" \\ w "; fi \`] \ $ \ [\ 033 [0m \] "; echo -ne "\ 033] 0;` tên máy chủ -s`: `pwd` \ 007" 

MegaFancyPrompt

Tên này hoàn toàn xứng đáng - lời nhắc này khá lớn và cực kỳ lạ mắt. Nó có màu sắc, kiểm soát tiêu đề, nhận thức người dùng, phát hiện proxy, phát hiện màn hình, số công việc và hơn thế nữa. Trong ngắn hạn, chỉ cần về tất cả các tính năng được tìm thấy trong các nhắc nhở khác, chúng tôi đã đề cập có thể được tìm thấy ở đây, và khá một vài người khác. Nếu bạn muốn nó TẤT CẢ trong lời nhắc của bạn, đây là nó.

Lưu ý: Không phải tất cả các tính năng đều có thể nhìn thấy ở mọi lúc, vì vậy nó có thể không giống như trong ảnh chụp màn hình, bạn có thể xem toàn bộ tệp kịch bản (đã được tài liệu, nhận xét) tại đây để biết chi tiết về cách nhận các phần hiển thị mà bạn muốn.

 COLOR_WHITE = '\ 033 [1; 37m' COLOR_LIGHTGRAY = '033 [0; 37m' COLOR_GRAY = '\ 033 [1; 30m' COLOR_BLACK = '\ 033 [0; 30m' COLOR_RED = '\ 033 [0; 31m' COLOR_LIGHTRED = '\ 033 [1; 31m' COLOR_GREEN = '\ 033 [0; 32m' COLOR_LIGHTGREEN = '\ 033 [1; 32m' COLOR_BROWN = '\ 033 [0; 33m' COLOR_YELLOW = '\ 033 [1; 33m' COLOR_BLUE = '\ 033 [0; 34m' COLOR_LIGHTBLUE = '\ 033 [1; 34m' COLOR_PURPLE = '\ 033 [0; 35m' COLOR_PINK = '\ 033 [1; 35m' COLOR_CYAN = '\ 033 [0; 36m' COLOR_LIGHTCYAN = '\ 033 [1; 36m' COLOR_DEFAULT = '\ 033 [0m' # Hàm để đặt prompt_command thành. function promptcmd () {history -a local SSH_FLAG = 0 local TTY = $ (tty | awk -F / dev / '{print $ 2}') nếu [[$ {TTY}]]; sau đó địa phương SESS_SRC = $ (người | grep "$ TTY" | awk '{print $ 6}') fi # Titlebar case $ {TERM} trong xterm *) địa phương TITLEBAR = '\ [\ 033] 0; \ u @ \ h : {\ w} \ 007 \] ';; *) TITLEBAR địa phương = '' ;; esac PS1 = "$ {TITLEBAR}" # Kiểm tra để thay đổi ngày. nếu [-z $ DAY]; sau đó xuất DAY = $ (ngày +% A) khác địa phương ngày hôm nay = $ (ngày +% A) nếu ["$ {DAY}"! = "$ {today}"]; sau đó PS1 = "$ {PS1} \ n \ [$ {COLOR_GREEN} \] Ngày thay đổi thành $ (ngày '+% A, % d% B% Y'). \ n" xuất DAY = $ fi fi # Người dùng nếu [$ {UID} -eq 0]; sau đó nếu ["$ {USER}" == "$ {LOGNAME}"]; sau đó nếu [[$ {SUDO_USER}]]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ u" khác PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ u" khác PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ u "fi khác nếu [$ {USER} == $ {LOGNAME}]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ u" khác PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ u" fi fi # HTTP Proxy var được cấu hình hay không nếu [- n "$ http_proxy"]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] @" khác PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] @" fi # Lưu trữ nếu [[$ {SSH_CLIENT}]] || [[$ {SSH2_CLIENT}]]; sau đó SSH_FLAG = 1 fi nếu [$ {SSH_FLAG} -eq 1]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_CYAN} \] \ h" elif [[-n $ {SESS_SRC}]]; sau đó nếu ["$ {SESS_SRC}" == "(: 0.0)"]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" địa phương khác parent_process = `cat / proc / $ {PPID} / cmdline` nếu [[" $ parent_process "==" in.rlogind * " ]]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \] \ h" elif [["$ parent_process" == "in.telnetd *"]]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] \ h" khác PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \] \ h" fi fi elif [["$ {SESS_SRC}" = = ""]]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] \ h" khác PS1 = "$ {PS1} \ [$ {COLOR_RED} \] \ h" fi # Các phiên màn hình tách ra địa phương DTCHSCRN = $ (màn hình - ls | grep -c Detach) nếu [$ {DTCHSCRN} -gt 2]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [scr: $ {DTCHSCRN}]" elif [$ {DTCHSCRN} -gt 0]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [scr: $ {DTCHSCRN}]" fi # Các công việc đang chạy nền cục bộ BKGJBS = $ (jobs -r | wc -l) nếu [$ {BKGJBS} - gt 2]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [bg: $ {BKGJBS}]" elif [$ {BKGJBS} -gt 0]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [bg: $ {BKGJBS}]" fi # Ngưng việc làm STPJBS địa phương = $ (jobs -s | wc -l) nếu [$ {STPJBS} -gt 2]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_RED} \] [stp: $ {STPJBS}]" elif [$ {STPJBS} -gt 0]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \] [stp: $ {STPJBS}]" fi # Bracket {if [$ {UID} -eq 0]; sau đó nếu ["$ {USER}" == "$ {LOGNAME}"]; sau đó nếu [[$ {SUDO_USER}]]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" khác PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \]" fi khác PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else if [" $ {USER} "==" $ {LOGNAME} "]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" khác PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1} {" # Thư mục hoạt động nếu [ -w "$ {PWD}"]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \] $ (prompt_workingdir)" khác PS1 = "$ {PS1} \ [$ {COLOR_RED} \] $ (prompt_workingdir)" fi # Đóng khung} và $ \ # if [$ {UID} -eq 0]; sau đó nếu ["$ {USER}" == "$ {LOGNAME}"]; sau đó nếu [[$ {SUDO_USER}]]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_RED} \]" khác PS1 = "$ {PS1} \ [$ {COLOR_LIGHTRED} \]" fi khác PS1 = "$ {PS1} \ [$ {COLOR_YELLOW} \ ] "fi else if [" $ {USER} "==" $ {LOGNAME} "]; sau đó PS1 = "$ {PS1} \ [$ {COLOR_GREEN} \]" khác PS1 = "$ {PS1} \ [$ {COLOR_BROWN} \]" fi fi PS1 = "$ {PS1}} \ $ \ [$ { COLOR_DEFAULT} \] "} # Cắt thư mục làm việc đến 1/4 hàm chiều rộng màn hình prompt_workingdir () {local pwdmaxlen = $ (($ COLUMNS / 4)) trunc_symbol =" ... "nếu [[$ PWD == $ NHÀ* ]]; thì newPWD = "~ $ {PWD # $ HOME}" khác newPWD = $ {PWD} fi nếu [$ {# newPWD} -gt $ pwdmaxlen]; thì pwdoffset cục bộ = $ (($ {# newPWD} - $ pwdmaxlen + 3)) newPWD = "$ {trunc_symbol} $ {newPWD: $ pwdoffset: $ pwdmaxlen}" fi echo $ newPWD} # Xác định lời nhắc hiển thị: # 1. Hiển thị dấu nhắc tùy chỉnh đơn giản cho các phiên trình bao bắt đầu # theo tập lệnh. # 2. Hiển thị lời nhắc "nhạt nhẽo" cho các phiên trình bao trong các emacs hoặc # xemacs. # 3 Hiển thị nhắc nhở cho tất cả các trường hợp khác. function load_prompt () {# Nhận PIDs local parent_process = $ (cat / proc / $ PPID / cmdline | cut -d \. -f 1) local my_process = $ (cat / proc / $$ / cmdline | cắt -d \. -f 1) nếu [[$ parent_process == script *]]; sau đó PROMPT_COMMAND = "" PS1 = "\ t - \ # - \ u @ \ H {\ w} \ $" elif [[$ $ parent_process == emacs * || $ parent_process == xemacs *]]; sau đó PROMPT_COMMAND = "" PS1 = "\ u @ \ h {\ w} \ $" khác xuất ngày DAY = $ (ngày +% A) PROMPT_COMMAND = promptcmd fi xuất PS1 PROMPT_COMMAND} load_prompt 

Tiền thưởng - Tìm Màu phù hợp

Như bạn có thể nhận thấy, hầu hết các lời nhắc này sử dụng màu sắc, và màu sắc thường được biểu diễn dưới dạng mã hoá như '\ 033 [1; 30m', điều này khá khó đọc hoặc ghi nhớ. Một cách dễ dàng để xem tất cả các màu sẵn có của bạn và xem trước những gì chúng sẽ trông như thế nào, chỉ cần dán đoạn mã sau vào trình duyệt của bạn:

 cho tôi trong `seq 1 7; seq 30 48; seq 90 107 `; làm echo -e "\ e [$ {i} mtest \ e [0m $ i" đã hoàn thành 

Mà sẽ xuất mỗi mã màu với số của nó.

Phần kết luận

Có, tất nhiên các biến thể vô hạn có thể được đóng gói vào dấu nhắc của bạn. Gần như bất kỳ loại dữ liệu văn bản có thể được thêm vào, và các nhà phát triển của bash đã có nhiều thập kỷ để thêm vào chức năng. Một số độc giả thậm chí còn bình luận về việc chạy các kịch bản lệnh Python hoặc Ruby tùy chỉnh từ bên trong dấu nhắc. Bất cứ điều gì bạn làm, làm cho nó hoạt động, và nếu nó thực sự mát mẻ, hãy thả cho chúng tôi một liên kết trong các ý kiến!