¿Ejecutar lolcat después de cada comando?

3

Estoy tratando de agregar un alias para lolcat que se invocará después de cada comando puesto en la terminal.

Sólo sé cómo agregarlo a los elementos seleccionados. ¿Alguien sabe cómo convertirlo en una salida estándar?

    
pregunta Bryce Snyder 23.09.2016 - 18:51

2 respuestas

5

ACTUALIZAR

Pongo mi implementación aquí con instrucciones de instalación:

enlace

Utiliza la implementación en C de lolcat, pero la modifiqué un poco para que sea psuedo-random.

ANTIGUA RESPUESTA

Así es como lo hice. Agrega esto a tu .bashrc :

PS1_colorless=${PS1:-'\h:\W \u\$ '}

ESC=$(echo -e '3')
SOH=$(echo -e '
\#     the command number of this command
1') STX=$(echo -e '
ESC=$(echo -e '3')
SOH=$(echo -e '
PS1_color_wrap='s/^[\[[[:digit:];]*m/^A&^B/g'
1') STX=$(echo -e '
PS1_colorless=${PS1:-'\h:\W \u\$'}
PS1_newline="tr -d '\n'"
PS1_spacing=' '
PS1="\$(lolcat -F 6 -p 25 -f <<< \"$PS1_colorless\" | $PS1_newline | sed '$PS1_color_wrap')"
PS1+=$PS1_spacing
2') PS1_color_wrap='s/'$ESC'\[[[:digit:];]*m/'$SOH'&'$STX'/g'
2') PS1_color_wrap='s/'$ESC'\[[[:digit:];]*m/'$SOH'&'$STX'/g' PS1="\$(lolcat -f <<< \"$PS1_colorless\" | sed '$PS1_color_wrap')"

Funciona ejecutando lolcat dinámicamente en $PS1_colorless y haciendo un sed para agregar caracteres de control para que el ajuste de línea funcione correctamente.

Se tarda un poco menos de 200 milisegundos en ejecutarse. Así que puede ser demasiado lento para ti. Aquí hay un ejemplo que cronometré:

ElegíusarPS1ynoPROMPT_COMMANDporquequeríapoderusarlassecuenciasdeescapedelmensajedebashcomo\h,\W,etc.quenoseríanposiblesconPROMPT_COMMANDyaquenecesitopasarloaPS1paralaexpansiónantesdeejecutarlolcat.Puedesusaralternativascomo${HOSTNAME%%.*}paraimitarelcomportamientode\h,peronocreoquepuedashacerloporalgocomo

PS1_colorless=${PS1:-'\h:\W\u\$'}ESC=$(echo-e'3')SOH=$(echo-e'
\#thecommandnumberofthiscommand
1')STX=$(echo-e'
ESC=$(echo-e'3')SOH=$(echo-e'
PS1_color_wrap='s/^[\[[[:digit:];]*m/^A&^B/g'
1')STX=$(echo-e'
PS1_colorless=${PS1:-'\h:\W\u\$'}PS1_newline="tr -d '\n'"
PS1_spacing=' '
PS1="\$(lolcat -F 6 -p 25 -f <<< \"$PS1_colorless\" | $PS1_newline | sed '$PS1_color_wrap')"
PS1+=$PS1_spacing
2') PS1_color_wrap='s/'$ESC'\[[[:digit:];]*m/'$SOH'&'$STX'/g'
2') PS1_color_wrap='s/'$ESC'\[[[:digit:];]*m/'$SOH'&'$STX'/g' PS1="\$(lolcat -f <<< \"$PS1_colorless\" | sed '$PS1_color_wrap')"

Utiliza -f para forzar que lolcat se ejecute a pesar de que la salida se canaliza a sed . lolcat por defecto no genera nada si la salida no está en un tty.

Después de hacer lolcat , hace un sed para rodear la sintaxis de color ansi como ESC[38;5;184m ( ESC es el carácter de control 3 ) con los caracteres de control SOH y STX por lo que se convierte en SOHESC[38;5;184mSTX . SOH y STX son solo \[ y \] respectivamente en los caracteres de control de mensaje de bash. Tengo que usar los caracteres de control SOH y STX en lugar de \[ y \] porque estoy generando colores dinámicamente. \[ y \] no funcionarán porque se convierten en caracteres de control cuando PS1 se analiza por primera vez. \[ y \] funcionarían si usara PROMPT_COMMAND para generar un resultado para PS1 pero entonces no podría usar \u y \W porque lolcat se habría ejecutado antes de aprobar \u a PS1 para expansión.

Para referencia: enlace

Los caracteres rodeados por SOH y STX se tratan como caracteres que no se imprimen. Esto es necesario para que el ajuste de línea funcione correctamente y no trate el color ANSI como caracteres visibles reales.

Si desea utilizar caracteres de control literales no imprimibles, puede reemplazar

esto

%pre%

con esto

%pre%

Tenga en cuenta que ^[ , ^A y ^B son los caracteres de control literales, por lo que no puede copiar y pegar. Tendrías que usar algo como vim para ingresarlos

En vim:

^[ == Ctrl+v Esc o Ctrl + v o 0 3 3

^A == Ctrl+v Ctrl + a o Ctrl + v o 0 0 1

^B == Ctrl+v Ctrl + b o Ctrl + v o 0 0 2

EDITAR (un poco más rápido en python) : El python uno parece correr un poco más rápido:

Cambieestasvariablesensu.bash_profile:

%pre%

Laversióndepythontienenuevaslíneasadicionalesenlasalida,asíquelaseliminoconeltr.Tambiéneliminalosespaciosfinales,asíqueeliminélosespaciosfinalesdePS1_colorlessylosagreguédenuevoconPS1_spacing.

Puedesconseguirloaquí: enlace

Actualizaré si alguna vez hago funcionar el puerto C: enlace

No puedo hacer que se construya en Mac OS. Si alguien puede hacerlo funcionar en Linux o Mac OS, hágamelo saber.

    
respondido por el dosentmatter 25.12.2016 - 03:47
2

Por qué exactamente querrías hacer esto me supera, pero hay dos maneras en que puedes lograrlo:

1) puede poner el comando en la variable PS1 (la variable que controla su indicador)

o ...

2) Utilice la variable PROMPT_COMMAND (preferida)

Modificando PS1

Por ejemplo, su solicitud podría mostrar de forma predeterminada el nombre de host y el nombre de usuario:

Allans-iMac:~ allan

Para ver el código, escriba echo $PS1 y obtendremos:

\h:\W \u\$

Lo que equivale a nombre de host, directorio de trabajo, nombre de usuario y el signo de dólar.

Para ejecutar un comando (usando ls como ejemplo) solo agréguelo entre comillas ocultas y asignelo a PS1:

PS1='ls'"\h:\W \u\$"

Ahora, cada vez que se ejecute un comando, sea exitoso o no, emitirá el comando ls antes de mostrar el indicador.

Usando la variable PROMPT_COMMAND

Como arriba, pero esta vez establece la variable PROMPT_COMMAND con el comando que desea ejecutar. De nuevo, usando ls como ejemplo:

PROMPT_COMMAND=ls

Ahora, sin tener que modificar el valor de PS1 (solicitud), puede ejecutar un comando cada vez.

Puedes establecer cualquiera de estos valores de forma permanente en tu .bash_profile ubicado en el directorio de inicio del usuario.

    
respondido por el Allan 23.09.2016 - 19:17

Lea otras preguntas en las etiquetas