Вы можете немного адаптировать свой метод. Вместо того, чтобы 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;
- выведите начальную пустую строку, чтобы вывод cowsay не конфликтовал с подсказкой, а затем отправьте введенные данные до сих пор в cowsay. printf
надежнее и безопаснее, чем echo
.
-n
флага дляcowsay
полезно; это заставляет это сохранять пробел.