Bạn có thể điều chỉnh phương pháp của mình một chút. Thay vì dẫn cowsay
trực tiếp, hãy đọc đầu ra cho đến khi ký tự phân cách, gửi đầu ra đó đến cowsay
, sau đó in ký tự đó sau mỗi lệnh:
exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
PROMPT_COMMAND='printf "\0"'
Ở đây, tôi đang sử dụng ký tự ASCII NUL. Bạn có thể sử dụng một cái gì đó không có khả năng xuất hiện trong đầu ra lệnh.
Điều này sẽ in sau lời nhắc, vì vậy đầu ra sẽ xấu:
$ export LC_ALL=C
$ exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
$ PROMPT_COMMAND='printf "\0"'
$ ls
$
______________________________________
/ Desktop Documents Downloads Music \
| Pictures Public Templates Videos
\ examples.desktop /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ echo foo
$
______
< foo >
------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Lưu ý rằng điều này sẽ phá vỡ bất kỳ lệnh nào thử đầu ra phức tạp hoặc có giao diện người dùng văn bản (nghĩ rằng các trình soạn thảo dòng lệnh, máy nhắn tin, v.v.).
Giả sử bạn đã biết những gì exec > >(...)
, phần trong quá trình thay thế là:
while IFS= read -d '' -r line; do ... done
: đây là một thành ngữ khá phổ biến để đọc dữ liệu được giới hạn bởi ký tự ASCII NUL:
IFS=
đặt IFS thành chuỗi trống, vô hiệu hóa tách trường
-r
ngăn không cho read
xử lý \
trong đầu vào một cách đặc biệt ( \n
ví dụ, vì vậy , được đọc dưới dạng \n
và không được chuyển đổi thành ký tự dòng mới).
-d ''
là cách read
để đọc cho đến khi ký tự NUL
Vì vậy, toàn bộ các vòng lặp trên đầu vào trong các phần được phân định bằng NUL, trong khi bảo tồn nội dung của đầu vào càng nhiều càng tốt.
if [[ -n $line ]]; then ... fi; done
- chỉ hành động nếu đầu vào đọc cho đến nay không trống.
echo; printf "%s\n" "$line" | cowsay;
- in một dòng trống hàng đầu, sao cho đầu ra coway không xung đột với dấu nhắc, và sau đó gửi đầu vào đọc cho đến coway. printf
đáng tin cậy và an toàn hơn echo
.
-n
cờ đểcowsay
hữu ích; nó làm cho nó bảo tồn khoảng trắng