Me gustaría editar mi .bashrc para que cada comando ejecutado en el shell se canalice a algo, por ejemplo:
$ sudo apt update
_________________
< sudo apt update >
-----------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
He logrado algo bastante similar, pero no del todo:
$ bash
$ exec > >(cowsay)
$ echo "Hello AU!"
$ exit
_______
< Hello AU! >
-------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
No es el resultado deseado, ya que solo ocurre después de salir del shell actual.
Es principalmente para fines de diversión / aprendizaje.
command-line
bash
bashrc
M. Becerra
fuente
fuente
-n
bandera paracowsay
es útil; hace que conserve el espacio en blanco.Respuestas:
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 acowsay
, luego imprima ese carácter después de cada comando: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:
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 seread
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 decirread
que lea hasta que el carácter NULPor 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 queecho
.fuente
Puedes
trap
abusar de laDEBUG
señal de bash :Ejecución de ejemplo
Sin embargo, esto seguirá ejecutando el comando después. Gracias a ilkkachu encontré una forma de evitarlo :
fuente