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?
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?
ACTUALIZAR
Pongo mi implementación aquí con instrucciones de instalación:
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íusarPS1
ynoPROMPT_COMMAND
porquequeríapoderusarlassecuenciasdeescapedelmensajedebashcomo\h
,\W
,etc.quenoseríanposiblesconPROMPT_COMMAND
yaquenecesitopasarloaPS1
paralaexpansió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_colorless
ylosagreguédenuevoconPS1_spacing
.
Puedesconseguirloaquí:
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.
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)
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.
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.