Isso, de uma postagem em meu blog há alguns meses, deixou de ser uma idéia que eu achei legal, e foi um dos melhores pequenos hacks que eu tossi na memória recente. Cito aqui na íntegra:
==================
Passo muito tempo no bash. Para os não iniciados, o bash é um sistema que você encontrará na maioria das máquinas unix e, felizmente, em algumas janelas e em todos os Mac existentes. À primeira vista, não passa de uma interface de linha de comando e, portanto, está fora do radar da maioria dos usuários que vê essas coisas como um anacronismo que eles preferem esquecer.
Eu faço quase tudo no bash. LEU MEU E-MAIL DE UMA LINHA DE COMANDO, e é por isso que evito o e-mail marcado. Navego em diretórios, edito arquivos, participo no check-out e na entrega diária do código-fonte, procuro arquivos, pesquiso em arquivos, reinicializo minha máquina e até ocasionalmente navego em páginas da web na linha de comando. bash é o coração e a alma da minha existência digital.
O problema é que eu tendem a ter cerca de 6 janelas do bash abertas por vez. No trabalho hoje, eu tinha um executando um servidor Web, outro mexendo com meu banco de dados, um terceiro, quarto e quinto editando arquivos diferentes, enquanto um sexto estava sendo processado em minha máquina tentando gravar os nomes de todos os arquivos no sistema. Por quê? Porque é útil poder pesquisar nesse arquivo, se você quiser saber onde encontrar um objeto por nome de arquivo.
Quando você faz isso, acaba com muitas janelas na barra de controle denominadas simplesmente "bash". Isso é bom se você tiver apenas um deles, mas é uma agonia quando você tem 6 ou mais ... e duas dezenas de outras coisas acontecendo. Eu tenho três monitores sob o comando simultâneo de um par de teclado / mouse e ainda sinto a necessidade de mais. Cada uma dessas janelas possui vários terminais abertos.
Então eu juntei isso juntos. Primeiro, coloque estas linhas no seu .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
Analisei e escrevi dezenas de parágrafos sobre como tudo isso funciona e exatamente por que está configurado da maneira que está, mas você não está realmente interessado. Confie em mim. Há um capítulo inteiro de um livro em que eu fiz "CMD = ...
; eco ..." nessa terceira linha. Muitas pessoas (incluindo bluehost, onde meu outro domínio está hospedado) ainda estão usando uma versão antiga do bash com grandes erros na maneira como ele lida com as armadilhas, por isso estamos presos a isso. Você pode remover o CMD e substituí-lo por $ BASH_COMMAND se você estiver atualizado em sua versão do bash e quiser fazer a pesquisa.
Enfim, o primeiro script que eu uso está aqui. Ele cria um bom prompt que contém o nome e o diretório da sua máquina, cortados em um tamanho razoável:
============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";
==============================
Há um aviso no topo desta postagem do blog que você deve ler agora antes de começar a fazer perguntas estúpidas como: "Por que você não usou a variável de ambiente HOSTNAME via @ENV?" Simples: porque isso não funciona em todos os sistemas em que eu experimentei.
Agora, a parte realmente legal. Lembre-se da linha 3 da adição .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Ele está descartando a saída do script trim.pl no mesmo contêiner de antes, imprimindo no prompt de comando e no título da janela, mas desta vez está adicionando o comando que você acabou de digitar! É por isso que você não quer fazer tudo isso no seu .bashrc: qualquer script que você executar (na minha máquina, o homem é um deles) acionará essa coisa em todas as linhas. a produção do homem fica seriamente distorcida pelo que estamos fazendo aqui. Não estamos exatamente jogando bem com o terminal.
Para pegar o comando que você acabou de digitar, pegamos o histórico do bash e o detalhamos um pouco:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Então agora, eu tenho um bazilhão de janelas e eles dizem coisas como:
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/
Da pequena barra feliz na parte inferior da tela, agora posso dizer qual é qual de relance. E como definimos o PS1, assim que um comando termina a execução, o nome do comando é substituído apenas pela saída do trim.pl novamente.
UPDATE (mesmo dia): Esse material (as entradas .bash_profile) me causou um grande inferno quando tentei no meu .bashrc. Seu .bashrc é executado por scripts não interativos sempre que você chama o bash como um idioma. Eu bati isso quando eu estava tentando usar o homem. Todo tipo de lixo (o texto completo do meu .bashrc, além de caracteres de escape) apareceu na parte superior da página de manual. Eu sugeriria testar essa gema com uma chamada rápida de 'homem homem' na linha de comando, depois que você juntar tudo.
Acho que é hora de tirar o lixo personalizado do meu .bashrc e colocá-lo onde ele pertence ...
Incedentalmente, encontrei-me digitando 'armadilha do homem' em um ponto deste processo.