Tôi đang cố gắng thêm một bí danh cho lolcat sẽ gọi sau mỗi lệnh được đưa vào thiết bị đầu cuối.
Tôi chỉ biết làm thế nào để thêm nó vào các mục, bất cứ ai biết làm thế nào để làm cho nó một đầu ra tiêu chuẩn?
Tôi đang cố gắng thêm một bí danh cho lolcat sẽ gọi sau mỗi lệnh được đưa vào thiết bị đầu cuối.
Tôi chỉ biết làm thế nào để thêm nó vào các mục, bất cứ ai biết làm thế nào để làm cho nó một đầu ra tiêu chuẩn?
Câu trả lời:
CẬP NHẬT
Tôi đặt triển khai của mình ở đây với hướng dẫn cài đặt:
https://github.com/dosentmatter/rainbow-bash-prompt
Nó sử dụng triển khai C của lolcat nhưng tôi đã sửa đổi nó một chút để làm cho nó ngẫu nhiên.
TRẢ LỜI
Đây là cách tôi đã làm nó. Thêm phần này vào .bashrc
:
PS1_colorless=${PS1:-'\h:\W \u\$ '}
ESC=$(echo -e '\033')
SOH=$(echo -e '\001')
STX=$(echo -e '\002')
PS1_color_wrap='s/'$ESC'\\[[[:digit:];]*m/'$SOH'&'$STX'/g'
PS1="\$(lolcat -f <<< \"$PS1_colorless\" | sed '$PS1_color_wrap')"
Nó hoạt động bằng cách chạy lolcat
tự động vào $PS1_colorless
và làm một sed
để thêm vào ký tự điều khiển để ngắt dòng hoạt động chính xác.
Phải mất ít hơn 200 mili giây để chạy. Vì vậy, nó có thể là quá chậm đối với bạn. Đây là một ví dụ tôi đã hẹn giờ:
Tôi đã chọn để sử dụng PS1
chứ không phải PROMPT_COMMAND
vì tôi muốn để có thể sử dụng escape sequences nhắc bash như \h
, \W
vv mà sẽ không thể có PROMPT_COMMAND
kể từ khi tôi cần phải vượt qua nó để PS1
mở rộng trước khi chạy lolcat
. Bạn có thể sử dụng các lựa chọn thay thế như ${HOSTNAME%%.*}
để bắt chước hành vi của \h
nhưng tôi không nghĩ bạn có thể làm điều đó cho một cái gì đó như
\# the command number of this command
Nó sử dụng -f
để buộc lolcat
chạy ngay cả khi đầu ra đang được dẫn đến sed
. lolcat
mặc định không xuất ra bất cứ thứ gì nếu đầu ra không đến tty.
Sau khi thực hiện lolcat
, nó thực hiện một sed
cú pháp bao quanh cú pháp màu ansi, chẳng hạn như ESC[38;5;184m
( ESC
là ký tự điều khiển \033
) với các ký tự điều khiển SOH
và STX
do đó nó trở thành SOHESC[38;5;184mSTX
. SOH
và STX
chỉ \[
và \]
tương ứng trong các ký tự điều khiển nhắc bash. Tôi phải sử dụng SOH
và STX
điều khiển các ký tự thay vì \[
và \]
vì tôi đang tạo màu sắc linh hoạt. \[
và \]
sẽ không hoạt động vì chúng được dịch để điều khiển các ký tự khi PS1
được phân tích cú pháp đầu tiên. \[
và \]
sẽ hoạt động nếu bạn đã sử dụng PROMPT_COMMAND
để tạo đầu ra cho PS1
nhưng sau đó tôi sẽ không thể sử dụng \u
và\W
bởi vì lolcat sẽ được chạy trước khi chuyển \u
sang PS1
mở rộng.
Để tham khảo: https://stackoverflow.com/questions/24839271/bash-ps1-line-wrap-su-with-non-printing-char character-from-an-external-command
Các ký tự được bao quanh SOH
và STX
được coi là các ký tự không in. Điều này là bắt buộc để việc ngắt dòng hoạt động chính xác và không coi màu ansi là các ký tự hiển thị thực tế.
Nếu bạn muốn sử dụng các ký tự điều khiển không thể in bằng chữ, bạn có thể thay thế
điều này
ESC=$(echo -e '\033')
SOH=$(echo -e '\001')
STX=$(echo -e '\002')
PS1_color_wrap='s/'$ESC'\\[[[:digit:];]*m/'$SOH'&'$STX'/g'
Với cái này
PS1_color_wrap='s/^[\\[[[:digit:];]*m/^A&^B/g'
Lưu ý ^[
, ^A
và ^B
là ký tự điều khiển theo nghĩa đen, do đó bạn không thể chỉ cần sao chép và dán. Bạn sẽ phải sử dụng một cái gì đó như vim để nhập chúng
Trong vim:
^[
== Ctrl+ vEschoặc Ctrl+vo033
^A
== Ctrl+ vCtrl+ ahoặc Ctrl+vo001
^B
== Ctrl+ vCtrl+ bhoặc Ctrl+vo002
EDIT (nhanh hơn một chút trong python) : Con trăn dường như chạy nhanh hơn một chút:
Thay đổi các biến này trong .bash_profile của bạn:
PS1_colorless=${PS1:-'\h:\W \u\$'}
PS1_newline="tr -d '\n'"
PS1_spacing=' '
PS1="\$(lolcat -F 6 -p 25 -f <<< \"$PS1_colorless\" | $PS1_newline | sed '$PS1_color_wrap')"
PS1+=$PS1_spacing
Phiên bản python có thêm dòng mới trong đầu ra vì vậy tôi loại bỏ chúng bằng tr
. Nó cũng loại bỏ các dấu cách để tôi loại bỏ các dấu cách từ PS1_colorless
và thêm chúng trở lại với PS1_spacing
.
Bạn có thể lấy nó ở đây: https://github.com/tehmaze/lolcat
Tôi sẽ cập nhật nếu tôi sử dụng cổng C: https://github.com/jaseg/lolcat
Tôi không thể lấy nó để xây dựng trên hệ điều hành mac. Nếu bất cứ ai có thể làm cho nó hoạt động trên hệ điều hành linux hoặc mac, xin vui lòng cho tôi biết.
Tại sao chính xác bạn muốn làm điều này nằm ngoài tôi, nhưng có hai cách bạn có thể thực hiện điều này:
1) bạn có thể đặt lệnh trong biến PS1 (biến điều khiển dấu nhắc của bạn)
hoặc là...
2) Sử dụng biến PROMPT_COMMAND (ưu tiên)
Ví dụ: lời nhắc của bạn có thể mặc định hiển thị tên máy chủ và tên người dùng:
Allans-iMac:~ allan
Để xem mã, nhập echo $PS1
và chúng tôi nhận được:
\h:\W \u\$
Tương đương với tên máy chủ, thư mục làm việc, tên người dùng và ký hiệu đô la.
Để chạy một lệnh (sử dụng ls
làm ví dụ), chỉ cần thêm nó kèm theo backticks và gán nó cho PS1:
PS1=`ls`"\h:\W \u\$"
Bây giờ, mỗi khi một lệnh được thực thi, thành công hay không, nó sẽ đưa ra ls
lệnh trước khi hiển thị dấu nhắc.
Giống như ở trên, nhưng lần này bạn đặt biến PROMPT_COMMAND với lệnh bạn muốn thực thi. Một lần nữa sử dụng ls
làm ví dụ:
PROMPT_COMMAND=ls
Bây giờ, không phải sửa đổi giá trị PS1 (prompt), bạn có thể có lệnh thực thi mỗi lần.
Bạn có thể đặt một trong hai giá trị này vĩnh viễn trong .bash_profile trong thư mục chính của người dùng.