Dies ist von einem Beitrag in meinem Blog vor ein paar Monaten von einer Idee, die ich für cool hielt, zu einem der besten kleinen Hacks geworden, die ich in letzter Zeit gehustet habe. Ich zitiere es hier vollständig:
==================
Ich verbringe viel Zeit in Bash. Für Uneingeweihte ist bash ein System, das Sie auf den meisten Unix-Computern und zum Glück auf einigen Fenstern und jedem Mac finden. Auf den ersten Blick ist es nicht mehr als eine Befehlszeilenschnittstelle und daher für die meisten Benutzer, die solche Dinge als Anachronismus betrachten, den sie lieber vergessen würden, vom Radar verschwunden.
Ich mache fast alles in Bash. Ich lese meine E-Mail von einer Befehlszeile, weshalb ich markierte E-Mails meide. Ich navigiere in Verzeichnissen, bearbeite Dateien, nehme an der täglichen Überprüfung und Zustellung des Quellcodes teil, suche nach Dateien, suche in Dateien, starte meinen Computer neu und durchsuche gelegentlich sogar Webseiten über die Befehlszeile. Bash ist das Herz und die Seele meiner digitalen Existenz.
Das Problem ist, dass ich normalerweise ungefähr 6 Bash-Fenster gleichzeitig geöffnet habe. Bei der heutigen Arbeit hatte ich einen Webserver, einen anderen, der an meiner Datenbank herumfummelte, einen dritten, vierten und fünften, der verschiedene Dateien bearbeitete, während ein sechster durch meinen Computer lief und versuchte, die Namen aller Dateien auf dem System aufzuzeichnen. Warum? Weil es praktisch ist, ein solches Archiv durchsuchen zu können, wenn Sie wissen möchten, wo Sie ein Objekt anhand des Dateinamens finden können.
Wenn Sie dies tun, werden in Ihrer Steuerleiste viele Fenster mit dem Namen "bash" angezeigt. Das ist in Ordnung, wenn Sie nur einen von ihnen haben, aber seine Qual, wenn Sie 6 oder mehr haben ... und zwei Dutzend andere Dinge, die vor sich gehen. Ich habe drei Monitore unter dem gleichzeitigen Befehl eines Tastatur / Maus-Paares und ich habe immer noch das Bedürfnis nach mehr. In jedem dieser Fenster sind mehrere Bash-Terminals geöffnet.
Also habe ich das zusammengeschmissen. Platzieren Sie diese Zeilen zunächst in Ihrem .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
Ich habe Dutzende von Absätzen darüber geschrieben, wie das alles funktioniert und warum es so eingerichtet ist, wie es ist, aber Sie sind nicht wirklich interessiert. Vertrau mir. Es gibt ein ganzes Kapitel eines Buches darüber, warum ich ...
in dieser dritten Zeile "CMD = ; echo ..." gemacht habe. Viele Leute (einschließlich Bluehost, wo meine andere Domain gehostet wird) verwenden immer noch eine alte Version von Bash mit großen Fehlern im Umgang mit Fallen, also bleiben wir dabei. Sie können das CMD entfernen und durch $ BASH_COMMAND ersetzen, wenn Sie in Ihrer Bash-Version aktuell sind und Lust auf Recherchen haben.
Wie auch immer, das erste Skript, das ich benutze, ist hier. Es wird eine nette Eingabeaufforderung erstellt, die Ihren Computernamen und Ihr Verzeichnis enthält und auf eine angemessene Länge reduziert ist:
============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";
==============================
Oben in diesem Blog-Beitrag befindet sich eine Warnung, die Sie jetzt lesen sollten, bevor Sie dumme Fragen stellen wie: "Warum haben Sie die Umgebungsvariable HOSTNAME nicht einfach über @ENV verwendet?" Einfach: Weil das nicht für alle Systeme funktioniert, auf denen ich es ausprobiert habe.
Nun zum wirklich coolen Teil. Erinnern Sie sich an Zeile 3 des Zusatzes .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Die Skriptausgabe von trim.pl wird im selben Container wie zuvor ausgegeben und sowohl an die Eingabeaufforderung als auch an den Fenstertitel gedruckt. Diesmal wird jedoch der gerade eingegebene Befehl hinzugefügt! Aus diesem Grund möchten Sie dies nicht alles in Ihrem .bashrc tun: Jedes Skript, das Sie ausführen (auf meinem Computer ist der Mensch einer von ihnen), löst dieses Ding in jeder Zeile aus. Die Leistung des Menschen wird durch das, was wir hier tun, ernsthaft verstümmelt. Wir spielen nicht gerade gut mit dem Terminal.
Um den Befehl zu erfassen, den Sie gerade eingegeben haben, nehmen wir den Verlauf der Bash und würfeln ihn ein wenig:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Jetzt habe ich ein paar Millionen Fenster und sie sagen Dinge wie:
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/
An der fröhlichen kleinen Leiste am unteren Bildschirmrand kann ich jetzt auf einen Blick erkennen, welche welche ist. Und da wir PS1 eingestellt haben, wird der Befehlsname erneut durch die Ausgabe von trim.pl ersetzt, sobald die Ausführung eines Befehls abgeschlossen ist.
UPDATE (am selben Tag): Dieses Zeug (die .bash_profile-Einträge) hat mich in aller Munde gebracht, als ich es in meinem .bashrc ausprobiert habe. Ihre .bashrc wird von nicht interaktiven Skripten ausgeführt, wenn Sie bash als Sprache aufrufen. Ich habe das getroffen, als ich versucht habe, einen Mann zu benutzen. Alle Arten von Müll (der vollständige Text meiner .bashrc plus Fluchtzeichen) wurden oben auf der Manpage angezeigt. Ich würde vorschlagen, dieses Juwel mit einem schnellen "Mann-Mann" -Aufruf an der Kommandozeile zu testen, sobald Sie alles zusammen haben.
Ich denke, es ist Zeit für mich, den benutzerdefinierten Müll aus meinem .bashrc zu ziehen und ihn dort abzulegen, wo er hingehört ...
Zufällig habe ich an einem Punkt in diesem Prozess "Mannfalle" eingegeben.