Puedes adaptar tu método un poco. En lugar de canalizar cowsay
directamente, lea la salida hasta un carácter delimitador, envíe esa salida a cowsay
, luego imprima ese carácter después de cada comando:
exec > >(while IFS= read -d '' -r line; do if [[ -n $line ]]; then echo; printf "%s\n" "$line" | cowsay; fi; done)
PROMPT_COMMAND='printf "\0"'
Aquí, estoy usando el carácter ASCII NUL. Puede usar algo más que es poco probable que aparezca en la salida del comando.
Esto se imprimirá después de la solicitud, por lo que el resultado será feo:
$ 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 |
|| ||
Tenga en cuenta que esto interrumpirá cualquier comando que intente resultados complejos o tenga una interfaz de usuario de texto (piense en editores de línea de comandos, buscapersonas, etc.).
Suponiendo que ya sabe lo que exec > >(...)
hace, la parte en la sustitución del proceso es:
while IFS= read -d '' -r line; do ... done
: este es un idioma bastante común para leer datos delimitados por el carácter ASCII NUL:
IFS=
establece el IFS en la cadena vacía, lo que deshabilita la división de campos
-r
evita que se read
trate especialmente \
en la entrada ( \n
por ejemplo, se lee como \n
y no se convierte al carácter de nueva línea).
-d ''
es la forma de decir read
que lea hasta que el carácter NUL
Por lo tanto, todo se repite sobre la entrada en secciones delimitadas por NUL, mientras se preserva el contenido de la entrada tanto como sea posible.
if [[ -n $line ]]; then ... fi; done
- solo actúa si la entrada leída hasta ahora no está vacía.
echo; printf "%s\n" "$line" | cowsay;
- imprima una línea vacía inicial, para que la salida de cowsay no entre en conflicto con la solicitud, y luego envíe la entrada leída hasta ahora a cowsay. printf
es más fiable y más seguro que echo
.
-n
bandera paracowsay
es útil; hace que conserve el espacio en blanco.