Table of contents
ctrl-a aller au début de la ligne ctrl-e aller à la fin de la ligne ctrl-d quitter la session (equivaut à "exit" ou "logout") ctrl-l effacer tout affichage sur le terminal ctrl-r<cmd> recherche les occurrences de <cmd> dans l'historique ctrl-s masquer la saisie (ctrl-q pour rétablir) ctrl-u coupe tout ce qui précède le curseur ctrl-v + <tab> insère une "vraie" tabulation ctrl-w couper le mot précédent le curseur ctrl-y coller ce qui a été coupé alt-c effacer le mot précédent alt-f aller au mot suivant alt-b aller au mot précédent alt-t intervertir deux mots (devant et derrière le curseur) esc-. insère le dernier argument de la commande précédente (fonctionne également avec alt-.) !! ré-exécute la dernière commande !XX ré-exécute la dernière commande commençant par XX !XX:p affiche la dernière commande commençant par XX mais ne l'exécute pas <cmd> !* exécute la commande <cmd> avec tous les paramètres de la dernière commande <cmd> !$ exécute la commande <cmd> avec le dernier paramètre de la dernière commande
$PS1.
bash-3.2$ export PS1="\u@\h:\w% " marc@magma:~%Les différents switch sont énumérés dans le manuel de Bash (section PROMPTING) ; ici, le prompt affiche l'utilisateur, le nom de la machine ainsi que le répertoire courant. Il est possible de coloriser le prompt avec la syntaxe suivante :
export PS1="\033[01;37m$PS1\033[00;00m "...ce qui donnera ici un prompt blanc gras. Voici les différentes couleurs disponibles :
noir 0;30 gris foncé gras 1;30 rouge 0;31 rouge gras 1;31 vert 0;32 vert gras 1;32 jaune 0;33 jaune gras 1;33 bleu 0;34 bleu gras 1;34 magenta 0;35 magenta gras 1;35 cyan 0;36 cyan gras 1;36 blanc 0;37 blanc gras 1;37
$HISTSIZE et $HISTFILESIZE ; la première indique combien de commandes sont mises en mémoire à l'ouverture de la session ainsi que combien seront enregistrées dans l'historique à sa fermeture, et la deuxième combien d'entrées l'historique peut contenir au maximum (par défaut : 500).
HISTSIZE=1000 HISTFILESIZE=50000
history vous permet d'afficher l'historique des commandes exécutées dans le shell, mais par défaut elle n'affiche pas la date et encore moins l'heure à laquelle ces commandes ont été exécutées. Pour horodater cet historique, utilisez la variable d'environnement $HISTTIMEFORMAT :
export HISTTIMEFORMAT="%d/%m/%Y %H:%M:%S "À partir de maintenant, votre historique sera horodaté (les entrées dans le fichier
.bash_history sont préfixées d'un ''timestamp'' UNIX), et l'output de la commande history ressemblera à ça :
$ history | tail -n 5 27 08/05/2009 12:29:15 uname -a 28 09/05/2009 12:29:45 cd /tmp 29 09/05/2009 12:29:46 ls 30 09/05/2009 12:30:05 cd .. 31 09/05/2009 12:30:20 history | tail -n 5
Consultez la page de manuel strftime(3) pour toute référence aux options de formatage disponibles.
!!:gs/ancienparamètre/nouveauparamètre/
L'history expansion de Bash est très puissante, et la section du man qui la documente est à cette image : copieuse. Pour la petite histoire, !! signifie qu'on réfère à la ligne d'historique précédente — c'est à dire, la ligne de commande exécutée juste avant —, :g signifie qu'on applique la substitution à toute la ligne de commande (par défaut, seul la première occurrence est substituée) et enfin le mondialement connu s/foo/bar/ qui demande la substitution de "foo" par "bar".
Il est également possible de combiner cette fonctionnalité avec celle qui permet de ré-exécuter une commande avec la forme !XX où XX est le début de la commande. Par exemple, la commande suivante ré-exécute la dernière occurrence de scp en remplaçant "serveur01" par "serveur42" :
!scp:gs/serveur01/serveur42/
$ mkdir a b c d $ rmdir !:2-3 <= on réutilise uniquement le 2ème et 3ème paramètre de la commande précédente, soit "b" et "c" rmdir b c $ ls a d
Là encore, je vous renvoie vers le man de Bash, section "HISTORY EXPANSION" pour une référence exhaustive de la syntaxe.
Basiquement, on déclare un descripteur de fichier supplémentaire qui pointe vers un fichier /tmp/monscript-erreurs.log et on redirige la sortie STDERR vers ce nouveau descripteur.
.bash_aliases aux petits oignons avec tout plein d'alias pour vous faciliter la vie, et c'est très bien. Mais comment faites-vous le jour où vous avez justement besoin d'utiliser une de ces commandes sans les paramètres de l'alias ? Devez-vous supprimer cet alias le temps d'exécuter votre commande et ensuite le recréer ? Noooonnnn, il suffit d'invoquer la commande précédée d'un antislash pour inhiber temporairement l'alias et ainsi appeler la commande "au naturel" :
$ du mon_fichier 6420 mon_fichier $ alias du='du -h' $ du mon_fichier 6.3M mon_fichier $ \du mon_fichier 6420 mon_fichier
$EDITOR est bien définie au nom du binaire de votre éditeur favori, et exécutez la combinaison de touches suivante :
<Ctrl-x> <Ctrl-e>
Votre éditeur de texte ouvrira sur un document vierge dans lequel vous pouvez prendre le temps de confectionner votre ligne de commande, cette dernière sera exécutée par le shell après que vous ayez enregistré/quitté l'éditeur.
fc pour ouvrir un éditeur, mais cette fois ci le contenu du fichier sera la dernière commande exécutée.unset HISTFILEToutefois, il est également possible de définir une liste de commande ne devant jamais être prises en compte par l'historique de Bash. Il suffit de définir pour cela la variable d'environnement
$HISTIGNORE (chaque entrée devant être séparée par deux points) :
export HISTIGNORE='ls:ls *'
$((expression arithmétique)) :
$ echo $((2 + 2)) 4 $ echo $(((2 * 20) + 3 - 1)) 42
$(commande) qui a la même fonction que `commande`.while read ligne do echo $ligne done < fichier.txtExemple qui préfixe toutes les lignes d'un fichier avec la chaîne "PREFIX" :
$ ls -l / > /tmp/fichier.txt $ while read line; do echo "PREFIX $line"; done < /tmp/fichier.txt PREFIX total 3906357 PREFIX drwxr-xr-x 2 root root 4096 9 août 17:59 bin PREFIX drwxr-xr-x 4 root root 1024 5 août 08:53 boot PREFIX drwxr-xr-x 16 root root 5500 5 août 09:20 dev PREFIX drwxr-xr-x 60 root root 4096 9 août 17:59 etc PREFIX drwxr-xr-x 3 root root 4096 6 avril 12:34 home PREFIX drwxr-xr-x 8 root root 4096 9 août 17:59 lib ... PREFIX drwxrwxrwt 10 root root 28672 10 août 10:04 tmp PREFIX drwxr-xr-x 10 root root 4096 9 août 17:59 usr PREFIX drwxr-xr-x 14 root root 4096 9 août 17:59 var
grep/awk/sed.
Tout d'abord, il faut activer l'option extglob de Bash si ce n'est pas déjà fait :
$ shopt extglob extglob off $ shopt -s extglob $ shopt extglob extglob onIl est désormais possible d'exclure des fichiers ou des répertoires en correspondant à un motif donné. Considérons l'exemple d'un répertoire contenant des images de différents formats, pour lequel on souhaite lister toutes les images n'étant pas au format GIF :
$ ls a.jpg b.jpg c.jpg d.gif e.gif f.png g.png h.png $ ls !(*gif) a.jpg b.jpg c.jpg f.png g.png h.pngOu encore, ne pas lister les images dont le nom de fichier commence par une lettre comprise entre "a" et "c" :
$ ls !([a-c]*) d.gif e.gif f.png g.png h.pngIl est également possible de déclarer plusieurs motifs à filtrer, par exemple ici on ne souhaite lister que les fichiers dont le nom ne commence pas par une lettre comprise entre "a" et "c" et dont l'extension n'est pas
.png :
$ ls !([a-c]*|*png) d.gif e.gif
-d aux options de votre ls.script.sh 2>erreurs.log par exemple), il est possible de faire cela plus proprement depuis le script :
#!/bin/bash exec 3>/tmp/monscript-erreurs.log exec 2>&3 ... exit 0
# Déclaration + assignation d'éléments à un tableau "ARRAY2" (indexés par indices numériques) :
declare -a ARRAY1
ARRAY1[0]="toto"
ARRAY1[1]="titi"
ARRAY1[2]="tata"
ARRAY1[3]="tutu"
# Variante :
ARRAY1=(toto titi tata tutu)
# Déclaration + assignation d'éléments à un tableau "ARRAY1" (indexés par clés alphanumériques) :
declare -A ARRAY2
ARRAY2["toto"]="TOTO"
ARRAY2["titi"]="TITI"
ARRAY2["tata"]="TATA"
ARRAY2["tutu"]="TUTU"
# Récupérer le nombre d'éléments contenus dans le tableau :
echo ${#ARRAY1[@]} ${#ARRAY2[@]}
4 4
# Récupérer l'intégralité des éléments contenus dans le tableau :
echo ${ARRAY1[@]}
toto titi tata tutu
echo ${ARRAY2[@]}
TUTU TATA TITI TOTO