7 votes

Exécuter lolcat après chaque commande ?

Je suis en train d'essayer d'ajouter un alias pour lolcat qui sera invoqué après chaque commande entrée dans le terminal.

Je sais seulement comment l'ajouter à des éléments sélectionnés, quelqu'un sait comment le rendre simplement en sortie standard ?

entrez la description de l'image ici

6voto

dosentmatter Points 161

MISE À JOUR

J'ai mis en place mon implémentation ici avec les instructions d'installation :

https://github.com/dosentmatter/rainbow-bash-prompt

J'utilise l'implémentation en C de lolcat mais je l'ai modifiée un peu pour la rendre pseudo-aléatoire.

ANCIENNE RÉPONSE

Voici comment je l'ai fait. Ajoutez ceci à votre .bashrc :

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

ESC=$(echo -e '\033')
SOH=$(echo -e '\001')
STX=$(echo -e '\002')
PS1_color_wrap='s/'$ESC'\\[[[:digit:];]*m/'$SOH'&'$STX'/g'

PS1="\$(lolcat -f <<< \"$PS1_colorless\" | sed '$PS1_color_wrap')"

Cela fonctionne en exécutant lolcat dynamiquement sur $PS1_colorless et en effectuant un sed pour ajouter des caractères de contrôle afin que le retour à la ligne fonctionne correctement.

Cela prend un peu moins de 200 millisecondes pour s'exécuter. Donc cela pourrait être trop lent pour vous. Voici un exemple que j'ai chronométré :

ruby lolcat time

J'ai choisi d'utiliser PS1 et non PROMPT_COMMAND car je voulais pouvoir utiliser les séquences d'échappement de prompt bash telles que \h, \W, etc. ce qui ne serait pas possible avec PROMPT_COMMAND car j'ai besoin de le passer à PS1 pour expansion avant d'exécuter lolcat. Vous pouvez utiliser des alternatives comme ${HOSTNAME%%.*} pour imiter le comportement de \h mais je ne pense pas que vous puissiez le faire pour quelque chose comme

\#     le numéro de commande de cette commande

Il utilise -f pour forcer lolcat à s'exécuter même si la sortie est dirigée vers sed. Par défaut, lolcat ne produit rien si la sortie n'est pas vers un tty.

