Это, из публикации в моем блоге несколько месяцев назад, из идеи, которую я считал крутой, превратилось в один из лучших небольших приемов, которые я придумал за последнее время. Я цитирую его полностью здесь:
==================
Я провожу много времени в bash. Для непосвященных, bash - это система, которую вы найдете на большинстве unix-машин и, к счастью, в некоторых окнах и на каждом Mac. На первый взгляд, это не более чем интерфейс командной строки, поэтому большинство пользователей, считающих такие вещи анахронизмом, предпочли бы забыть, вне поля зрения.
Я почти все делаю в bash. Я ЧИТАЮ ЭЛЕКТРОННУЮ ПОЧТУ ИЗ КОМАНДНОЙ СТРОКИ, поэтому я избегаю размеченной электронной почты. Я просматриваю каталоги, редактирую файлы, участвую в ежедневной проверке и доставке исходного кода, ищу файлы, ищу внутри файлов, перезагружаю свой компьютер и даже иногда просматриваю веб-страницы из командной строки. bash - это сердце и душа моего цифрового существования.
Проблема в том, что я обычно открываю около 6 окон bash одновременно. Сегодня на работе у меня был один, работающий с веб-сервером, другой - возился с моей базой данных, третий, четвертый и пятый - редактировали разные файлы, а шестой копался на моей машине, пытаясь записать имена всех файлов в системе. Зачем? Потому что удобно иметь возможность искать в таком архиве, если вы хотите знать, где найти объект по имени файла.
Когда вы это сделаете, вы получите множество окон на панели управления, названных просто «bash». Это нормально, если у вас есть только один из них, но это агония, когда у вас их шесть или больше ... и еще две дюжины других вещей. У меня есть три монитора под одновременным управлением одной пары клавиатура / мышь, и я все еще чувствую потребность в большем. В каждом из этих окон открыто несколько терминалов bash.
Итак, я собрал это вместе. Сначала поместите эти строки в свой .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: любой сценарий, который вы запускаете (на моей машине, man - один из них), будет запускать это в каждой строке. продукция человека серьезно искажается из-за того, что мы здесь делаем. Мы не очень хорошо играем с терминалом.
Чтобы получить команду, которую вы только что набрали, мы берем историю bash и немного ее сокращаем:
===========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 плюс escape-символы) обнаружился в верхней части страницы руководства. Я бы посоветовал протестировать этот драгоценный камень с помощью быстрого вызова «человек-мужчина» из командной строки, как только вы соберете все вместе.
Думаю, пора мне вытащить кастомный мусор из моего .bashrc и положить его туда, где он должен ...
В какой-то момент я обнаружил, что набираю «ловушка для мужчин» в какой-то момент этого процесса.