Esegui lolcat dopo ogni comando?

3

Sto provando ad aggiungere un alias per lolcat che invocherà dopo ogni comando inserito nel terminale.

So solo come aggiungerlo per selezionare gli elementi, qualcuno sa come renderlo un output standard?

    
posta Bryce Snyder 23.09.2016 - 18:51
fonte

2 risposte

5

Aggiorna

Ho messo la mia implementazione qui con le istruzioni di installazione:

link

Usa l'implementazione C di lolcat, ma l'ho modificato un po 'per renderlo psuedo-random.

VECCHIA RISPOSTA

Ecco come l'ho fatto. Aggiungi questo al tuo .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')"

Funziona eseguendo lolcat in modo dinamico su $PS1_colorless e facendo un sed per aggiungere caratteri di controllo in modo che il ritorno a capo funzioni correttamente.

Ci vuole poco meno di 200 millisecondi per essere eseguito. Quindi potrebbe essere troppo lento per te. Ecco un esempio temporizzato:

HosceltodiutilizzarePS1enonPROMPT_COMMANDperchévolevoessereingradodiutilizzarelesequenzediescapepromptbashcome\h,\W,ecc.chenonsarebbepossibileconPROMPT_COMMANDpoichédevopassareaPS1perl'espansioneprimadieseguirelolcat.Puoiutilizzarealternativecome${HOSTNAME%%.*}perimitareilcomportamentodi\hmanonpensochetupossafarloperqualcosadisimile

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')"

Usa -f per forzare lolcat a correre anche se l'output viene reindirizzato a sed . lolcat defaults per non mostrare nulla se l'output non è su un tty.

Dopo aver eseguito lolcat , fa un sed per circondare la sintassi del colore ansi come ESC[38;5;184m ( ESC è il carattere di controllo 3 ) con i caratteri di controllo SOH e STX quindi diventa SOHESC[38;5;184mSTX . SOH e STX sono solo \[ e \] rispettivamente nei caratteri di controllo prompt bash. Devo usare SOH e STX caratteri di controllo invece di \[ e \] perché sto generando i colori dinamicamente. \[ e \] non funzionerebbero perché sono tradotti per controllare i caratteri quando viene prima analizzato PS1 . \[ e \] funzionerebbero se si usasse PROMPT_COMMAND per generare l'output per PS1 ma poi non sarei in grado di usare \u e \W perché lolcat sarebbe stato eseguito prima di passare \u a PS1 per l'espansione.

Per riferimento: link

I caratteri circondati da SOH e STX sono considerati caratteri non stampabili. Questo è necessario in modo che il ritorno a capo funzioni correttamente e non tratti il colore ansi come caratteri visibili reali.

Se vuoi usare caratteri letterali non stampabili, puoi sostituire

questo

%pre%

con questo

%pre%

Nota ^[ , ^A e ^B sono i caratteri letterali di controllo, quindi non puoi semplicemente copiare e incollare. Dovresti usare qualcosa come Vim per inserirli

In 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

EDIT (un po 'più veloce in python) : Il Python sembra funzionare un po 'più veloce:

Cambiaquestevariabilineltuo.bash_profile:

%pre%

Laversionepythonhanuoverigheaggiuntivenell'output,quindilerimuovocontr.Rimuoveancheglispazifinali,quindihorimossoglispazifinalidaPS1_colorlesselihoaggiuntinuovamenteconPS1_spacing.

Puoiottenerloqui: link

Aggiornerò se riuscirò a far funzionare la porta C: link

Non riesco a farcela per costruire su mac os. Se qualcuno può farlo funzionare su linux o mac os, faccelo sapere.

    
risposta data 25.12.2016 - 03:47
fonte
2

Perché esattamente vorresti farlo è oltre a me, ma ci sono due modi per farlo:

1) puoi inserire il comando nella variabile PS1 (la variabile che controlla il tuo prompt)

o ...

2) Usa la variabile PROMPT_COMMAND (preferito)

Modifica di PS1

Ad esempio, il tuo prompt potrebbe visualizzare automaticamente il nome host e il nome utente:

Allans-iMac:~ allan

Per vedere il codice, digita echo $PS1 e otteniamo:

\h:\W \u\$

Che equivale a hostname, directory di lavoro, nome utente e il simbolo del dollaro.

Per eseguire un comando (usando ls come esempio) aggiungilo in allegato con i backtick e assegnalo a PS1:

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

Ora, ogni volta che un comando viene eseguito, con o senza successo, emetterà il comando ls prima di visualizzare il prompt.

Utilizzo della variabile PROMPT_COMMAND

Come sopra, ma questa volta imposti la variabile PROMPT_COMMAND con il comando che desideri eseguire. Ancora usando ls come nell'esempio:

PROMPT_COMMAND=ls

Ora, senza dover modificare il valore PS1 (prompt), è possibile eseguire un comando ogni volta.

Puoi impostare uno di questi valori in modo permanente in .bash_profile che si trova nella directory home dell'utente.

    
risposta data 23.09.2016 - 19:17
fonte

Leggi altre domande sui tag