Après avoir exécuté lolcat, il effectue un sed pour entourer la syntaxe de couleur ansi telle que ESC[38;5;184m (ESC est le caractère de contrôle \033) avec les caractères de contrôle SOH et STX de sorte qu'il devienne SOHESC[38;5;184mSTX. SOH et STX correspondent respectivement à \[ et \] dans les caractères de contrôle du prompt bash. Je dois utiliser les caractères de contrôle SOH et STX au lieu de \[ et \] car je génère des couleurs dynamiquement. \[ et \] ne fonctionneraient pas car ils sont traduits en caractères de contrôle lorsque PS1 est d'abord analysé. \[ et \] fonctionneraient si vous utilisiez PROMPT_COMMAND pour générer la sortie pour PS1 mais alors je ne pourrais pas utiliser \u et \W car lolcat aurait été exécuté avant de passer \u à PS1 pour expansion.

Pour référence : https://stackoverflow.com/questions/24839271/bash-ps1-line-wrap-issue-with-non-printing-characters-from-an-external-command

Les caractères entourés par SOH et STX sont traités comme des caractères non imprimables. Cela est nécessaire pour que le retour à la ligne fonctionne correctement et ne traite pas la couleur ansi comme des caractères visibles réels.

Si vous voulez utiliser des caractères de contrôle non imprimables littéraux, vous pouvez remplacer

cela

ESC=$(echo -e '\033')
SOH=$(echo -e '\001')
STX=$(echo -e '\002')
PS1_color_wrap='s/'$ESC'\\[[[:digit:];]*m/'$SOH'&'$STX'/g'

avec ceci

PS1_color_wrap='s/^[\\[[[:digit:];]*m/^A&^B/g'

Remarquez que les ^[, ^A et ^B sont les caractères de contrôle littéraux donc vous ne pouvez pas les copier et coller. Vous devriez utiliser quelque chose comme vim pour les saisir

Dans vim :

^[ == Ctrl+vEsc ou Ctrl+vo033

^A == Ctrl+vCtrl+a ou Ctrl+vo001

^B == Ctrl+vCtrl+b ou Ctrl+vo002

MODIFICATION (un peu plus rapide en python) : La version python semble s'exécuter un peu plus rapidement :

python lolcat time

Changez ces variables dans votre .bash_profile :

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

La version python a des sauts de ligne supplémentaires dans la sortie donc je les supprime avec le tr. Il supprime également les espaces finaux donc j'ai enlevé les espaces finaux de PS1_colorless et les ajoute de nouveau avec PS1_spacing.

Vous pouvez l'obtenir ici : https://github.com/tehmaze/lolcat

Je mettrai à jour si j'arrive un jour à faire fonctionner le port C : https://github.com/jaseg/lolcat

Je n'ai pas réussi à le construire sur mac os. Si quelqu'un arrive à le faire fonctionner sur linux ou mac os, merci de me le faire savoir.

4voto

Douglas Points 10417

Pourquoi exactement vous voudriez faire cela dépasse ma compréhension, mais il y a deux façons d'accomplir cela :

1) vous pouvez mettre la commande dans la variable PS1 (la variable qui contrôle votre invite)

ou...

2) Utilisez la variable PROMPT_COMMAND (préféré)

Modification de PS1

Par exemple, votre invite peut par défaut afficher le nom d'hôte et le nom d'utilisateur :

Allans-iMac:~ allan

Pour voir le code, tapez echo $PS1 et nous obtenons :

\h:\W \u\$

Ce qui équivaut au nom d'hôte, répertoire de travail, nom d'utilisateur et le signe dollar.

Pour exécuter une commande (en utilisant ls comme exemple) il suffit de l'ajouter entre guillemets inversés et de l'assigner à PS1 :

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

Maintenant, chaque fois qu'une commande est exécutée, avec succès ou non, elle exécutera la commande ls avant d'afficher l'invite.

Utilisation de la variable PROMPT_COMMAND

Tout comme ci-dessus, mais cette fois vous définissez la variable PROMPT_COMMAND avec la commande que vous souhaitez exécuter. Encore une fois en utilisant ls comme exemple :

PROMPT_COMMAND=ls

Maintenant, sans avoir à modifier la valeur de PS1 (invite), vous pouvez faire exécuter une commande à chaque fois.

Vous pouvez définir l'une de ces valeurs de manière permanente dans votre .bash_profile situé dans le répertoire personnel de l'utilisateur.

1voto

Nicholas Ham Points 11

J'ai créé une extension de shell pour le générateur de site Web le plus rapide au monde que j'ai créé appelé Nift. Il a un œuf de Pâques où vous pouvez activer la sortie lolcat pour la plupart des choses avec lolcat.on (après avoir démarré le shell avec par ex. nift sh). Vous obtiendrez même une sortie en arc-en-ciel en appuyant sur tabulation pour obtenir les options de complétion possibles, je doute que vous obteniez cela avec d'autres solutions suggérées.

L'extension de shell est pour f++ qui est le langage de script intégré, qui a ces fonctions et ces types disponibles. Mais tout ce qu'il ne reconnaît pas est exécuté comme un appel système en utilisant le shell (probablement primaire/default) sur votre machine (d'où l'appeler une extension de shell en mode shell REPL).

Nift recherchera une version de lolcat installée sur votre machine et sinon utilisera une version intégrée de celui-ci qui devrait être la plus rapide au monde (elle est presque identique à mon implémentation c++ lolcat-cc qui est la plus rapide au monde). Je recommande vivement d'installer lolcat-cc (ou une autre version de lolcat) en plus de Nift, car sinon vous exécutez fréquemment le binaire Nift de ~5mo pour pratiquement tous les appels système, au lieu d'un binaire <1mo pour lolcat.

f++ est aussi une sorte de langage de script intéressant. Prenez ce script par exemple, qui crée et supprime 100k de fichiers texte vides. Sur ma machine, cela s'exécute en ~3,5 secondes tandis que ce script Bash faisant essentiellement la même chose prend plus de 3 minutes !! Certaines des choses cool que vous pourriez déjà remarquer dans ce script f++ sont que vous pouvez étendre les variables à l'intérieur des chaînes, vous pouvez définir des variables avec des types, vous pouvez étendre les variables en plusieurs paramètres avec des appels de fonction, vous pouvez avoir BEAUCOUP plus de 10k paramètres d'entrée pour les appels de fonction (devrait pouvoir avoir des millions !).

Vous pouvez trouver plus d'informations sur les REPLs Nift (y compris des raccourcis pour différentes plateformes) ici.

Si vous avez besoin de définir des variables de shell (pas à travers f++ mais le shell sous-jacent), vous devrez faire des blocs de code en utilisant la fonction sys/system. Vous pouvez également réaliser des blocs de code pour Lua(JIT) et ExprTk de manière similaire car ils sont tous deux intégrés à Nift. Vous pouvez utiliser à la fois Lua et ExprTk pour accéder/modifier les variables f++, également..

Alors pour obtenir ce shell (extension). Installez Nift via un gestionnaire de paquets ou clonez, compilez et installez depuis GitHub. Entrez nift sh dans votre terminal pour démarrer l'extension de shell f++ Nift, puis entrez lolcat.on pour activer la sortie en arc-en-ciel.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X