Вы можете немного адаптировать свой метод. Вместо прямого подключения к 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 обработку [ f10] на входе специально (поэтому, например, \n считывается как \n и не преобразуется в символ новой строки). -d '' - это способ сказать read читать до символа NUL. Таким образом, вся вещь проходит через ввод в разделах с разделителями NUL, сохраняя при этом содержимое ввода как можно больше. if [[ -n $line ]]; then ... fi; done - действовать, только если введенный ввод не пуст. echo; printf "%s\n" "$line" | cowsay; - печатает ведущую пустую строку, так что выход cowsay не сталкивается с приглашением, а затем посылает введенный до сих пор вход в cowsay. printf является более надежным и безопасным, чем echo.Вы можете немного адаптировать свой метод. Вместо прямого подключения к 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.Вы можете немного адаптировать свой метод. Вместо прямого подключения к 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.Вы можете trap и использовать сигнал DEBUG баха.
trap '$BASH_COMMAND | cowsay' DEBUG
$ trap '$BASH_COMMAND | cowsay' DEBUG
$ echo "AU is awesome!"
__________________
< "AU is awesome!" >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
AU is awesome!
Однако это все равно выполнит команду после этого. Благодаря ilkkachu я нашел способ обойти это:
$ shopt -s extdebug
$ trap '$BASH_COMMAND | cowsay; false' DEBUG
$ echo "AU is awesome!"
__________________
< "AU is awesome!" >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Вы можете trap и использовать сигнал DEBUG баха.
trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG
$ trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG
$ echo "AU is awesome!"
__________________
< AU is awesome! >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
AU is awesome!
Однако это все равно выполнит команду после этого. Благодаря ilkkachu я нашел способ обойти это:
$ shopt -s extdebug
$ trap 'bash -c "$BASH_COMMAND" | cowsay; false' DEBUG
$ echo "AU is awesome!"
__________________
< AU is awesome! >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Вы можете trap и использовать сигнал DEBUG баха.
trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG
$ trap 'bash -c "$BASH_COMMAND" | cowsay' DEBUG
$ echo "AU is awesome!"
__________________
< AU is awesome! >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
AU is awesome!
Однако это все равно выполнит команду после этого. Благодаря ilkkachu я нашел способ обойти это:
$ shopt -s extdebug
$ trap 'bash -c "$BASH_COMMAND" | cowsay; false' DEBUG
$ echo "AU is awesome!"
__________________
< AU is awesome! >
------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||