To, z postu na moim blogu kilka miesięcy temu, przeszło od pomysłu, który uważałem za fajny, do jednego z najlepszych małych hacków, jakie wykrztusiłem w niedawnej pamięci. Cytuję to w całości tutaj:
==================
Spędzam dużo czasu w bash. Dla niewtajemniczonych bash to system, który można znaleźć na większości komputerów uniksowych i na szczęście w niektórych oknach i na każdym Macu. Na pierwszy rzut oka to nic innego jak interfejs wiersza poleceń, a zatem jest poza zasięgiem radaru większości użytkowników, którzy postrzegają takie rzeczy jako anachronizm, o którym woleliby zapomnieć.
W bash robię prawie wszystko. CZYTAM E-MAIL Z LINII POLECENIA, dlatego unikam oznaczania e-maili. Poruszam się po katalogach, edytuję pliki, codziennie sprawdzam i dostarczam kod źródłowy, wyszukuję pliki, przeszukuję pliki, restartuję komputer, a nawet od czasu do czasu przeglądam strony internetowe z wiersza poleceń. bash jest sercem i duszą mojej cyfrowej egzystencji.
Problem polega na tym, że mam zwykle otwartych około 6 okien bash naraz. W dzisiejszej pracy jeden z nich pracował na serwerze WWW, inny majstrował przy mojej bazie danych, trzeci, czwarty i piąty edytując różne pliki, podczas gdy szósty przeciskał się przez moją maszynę, próbując zapisać nazwy każdego pliku w systemie. Czemu? Ponieważ przydatne jest przeszukiwanie takiego archiwum, jeśli chcesz wiedzieć, gdzie znaleźć obiekt według nazwy pliku.
Kiedy to zrobisz, na pasku kontrolnym pojawi się wiele okien nazwanych po prostu „bash”. To jest w porządku, jeśli masz tylko jedną z nich, ale cierpienie, gdy masz 6 lub więcej ... i dwa tuziny innych rzeczy. Mam trzy monitory pod jednoczesną komendą jednej pary klawiatura / mysz i nadal czuję potrzebę więcej. Każde z tych okien ma kilka otwartych terminali bash.
Więc złożyłem to razem. Najpierw umieść te wiersze w swoim .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
Przejrzałem i napisałem dziesiątki akapitów o tym, jak to wszystko działa i dlaczego dokładnie jest skonfigurowane tak, jak jest, ale tak naprawdę nie jesteś zainteresowany. Zaufaj mi. Jest cały rozdział książki, w którym napisałem „CMD = ...
; echo ...” w tej trzeciej linii. Wiele osób (w tym bluehost, gdzie hostowana jest moja druga domena) nadal używa starej wersji basha z poważnymi błędami w obsłudze pułapek, więc utknęliśmy z tym. Możesz usunąć CMD i zastąpić go $ BASH_COMMAND, jeśli jesteś na bieżąco z wersją bash i masz ochotę przeprowadzić badania.
W każdym razie pierwszy skrypt, którego używam, jest tutaj. Tworzy fajny znak zachęty zawierający nazwę twojego komputera i katalog, skrócony do rozsądnej długości:
============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";
==============================
U góry tego wpisu na blogu znajduje się ostrzeżenie, które powinieneś przeczytać teraz, zanim zaczniesz zadawać głupie pytania, takie jak: „Dlaczego po prostu nie użyłeś zmiennej środowiskowej HOSTNAME za pośrednictwem @ENV?” Proste: ponieważ to nie działa dla wszystkich systemów, na których go wypróbowałem.
A teraz naprawdę fajny kawałek. Pamiętasz linię 3 dodatku .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Zrzuca wyjście skryptu trim.pl do tego samego kontenera co poprzednio, drukując zarówno do wiersza poleceń, jak i do tytułu okna, ale tym razem dodaje polecenie, które właśnie wpisałeś! Dlatego nie chcesz robić tego wszystkiego w swoim .bashrc: każdy skrypt, który uruchomisz (na mojej maszynie, man jest jednym z nich) spowoduje to w każdej linii. dorobek człowieka zostaje poważnie zniekształcony przez to, co tutaj robimy. Nie bawimy się dobrze z terminalem.
Aby pobrać polecenie, które właśnie wpisałeś, bierzemy historię basha i trochę ją kroimy:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Więc teraz mam miliardy okien i mówią takie rzeczy:
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/
Ze szczęśliwego małego paska u dołu ekranu mogę teraz na pierwszy rzut oka stwierdzić, który jest który. A ponieważ ustawiliśmy PS1, gdy tylko polecenie zakończy wykonywanie, nazwa polecenia jest ponownie zastępowana tylko wyjściem trim.pl.
UPDATE (ten sam dzień): Te rzeczy (wpisy .bash_profile) położyły na mnie wszelkiego rodzaju piekło, kiedy wypróbowałem to w moim .bashrc. Twoje .bashrc jest wykonywane przez nieinteraktywne skrypty za każdym razem, gdy wywołujesz bash jako język. Uderzyłem w to, kiedy próbowałem wykorzystać człowieka. Wszelkiego rodzaju śmieci (pełny tekst mojego .bashrc, plus znaki ucieczki) pojawiły się na górze strony podręcznika. Sugerowałbym przetestowanie tego klejnotu za pomocą szybkiego wywołania `` człowiek-człowiek '' w wierszu poleceń, gdy wszystko już zbierzesz.
Myślę, że nadszedł czas, abym wyciągnął niestandardowe śmieci z mojego .bashrc i umieścił je tam, gdzie należy ...
W pewnym momencie tego procesu bezwarunkowo wpisałem „man trap”.