Ви можете трохи адаптувати свій метод. Замість того, щоб прямувати cowsay
безпосередньо, читайте висновок до символу, що розмежовує, надішліть його cowsay
, а потім надрукуйте цей символ після кожної команди
exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
PROMPT_COMMAND='printf "\0"'
Тут я використовую символ ASCII NUL. Ви можете використовувати щось інше, що навряд чи з’явиться у командному виході.
Це буде надруковано після підказки, тож вихід буде некрасивим:
$ 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 |
|| ||
Зверніть увагу, що це порушить будь-яку команду, яка намагається складно вивести або має текстовий інтерфейс користувача (редактори командних рядків, пейджери тощо).
Якщо припустити, ви вже знаєте, що exec > >(...)
робить, участь у процесі заміни:
while IFS= read -d '' -r line; do ... done
: це досить поширена ідіома для читання даних, розмежованих символом ASCII NUL:
IFS=
встановлює IFS на порожній рядок, що вимикає розбиття поля
-r
перешкоджає read
лікуванню \
на вході спеціально (так, \n
наприклад, читається як\n
і не перетворюються в символ нового рядка).
-d ''
це спосіб сказати read
читати до символу NUL
Таким чином, вся справа перетворюється на введення в розділах, визначених NUL, при цьому максимально зберігаючи вміст введення.
if [[ -n $line ]]; then ... fi; done
- діяти лише в тому випадку, якщо введений до цього часу вхід не порожній.
echo; printf "%s\n" "$line" | cowsay;
- надрукуйте провідний порожній рядок, щоб вихід корів не зіткнувся із запитом, а потім надішліть прочитаний вхід до коровай. printf
надійніше і безпечніше echo
.
-n
прапора доcowsay
корисно; це змушує зберігати пробіли.