Ceci, à partir d'une publication dans mon blog a quelques mois, est passé d'une idée que je trouvais cool à l'un des meilleurs petits hacks que j'ai crachés ces derniers temps. Je le cite en entier ici:
===================
Je passe beaucoup de temps à bash. Pour les non-initiés, bash est un système que vous trouverez sur la plupart des machines Unix et, heureusement, sur certaines fenêtres et tous les Mac. À première vue, ce n'est rien de plus qu'une interface de ligne de commande, et donc hors du radar de la plupart des utilisateurs qui voient des choses comme un anachronisme qu'ils préfèrent oublier.
Je fais presque tout en bash. JE LISE MON EMAIL À PARTIR D'UNE LIGNE DE COMMANDE, c'est pourquoi j'évite les e-mails balisés. Je navigue dans des répertoires, modifie des fichiers, participe à l'extraction et à la livraison quotidiennes de mon code source, recherche des fichiers, recherche des fichiers dans des fichiers, redémarre ma machine et même parfois parcoure des pages Web à partir de la ligne de commande. bash est le cœur et l'âme de mon existence numérique.
Le problème est que j'ai tendance à ouvrir environ 6 fenêtres bash à la fois. Au travail aujourd'hui, j'en avais un exécutant un serveur Web, un autre jouant avec ma base de données, un troisième, un quatrième et un cinquième éditant différents fichiers, tandis qu'un sixième parcourait ma machine en essayant d'enregistrer les noms de chaque fichier sur le système. Pourquoi? Parce qu'il est pratique de pouvoir rechercher dans une telle archive si vous voulez savoir où trouver un objet par nom de fichier.
Lorsque vous faites cela, vous vous retrouvez avec de nombreuses fenêtres dans votre barre de contrôle nommées simplement «bash». C'est bien si vous n'en avez qu'un seul, mais c'est l'agonie quand vous en avez 6 ou plus ... et deux douzaines d'autres choses se passent. J'ai trois moniteurs sous la commande simultanée d'une paire clavier / souris et j'en ressens toujours le besoin. Chacune de ces fenêtres a plusieurs terminaux bash ouverts.
Alors j'ai mis ça ensemble. Tout d'abord, placez ces lignes dans votre .bash_profile:
export PROMPT_COMMAND='export TRIM=`~/bin/trim.pl`'
export PS1="\[\e]0;\$TRIM\a\]\$TRIM> "
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
J'ai parcouru et écrit des dizaines de paragraphes sur la façon dont tout cela fonctionne et exactement pourquoi il est configuré tel quel, mais vous n'êtes pas vraiment intéressé. Croyez-moi. Il y a un chapitre entier d'un livre expliquant pourquoi j'ai fait "CMD = ...
; echo ..." sur cette troisième ligne. Beaucoup de gens (y compris bluehost, où mon autre domaine est hébergé) utilisent encore une ancienne version de bash avec des bogues majeurs dans la façon dont il gère les pièges, donc nous sommes coincés avec cela. Vous pouvez supprimer le CMD et le remplacer par $ BASH_COMMAND si vous êtes à jour sur votre version bash et que vous avez envie de faire la recherche.
Quoi qu'il en soit, le premier script que j'utilise est ici. Il crée une belle invite qui contient le nom et le répertoire de votre machine, coupés à une longueur raisonnable:
============trim.pl===========
#!/usr/bin/perl
#It seems that my cygwin box doesn't have HOSTNAME available in the
#environment - at least not to scripts - so I'm getting it elsewhere.
open (IN, "/usr/bin/hostname|");
$hostname = <IN>;
close (IN);
$hostname =~ /^([A-Za-z0-9-]*)/;
$host_short = $1;
$preamble = "..." if (length($ENV{"PWD"})>37);
$ENV{"PWD"} =~ /(.{1,37}$)/;
$path_short = $1;
print "$host_short: $preamble$path_short";
==============================
Il y a un avertissement en haut de ce billet de blog que vous devriez lire maintenant avant de commencer à poser des questions stupides telles que "Pourquoi n'avez-vous pas simplement utilisé la variable d'environnement HOSTNAME via @ENV?" Simple: parce que cela ne fonctionne pas pour tous les systèmes sur lesquels je l'ai essayé.
Maintenant pour le peu vraiment cool. Vous vous souvenez de la ligne 3 de l'ajout .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Il vide la sortie du script trim.pl dans le même conteneur qu'avant, imprimant à la fois l'invite de commande et le titre de la fenêtre, mais cette fois, il ajoute la commande que vous venez de taper! C'est pourquoi vous ne voulez pas faire tout cela dans votre .bashrc: tout script que vous exécutez (sur ma machine, man est l'un d'entre eux) déclenchera cette chose sur chaque ligne. la production de l'homme est sérieusement déformée par ce que nous faisons ici. Nous ne jouons pas vraiment bien avec le terminal.
Pour saisir la commande que vous venez de taper, nous prenons l'historique de la bash et la coupons un peu:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Alors maintenant, j'ai un bazillion de fenêtres et ils disent des choses comme:
castro: /home/ronb blog
Ron-D630: /C/ronb/rails/depot script/server
Ron-D630: /C/ronb/rails/depot mysql -u ron -p
Ron-D630: /C/ronb/rails/depot find . > /C/ronb/system.map
Ron-D630: /C/ronb/rails/depot vi app/views/cart.html.erb
Ron-D630: /C/perforce/depot/ p4 protect
Ron-D630: /C/perforce/depot/ p4 sync -f
Ron-D630: /C/perforce/depot/
À partir de la petite barre joyeuse en bas de l'écran, je peux maintenant dire qui est qui en un coup d'œil. Et comme nous avons défini PS1, dès qu'une commande finit de s'exécuter, le nom de la commande est à nouveau remplacé par la sortie de trim.pl.
MISE À JOUR (même jour): Ce truc (les entrées .bash_profile) m'a posé toutes sortes d'enfer quand je l'ai essayé dans mon .bashrc. Votre .bashrc est exécuté par des scripts non interactifs chaque fois que vous invoquez bash comme langage. J'ai frappé ça quand j'essayais d'utiliser l'homme. Toutes sortes de déchets (le texte complet de mon .bashrc, plus les caractères d'échappement) sont apparus en haut de la page de manuel. Je suggérerais de tester ce joyau avec une rapide invocation «homme homme» en ligne de commande une fois que vous avez tout réuni.
Je suppose qu'il est temps pour moi de retirer les déchets personnalisés de mon .bashrc et de les mettre à leur place ...
Incedentally, je me suis retrouvé en train de taper «man trap» à un moment donné de ce processus.