Table des matières

Aliases, couleur de prompt & co

Pour les users ayant bash comme shell (attention, avec squeeze le shell par défaut est dash, qui devrait réagir à peu près pareil, pas vérifié), le processus au login est le suivant

Mais attention, c'est au login seulement et pas au lancement de bash (qui lit alors seulement /etc/bash.bashrc et ~/.bashrc), donc si on veut que les commandes soient lancées à l'ouverture d'un nouveau terminal dans une session graphique, il faut le mettre dans un de ces deux fichiers, éventuellement avec un test if [ -n “$PS1” ] … avant pour limiter les commandes à un shell interactif.

Attention aussi à ne pas faire de echo “Bonjour” dans un .bashrc pour les shell non interactifs qui n'apprécient guère (rsync marche plus par exemple), ce genre de chose irait plutôt dans un .profile pour l'afficher au login ssh, ou dans .bashrc avec un test sur le shell interactif.

Cf http://www.fam.tuwien.ac.at/~schamane/_/blog:110814_bash_shell_startup_files_in_debian_squeeze

~/.profile

umask 022
 
# les variables d´environnement
export HISTSIZE=2500
export PATH="$PATH:/home/bin"
# dans une VM de base faut ajouter
export HISTFILE=~/.bash_history
# et on prend tous les params par défaut (surtout LC_ALL)
while read var
do
  export $var
done < /etc/environment
 
# Pour le reste, on charge alias et prompt et complétion
if [ -f ~/.bash_prompt ]; then
  . ~/.bash_prompt
fi
 
if [ -f ~/.bash_aliases ]; then
  . ~/.bash_aliases    
fi 
if [ -f /etc/bash_completion ]; then
  . /etc/bash_completion
fi

Cf http://doc.ubuntu-fr.org/variables_d_environnement pour la liste des variables dispo

.bash_aliases

# on est jamais trop prudent, autant demander confirmation par défaut (taper /bin/cp pour revenir au comportement "normal")
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
 
