Esto, de una publicación en mi blog hace unos meses, pasó de ser una idea que pensé que era genial a uno de los mejores pequeños trucos que he inventado recientemente. Lo cito completo aquí:
==================
Paso mucho tiempo en bash. Para los no iniciados, bash es un sistema que encontrarás en la mayoría de las máquinas Unix y, afortunadamente, en algunas ventanas y en todas las Mac. A primera vista, no es más que una interfaz de línea de comandos y, por lo tanto, está fuera del radar de la mayoría de los usuarios que ven tales cosas como un anacronismo que prefieren olvidar.
Hago casi todo en bash. LEA MI CORREO ELECTRÓNICO DESDE UNA LÍNEA DE MANDO, por eso evito el correo marcado. Navego por directorios, edito archivos, participo en el proceso de pago y entrega del código fuente diario, busco archivos, busco dentro de los archivos, reinicio mi máquina e incluso ocasionalmente navego por páginas web desde la línea de comandos. bash es el corazón y el alma de mi existencia digital.
El problema es que tiendo a tener unas 6 ventanas de bash abiertas a la vez. En el trabajo de hoy, tenía uno que ejecutaba un servidor web, otro que jugaba con mi base de datos, un tercero, cuarto y quinto que editaban diferentes archivos, mientras que un sexto estaba trabajando en mi máquina tratando de grabar los nombres de cada archivo en el sistema. ¿Por qué? Porque es útil poder buscar a través de dicho archivo si desea saber dónde encontrar un objeto por nombre de archivo.
Cuando haces esto, terminas con muchas ventanas en tu barra de control llamadas simplemente "bash". Esto está bien si solo tienes uno de ellos, pero es una agonía cuando tienes 6 o más ... y dos docenas de cosas más. Tengo tres monitores bajo el comando simultáneo de un par de teclado / mouse y todavía siento la necesidad de más. Cada una de esas ventanas tiene varias terminales de bash abiertas.
Así que he juntado esto juntos. Primero, coloque estas líneas en su .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
Revisé y escribí docenas de párrafos sobre cómo funciona todo esto y exactamente por qué está configurado de la manera en que está, pero no estás realmente interesado. Créeme. Hay un capítulo completo de un libro sobre por qué hice "CMD =...
; echo ..." en esa tercera línea. Muchas personas (incluido bluehost, donde está alojado mi otro dominio) todavía usan una versión antigua de bash con errores importantes en la forma en que maneja las trampas, por lo que estamos atrapados con esto. Puede eliminar el CMD y reemplazarlo con $ BASH_COMMAND si está actualizado en su versión bash y tiene ganas de hacer la investigación.
De todos modos, el primer script que uso está aquí. Crea un buen mensaje que contiene el nombre y el directorio de su máquina, cortado a una longitud razonable:
============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";
==============================
Hay una advertencia en la parte superior de esta publicación de blog que debería leer ahora antes de comenzar a hacer preguntas estúpidas como "¿Por qué no usaste la variable de entorno HOSTNAME a través de @ENV?" Simple: porque eso no funciona para todos los sistemas que lo probé.
Ahora para la parte realmente genial. ¿Recuerdas la línea 3 de la adición .bash_profile?
trap 'CMD=`history|~/bin/hist.pl`;echo -en "\e]0;$TRIM> $CMD\007"' DEBUG
Está volcando la salida del script trim.pl en el mismo contenedor que antes, imprimiendo tanto en el símbolo del sistema como en el título de la ventana, ¡pero esta vez está agregando el comando que acaba de escribir! Es por eso que no desea hacer todo esto en su .bashrc: cualquier script que ejecute (en mi máquina, el hombre es uno de ellos) activará esto en cada línea. La producción del hombre se ve seriamente confusa por lo que estamos haciendo aquí. No estamos jugando exactamente bien con la terminal.
Para obtener el comando que acabas de escribir, tomamos el historial del bash y lo dividimos un poco:
===========hist.pl============
#!/usr/bin/perl
while (<STDIN>)
{
$line = $_
}
chomp $line;
$line =~ /^.{27}(.*)/;
print $1;
==============================
Así que ahora tengo un billón de ventanas funcionando y dicen cosas 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/
Desde la pequeña barra feliz en la parte inferior de la pantalla, ahora puedo decir cuál es cuál en un momento. Y debido a que hemos configurado PS1, tan pronto como un comando termina de ejecutarse, el nombre del comando se reemplaza solo por la salida de trim.pl nuevamente.
ACTUALIZACIÓN (mismo día): estas cosas (las entradas de .bash_profile) me causaron todo tipo de problemas cuando lo probé en mi .bashrc. Su .bashrc es ejecutado por scripts no interactivos cada vez que invoca bash como idioma. Golpeé esto cuando estaba tratando de usar al hombre. Todo tipo de basura (el texto completo de mi .bashrc, más caracteres de escape) apareció en la parte superior de la página del manual. Sugeriría probar esta gema con una rápida invocación 'man man' en la línea de comando una vez que lo haya reunido todo.
Supongo que es hora de que saque la basura personalizada de mi .bashrc y la coloque donde pertenece ...
Incedentemente, me encontré escribiendo 'man trap' en un punto de este proceso.