lunes, 3 de septiembre de 2012

Persoalizando o terminal [bash]

O martes pasado, Hadrián falou de que o arquivo .bashrc daba para máis que para o que se amosaba nese post, razón non lle falta, así que ahí van unhas cantas formas de facer unha terminal máis 'a medida'.



Pero antes... que é o arquivo .bashrc ?

O arquivo .bashrc (da carpeta $HOME do usuario) é un conxunto de ordes para a shell que se executarán o iniciala, soe servir como arquivo de configuración, o "Advanced Bash Scripting Guide" amosa unha mostra.


Agora sí, abrimo-lo arquivo .bashrc e empezamos a fozar, ou podemolo probar directamente nun terminal aberto para non ter que abrir outro cada vez que haxa que probalo ;) ...


1. Añadindo capacidades: Funcións e alias

A linguaxe da shell, como linguaxe de programación que é da a posibilidade de extender as súas capacidades a través das funcións, estas comportanse de forma similar as funcións de outras linguaxes. Unha función defínese así:
<nome da función> (){ [<comando>[<comando>[...]] }
(O que está entre '<' e '>' sustitúese polo valor que representa, e o '[' e ']' indica que son opcionais.)

Por exemplo, poderíamos definir unha función que tome todos es enlaces dunha páxina web e teríamola sempre a man, coma se fose un comando calqueira:
toma_enlaces (){ 
    curl "$1"|
    grep -Poi 'href="[^"]*"' |
    cut -d\" -f2
}

toma_enlaces http://www.tldp.org/LDP/abs/html/functions.html


Os alias son parecidos as funcións, coa diferencia de que o seu uso e só acortar as chamadas, se escrebes no terminal isto amosará os alias activos:
alias

Por exemplo, eu uso moito 'make clean' seguido de 'make', así que podería facer as dúas cousas escrebendo 'remake' no caso de definilo como alias:
alias remake='make clean; make'
As cousas como facer que rm sempre pida confirmación (opción -i) faise a través de este mecanismo:
alias rm='rm -i'

Como podedes intuír, estes dous dan para unha boa chea de bromas, por poñer unha máis inocua ca proposta do 'rm', poderíamos facer que o comando 'ls' non amose as liñas coa palabra Imaxe:
alias ls='ls|grep Imaxe'
Pero claro, tede en conta que se se pasan parámetros o novo 'ls' realmente acabarán no 'grep'.


2. Un liña de shell feita a medida.


A variable de entorno PS1 define o que amosará o terminal a espera de que escrebamos algo, facede a proba, mandadelle
PS1='$ '


E presto!, liña de comandos simple a rabiar... pero iso non e o que buscamos, verdade?, pois veredes, aquí tedes unha seríe de códigos que representan un valor variable:
\dA data en formato "Día do mes - Mes - Día" (ex., "Tue May 26")
\hO nome do host ata o primeiro `.'
\HO nome do host completo
\jO número de traballos manexados pola sesión de shell
\lO nome do dispositivo de nomes do shell
\sO nome da shell (o do executable)
\tO tempo actual como 24-horas HH:MM:SS
\TO tempo actual como 12-horas HH:MM:SS
\@O tempo actual como como 12-horas am/pm
\AO tempo actual como como 24-hour HH:MM
\uO nome do usuario
\vA versión de bash
\VA versión pormenorizada de bash (ex., 2.00.0)
\wO directorio actual, co $HOME remplazado por un '~'
\WO nome do directorio actual
\!O número do comando polo histórico
\#O número do comando dentro da shell
\$Se o usuario é root '#', senon '$'
\nnnO carácter co número octal nnn
\\Un '\'
\[Comeza unha secuencia de control da shell
\]Finaliza unha secuencia de control da shell

fonte: Wiki de archlinux

Ah, e claro, podémos ver o ćodigo da actual se facemos:
echo $PS1

Por exemplo, se queremos:
<nome do usuario>@<nome do host>:<nome do directorio actual>/<# para root senon $>
Faríamos
PS1='\u@\for((i=0;i<10 -en="-en" do="do" done="done" echo="echo" for="for" h:="h:" i="i" j="j" m="m" pre="pre" x1b="x1b">


Tamén podemos darlle color metendo algo entre '\e[0;<código do color>' e '\e[0m', e posible sacar unha 'referencia' dos códigos de color co comando:
for((i=0;i<10;i++));do
    for((j=0;j<10;j++));do
        echo -en "\x1b[0;"$i$j"m"$i$j"\x1b[0m "
    done
    echo ""
done

Por exemplo:


3. Variables de entorno

En poucas palabras, podes usala para preparar todo por anticipado, que tes uns cantos scripts e binarios no directorio do usuario e queres usalos como se foran do sistema sen ter que mandalos o /bin/? (ou sucedaneos), sen problema
export PATH=$PATH:$HOME/.bin

Ou para evitar que ImageMagick desmadre
export MAGICK_AREA_LIMIT=250M
export MAGICK_MEMORY_LIMIT=100MiB
export MAGICK_MAP_LIMIT=100MiB

Ou para definir o fondo do 'mutt' como transparente
export COLORFGBG="default;default"

En fin, na miña opinión moi práctico no caso de utilizar con frecuencia programas que usen variables de entorno.


Bonus: avisar dos riscos de traballar como root

if [ $UID = 0 ];then
    echo -e "\nConfucio dixo: Quen xoga coa raíz acaba matando á arbore.\n"
fi



E ti, para que usas o .bashrc?

3 comentarios:

  1. Buuuuuu! Queremos sangue!!!

    Cando se traballa en equipos de desarrollo, é habitual que o admin faga un grupo de usuarios e o asigne a todos os membros do equipo. Si algún usuario ten permiso de escritura para o grupo no seu $HOME, podemos personalizarlle nós o shell (e si xa ten un .bashrc e non o podemos sobreescribir, podemos acudir ao .profile, etc)

    Temos bromas moi simpáticas como o comando sl (típica confusión de ls) que podemos convertir en función ou alias, ou instalar un vello programa que facía recorrer un tren pola pantalla http://www.tkl.iis.u-tokyo.ac.jp/~toyoda/sl/sl.tar

    Outras bromas como algo así :
    alias vi='open /lost+found/porno-moi-pervertido.mpg'

    Buscando "prank .bashrc" en google podemos atopar "personalizacións" como a que segue :
    http://linuxshellaccount.blogspot.com.es/2009/04/tiny-unix-and-linux-shell-crash-course.html

    E si o usuario é sudoer, temos tamén moitas opcións

    ResponderEliminar
  2. Hehe, que perigo :P

    Pero despois de ler o post dos alias quedoume a duda, se fas 'alias' a 'alias', todos os cambios quedan blocados, non si?

    Saúdos e gracias polo aporte.

    ResponderEliminar
    Respuestas
    1. Si, habería que facer alias a 'alias' e a 'unalias'.

      Pero sempre se poderia facer un "/bin/bash --rcfile bash_rc_sen_trampas" e abririamos un shell que obteria o ficheiro de configuración que lle pasemos como parámetro. Ou tamén utilizar calquer dos outros intérpretes de comandos (tcsh, korn shell, ...) para desfacer o entuerto.

      E xa non me lembro moi ben, pero creo que era SuSe a que tiña uns ficheiros de configuración de terminal increiblemente bos e didácticos. Igual era outra distro

      Eliminar