Chạy lolcat sau mỗi lệnh?


3

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?

nhập mô tả hình ảnh ở đây

Câu trả lời:


5

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 lolcattự động vào $PS1_colorlessvà 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ờ:

thời gian loly ruby

Tôi đã chọn để sử dụng PS1chứ không phải PROMPT_COMMANDvì tôi muốn để có thể sử dụng escape sequences nhắc bash như \h, \Wvv mà sẽ không thể có PROMPT_COMMANDkể từ khi tôi cần phải vượt qua nó để PS1mở 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 \hnhư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 lolcatchạy ngay cả khi đầu ra đang được dẫn đến sed. lolcatmặ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 sedcú pháp bao quanh cú pháp màu ansi, chẳng hạn như ESC[38;5;184m( ESClà ký tự điều khiển \033) với các ký tự điều khiển SOHSTXdo đó nó trở thành SOHESC[38;5;184mSTX. SOHSTXchỉ \[\]tương ứng trong các ký tự điều khiển nhắc bash. Tôi phải sử dụng SOHSTXđiều khiển các ký tự thay vì \[\]vì tôi đang tạo màu sắc linh hoạt. \[\]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. \[\]sẽ hoạt động nếu bạn đã sử dụng PROMPT_COMMANDđể tạo đầu ra cho PS1nhưng sau đó tôi sẽ không thể sử dụng \u\Wbởi vì lolcat sẽ được chạy trước khi chuyển \usang PS1mở 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 SOHSTXđượ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^Blà 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:

thời gian trăn

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_colorlessvà 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 hiện đang cố gắng tìm ra cách tăng tốc nó với các cổng của lolcat. Có một triển khai trong C và trong Python. Chưa thử Python một lần và tôi không thể lấy C để biên dịch trên mac os. Không chắc chắn nếu musl có thể được xây dựng trên mac os. C: github.com/jaseg/lolcat Python: github.com/tehmaze/lolcat Đây là Ruby mà tôi hiện đang sử dụng: github.com/busyloop/lolcat
dosentmatter

2

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)

Sửa đổi PS1

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 $PS1và 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 lslà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 lslệnh trước khi hiển thị dấu nhắc.

Sử dụng biến PROMPT_COMMAND

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 lslà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.


Đã thêm hình ảnh cho lý do .. :) sẽ kiểm tra điều này và xem nó hoạt động như thế nào!
Bryce Snyder

Được rồi, vì vậy nó cần phải như thế này .. ls | lolcat, điều này sẽ làm việc với trailing? hoặc tôi có thể thêm nó lolcat | ls?
Bryce Snyder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.