# alias perso
# dates
ts2date() { [ $# -lt 1 ] && echo "prend un timestamp comme argument" || date -d "1970-01-01 UTC +$1 seconds" "+%Y-%m-%d %H:%M:%S"; }
date2ts() { [ $# -lt 1 ] && echo "entrez une date comme argument (sous la forme 'YYYY-MM-DD' ou 'YYYY-MM-DD hh:mm' ou 'YYYY-MM-DD hh:mm:ss', etc.)" || date -d "$*" "+%s"; }
 
# gestion des paquets
alias apse='aptitude search'
apsi() { aptitude search ~i$1; }   
alias apin='aptitude install'
alias apre='aptitude remove'
alias appu='aptitude purge'
alias apsh='aptitude show'
alias apud='aptitude update'
alias apug='aptitude safe-upgrade'
alias apwh='aptitude why'
alias apwn='aptitude why not'
alias apfs='apt-file search' 
alias apfu='apt-file updtate' 
alias apcp='apt-cache policy' 
alias pkgr='dpkg -l|grep'; # liste des paquets dont le nom contient $1
alias pkl='dpkg -l'; # pour voir l´état local du paquet $1
alias pkL='dpkg -L'; # la liste des fichiers du paquet $1
# pour utiliser les backport
alias aplbin='aptitude install -t squeeze-backports'
alias aplbsh='aptitude show -t squeeze-backports'
alias aplbfs='apt-file search -t squeeze-backports'
alias aplbfu='apt-file updtate -t squeeze-backports'
alias aplbcp='apt-cache policy -t squeeze-backports'
 
# fichiers
 
# un peu de couleurs pour ls
export LS_OPTIONS='--color=auto'
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lAh'
alias la='ls $LS_OPTIONS -la'
# et pour les couleurs de fichiers suivant droits / extensions, on exporte LS_COLORS
eval "$(dircolors)"
ltr() { ls -altr $*|tail; }
# un cd qui accepte les fichiers
cdf() { [ -f "$1" ] && r="$(dirname "$1")" || r="$1"; cd "$r" ; }
 
alias chweb='chown -R www-data:www-data'
alias chdan='chown -R daniel:daniel' # évidemment à adapter avec vos users fréquemment utilisés
alias chmodstd='chmod -R a-r-w-x-s-t,a+r+X,u+w' # 644 pour les fichiers et 755 pour les dossiers
 
# et pour grep
alias grep='grep --color=auto'
 
# et les locales utf8 que awk n'aime pas trop   
alias awk='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C awk'
 
# taille d´un rep (sans les éventuels autres filesystems montés dedans)
alias du1='du -schx'
alias du1m='du -scxm'
alias du1a='echo -e "Mo\tchemin"; du -camx --max-depth=1'     # la liste du contenu d'un dossier, en Mo
du1A() { echo -e "Mo\tchemin"; du -camx --max-depth=1 $1 | sort -n -k 1; } # idem, triés
du1Ag() { du -camx --max-depth=1 $1 | sed -e "/^.[^0-9]/d; 1 i Mo\tchemin (< 10Mo non affichés)" | sort -n -k 1; } # idem > 9Mo
 
alias tf='tail -f'
alias t50='tail -n50'
alias h50='head -n50'
# liste un fichier sans les commentaires ni les lignes vides
alias catsc="sed -e '/^[ \t]*[#;]/d;/^[ \t]*\/\//d;/^[ \t]*$/d;' "
# affiche une tranche de fichier
cattr() { [ $# != 3 ] && echo "3 arguments requis (n° 1re ligne, n° dernière ligne, fichier)" || sed -ne "$1,$2 p;" $3; }
# pour lister tous les exemplaires uniques (on se fie à date et taille) d´un fichier
luf() { 
  tl=/tmp/luf.list;
  locate "$1" > $tl;
  while read f; 
  do
    ls -l "$f";
  done<$tl |awk '{
    sp=" ";
    if (NF>8) {
      for(i=8;i<=NF;i++) {f=(f " " $i)}
    } else {f=$8};
    print $6 sp $7 sp $5 sp f
  }' |sort -k 1,3 -u;
  rm -f $tl;
}
 
# pour nettoyer les noms de fichiers
cleanfichname() { if [ $# -lt 1 ]
  then
    echo "Il faut au moins un argument (fichier(s) à traiter)"
  else
    rename 'y/A-Z/a-z/' $* # tout en minuscules
    # sans accents ni espace
    rename 'y/áàâäçéèêëíìîïñóòôöúùûü ÁÀÂÄÇÉÈÊËÍÌÎÏÑÓÒÔÖÚÙÛÜ/aaaaceeeeiiiinoooouuuu_aaaaceeeeiiiinoooouuuu/' $*
    # et on remplace tout ce qui n´est pas lettre, chiffre, underscore, tiret, point par underscore
    rename 's/[^a-z0-9_\-\.]/_/g' $*
    # on vire les doubles underscores
    rename 's/__/_/g' $* 
    # et ceux avant un point
    rename 's/_\./\./g' $*
  fi
}
 
# les logs
alias tme='tail -n30 /var/log/messages'
alias tsl='tail -n30 /var/log/syslog'
 
slgr() { [ $# -lt 1 ] && echo "prend un pattern en argument (pour grep sur syslog)" || grep $1 /var/log/syslog;}
# les derniers logs systeme modifiés
alias lvl='ls -ltr /var/log/ |tail'; 
# la fin d´un log systeme
tvl() { [ $# -lt 1 ] && echo "Il faut indiquer un fichier de /var/log/" || tail /var/log/$1; } 
 
# les derniers logs web
alias lwa='ls -ltr /var/log/apache2/ |tail';
alias lwn='ls -ltr /var/log/nginx/ |tail';
alias lwp='ls -ltr /var/log/php5/ |tail';   
# la fin d´un log       
twa() { [ $# -lt 1 ] && echo "Il faut indiquer un log apache" || tail /var/log/apache2/$1; }
twn() { [ $# -lt 1 ] && echo "Il faut indiquer un log nginx" || tail /var/log/php5/$1; }
twp() { [ $# -lt 1 ] && echo "Il faut indiquer un log php" || tail /var/log/php5/$1; }
 
alias hi='history | tail -n30' # les 30 dernières commandes
alias higr='history | grep'
 
alias psf='ps auxwf'
alias psgr='ps auxw | grep'
 
# reseau
alias nst='netstat -tanpu'
alias nstgr='netstat -tanpu|grep'
 
# sous lenny, pas moyen de désactiver autoindent et wordwrap dans /etc/joe/joerc
# apparemment un bug...
alias joe='joe --autoindent --wordwrap'
 
# mysql avec user debian (seul root peut s´en servir car il faut les accès à /etc/mysql/debian.cnf)
alias sql='mysql --defaults-file=/etc/mysql/debian.cnf'
alias sqldump='mysqldump --defaults-file=/etc/mysql/debian.cnf'
alias sqlcheck='mysqlcheck --defaults-file=/etc/mysql/debian.cnf'
alias sqladmin='mysqladmin --defaults-file=/etc/mysql/debian.cnf'
 
# Pour mettre à jour les vm openvz (ici tmp en noexec sur le host)
apudall() { echo "Sur le host $(hostname) :"
  aptitude update && aptitude safe-upgrade
  for id in $(vzlist|awk '/^ *[0-9]+/ {print $1}')
  do
    echo -e "\n\nVM $id";
    vzctl exec $id  "aptitude update"
    echo "Il faut lancer 'aptitude safe-upgrade' manuellement dans chaque vm (apug)"
    echo "Pour éviter les 'dpkg-preconfigure: unable to re-open stdin'"
    echo "que l'on obtient si on lance la commande directement depuis le host avec vzctl"
    vzctl enter $id
  done
  echo -e "\nFIN"
}
 
# pour svn
svnc() { 
  if [ $# -lt 2 ] || [ -f "$1" ] || [ -d "$1" ]
  then
    echo "Le 1er argument doit être le commentaire"
  else
    com="$1"
    shift
    svn commit -m "$com" $@
  fi
}
alias svnu='svn update'
alias svns='svn status'
alias svnd='svn diff'
alias svnl='svn log'
alias svnlv='svn log -v'
 
# un truc perso car 2 db locales
alias locatefull='locate -d /var/lib/mlocate/mlocate-full.db'
# en ayant modifié la fin de /etc/cron.daily/mlocate comme suit (pour avoir les deux bases)
# $IONICE /usr/bin/updatedb.mlocate --add-prunepaths /backup
# $IONICE -c3 /usr/bin/updatedb.mlocate --output /var/lib/mlocate/mlocate-full.db
 
# en desktop
alias gop='gnome-open'
alias xop='xdg-open'

.bash_prompt

Pour plus d'info, voir notamment http://jipe.homelinux.org/trucs_bash/prompt.html et son code pour tester les couleurs ftp://jipe.homelinux.org/Download/scripts/colors2 ou bien

for f in $(echo {30..39}); do for b in $(echo {40..49}); do echo -n -e "\e[0;$f;${b}m$f-$b\e[0m ";done;echo;done;

dans un fichier .bash_prompt (appelé par .bashrc)

# un prompt en couleur sur chaque machine, pour pas se gourer de serveur
# code et trucs à mettre dans le prompt sur http://www.trustonme.net/didactels/132.html
# et http://docs.mandragor.org/files/Misc/GLFM/lm33/Xterm_de_la_couleur.html
# et http://www.linuxfocus.org/Francais/May2004/article335.shtml
 
# valeur 1 : attribut
# 0 normal, 1 gras, 4 souligne, 5 clignotant, 7 inverse (et 21 non gras, 24 non souligne, 25 non clignotant, 27 non inverse)
# il y aurait aussi 2 pale, 3 en evidence?, 8 cache?
# valeur 2 : couleur du texte, valeur 3 : couleur du fond
# couleur       txt     fond
# Noir          30      40
# Rouge         31      41
# Vert          32      42
# Jaune         33      43
# Bleu          34      44
# Magenta       35      45
# Cyan          36      46
# Blanc         37      47 (plutot gris)
# Defaut        39      49
 
NOIR='\e[0;30m'
GRIS='\e[1;30m'
ROUGE='\e[0;31m'
ROSE='\e[1;31m'
VERT='\e[0;32m'
VERTC='\e[1;32m'
BRUN='\e[0;33m'
JAUNE='\e[1;33m'
BLEU='\e[0;34m'
BLEUC='\e[1;34m'
MAGENTAC='\e[0;35m'
MAGENTA='\e[1;35m'
CYAN='\e[0;36m'
CYANC='\e[1;36m'
GRISC='\e[0;37m'
BLANC='\e[1;37m'
DEFAUT='\e[0m'
 
HOSTCOLOR='\e[0;34;47m'; # bleu sur fond gris par exemple
#HOSTCOLOR='\e[1;33;46m'; # jaune/amande
#HOSTCOLOR='\e[1;32;45m'; # vert/violet
#HOSTCOLOR='\e[0;35;47m'; # magenta
# pour voir les combinaisons :
# for f in {40..47}; do for j in 0 1; do echo; for i in {30..37}; do echo -ne "\e[$j;$i;${f}m${j}-${i} test "; done;done;done;
# sur fond noir (40), on peut utiliser rouge (1;31), vert (1;32), jaune (1;33), bleu (1;34) violet (1;35), cyan (1;36) et blanc (1;37)
# sur fond rouge (41), c´est pas terrible mais peuvent passer vert (1;32), jaune (1;33), blanc (1;37)
# fond vert (42), noir (0;30), vert (1;32), jaune (1;33), blanc (1;37)
# fond moutarde (43), noir (0;30), rouge (0;31), blanc (1;37)
# fond bleu (44), noir (0;30), vert (1;32), jaune (1;33), bleu (1;34), mauve (1;35), cyan (1;36),  blanc (1;37) 
# fond violet potable avec noir (0;30) vert (1;32), jaune (1;33), bleu (1;34), cyan (1;36), blanc (1;37) ou gris (0;37)
# fond cyan/amande pas top hors jaune (1;33) et blanc (1;37)
# fond gris OK avec presque tout
USERCOLOR=$HOSTCOLOR
[ $USER == 'root' ] && USERCOLOR='\e[0;31;47m'; # rouge sur fond gris pour root
export PS1="$GRISC[$USERCOLOR\u@$HOSTCOLOR\h $BLANC: $HOSTCOLOR\w$GRISC - \#]#$DEFAUT\n"
 
# et pour les titres de console
case $TERM in
   xterm*)
      HOST=$HOSTNAME
      # pour changer le titre dynamiquement
      PROMPT_COMMAND='echo -ne "\033]0;${USER}@$HOST: ${PWD}\007"'
      # pour initialiser le titre du term à la connexion
      echo -ne "\033]0;${USER}@$HOST:${PWD}\007"
      ;;
   *)
      ;;
esac

et d'une machine à l'autre je ne change que HOSTCOLOR.

Je précise la couleur de fond pour que ça marche avec des terminaux en blanc sur noir ou noir sur blanc (ou n'importe quoi d'autre).

Virer les bips dans xterm

echo "set bell-style none" >> ~/.inputrc

(merci à Edi Stojicevic)

/tmp en noexec

Dans /etc/apt/apt.conf, mettre par exemple

APT::ExtractTemplates::TempDir "/var/tmp"; 

cf http://www.debian-administration.org/articles/57

Personnalisations diverses

joe

Pour ma part, j'ajoute -nobackups et --autoindent (à la fin de la section 2) à /etc/joe/joerc (ou ~/.joerc, au choix). Il est possible d'annuler ce -nobackups pour certains fichiers (regex) et de préciser un path particulier pour les backups (rep courant avec suffixe ~ par défaut).

Par exemple, à la fin de la section 2, (mais les –autoindent et –wordwrap marchent pas sur ma lenny, d'où l'alias ci dessus)

 Default local options
-highlight
-indentc 32
-istep 2
-spaces
--autoindent
--wordwrap

*.php
 -autoindent

Pb compatibilité applis java / bureau 3D

Ajouter dans ~/.bash_profile ou dans /etc/environment (pour tous les users) export AWT_TOOLKIT=MToolkit pour que les applis java (myfreeTV par ex) s'affichent correctement avec un gestionnaire de bureau 3D.