Це, від публікації в моєму щоденнику кілька місяців тому, пішло від ідеї, яку я вважав крутою, до одного з найкращих маленьких хак, які я кашляв в останній пам’яті. Я цитую його повністю тут:
==================
Я багато часу провожу в басі. Для непосвячених, bash - це система, яку ви знайдете на більшості Unix-машин і, на щастя, деяких вікнах і кожному Mac там. Спочатку рум'яна - це не більше, ніж інтерфейс командного рядка, а отже, з радіолокації більшості користувачів, які вважають подібні речі анахронізмом, яких вони швидше забудуть.
Я майже все роблю в баш. Я читаю мій електронний лист з комунального рядка, тому я відмовляюся від розміченого електронного листа. Я переходжу по каталогах, редагую файли, беру участь у щоденній реєстрації вихідних кодів та доставці, шукаю файли, шукаю всередині файлів, перезавантажую машину і навіть час від часу переглядаю веб-сторінки з командного рядка. bash - це серце і душа мого цифрового існування.
Проблема полягає в тому, що я, як правило, відкриває близько 6 вікон, що мають башти. На роботі сьогодні у мене був один із запущеним веб-сервером, інший, що мою базу даних, третій, четвертий та п’ятий редагували різні файли, в той час як шостий перетирав через свою машину, намагаючись записати імена кожного файлу в системі. Чому? Тому що зручно здійснювати пошук по такому архіву, якщо ви хочете знати, де знайти об’єкт за назвою файлу.
Коли ви це зробите, у вашій панелі керування ви знайдете безліч вікон, названих просто "баш". Це добре, якщо у вас є лише один з них, але його агонія, коли у вас 6 і більше .... і два десятки інших речей. У мене є три монітори під одночасним командуванням однієї пари клавіатури / миші, і я все ще відчуваю потребу в більшому. У кожному з цих вікон відкрито кілька баш-терміналів.
Тож я разом це зірвав. Спочатку розмістіть ці рядки у своєму .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
Я переглянув і написав десятки абзаців про те, як це все працює і чому саме він налаштований таким, яким він є, але вас не дуже цікавить. Довірся мені. Є цілий розділ книги, чому я зробив "CMD =...
; echo ..." в тому третьому рядку. Багато людей (включаючи bluehost, де розміщений мій інший домен) досі використовують стару версію bash з основними помилками в тому, як він обробляє пастки, тому ми зациклювалися на цьому. Ви можете видалити CMD і замінити його на $ BASH_COMMAND, якщо ви наявні у своїй версії bash і відчуваєте, що хочете зробити дослідження.
У будь-якому випадку, перший сценарій, який я використовую, тут. Він створює приємний підказку, що містить ім’я машини та каталог, порубані до розумної довжини:
============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";
==============================
Вгорі цього повідомлення в блозі є попередження, яке слід прочитати зараз, перш ніж ви почнете задавати дурні питання на кшталт "Чому ви просто не використовували змінну середовища HOSTNAME через @ENV?" Просто: Тому що це працює не для всіх систем, на яких я спробував.
Тепер для дійсно крутого шматочка. Пам'ятаєте рядок 3 додатку .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Він скидає вихідний скрипт trim.pl у той самий контейнер, що і раніше, друкуючи як командний рядок, так і заголовок вікна, але цього разу це додавання команди, яку ви тільки що ввели! Ось чому ви не хочете робити все це у своєму .bashrc: будь-який сценарій, який ви запускаєте (на моїй машині, людина є одним із них), спровокує цю справу у кожному рядку. Вихід людини стає серйозно вражений тим, що ми робимо тут. Ми не дуже добре граємо з терміналом.
Щоб схопити команду, яку ви щойно набрали, ми беремо історію баша і трохи забиваємо її:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Тому зараз у мене є мільярд вікон, і вони говорять:
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/
З щасливої маленької смужки в нижній частині екрана я тепер можу сказати, що це таке, яке миттєво поглядає. А оскільки ми встановили PS1, як тільки команда закінчує виконання, ім'я команди знову замінюється лише результатом trim.pl.
ОНОВЛЕННЯ (в той же день): Цей матеріал (записи .bash_profile) наклав на мене всі види пекла, коли я спробував це у своєму .bashrc. Ваш .bashrc виконується неінтерактивними скриптами, коли ви викликаєте bash як мову. Мені це вдарило, коли я намагався використовувати людину. Усі види сміття (повний текст мого .bashrc, плюс знаки втечі) з'явилися вгорі сторінки людини. Я б запропонував протестувати цей дорогоцінний камінь за допомогою швидкого виклику "man man" у командному рядку, як тільки ви все це зберете.
Я здогадуюсь, настав час, щоб я витягнув з мого .bashrc сміттєве сміття і поклав його там, де йому належить ...
Навмисно я виявив, що я набрав "пастку людини" в один момент цього процесу.