bash

Configuration

Le fichier ~/.bashrc est un fichier qui est chargé à chaque exécution d’une session bash.
Il est dépendant de l’utilisateur puisque (par défaut) bash recherche ce fichier dans /home/user.

Ainsi, ce fichier sert à beaucoup de choses :

  • Positionner certaines variables globales de bash.
  • Configurer le bash en lui-même (configuration du prompt, des couleurs …)
  • Ajout de fonctions au bash (définitions de macros, alias, fonctions)
  • Et bien d’autres choses …

Recharger le .bashrc

Une fois des modifications apportées au fichier ~/.bashrc il convient de le recharger, sans quoi les modifications ne sont pas prises en compte : source ~/.bashrc ou . ~/.bashrc.

Commandes bash

Correction automatique des erreurs de frappe : shopt -s cdspell
Écriturede l’historique à la fin du fichier $HISTFILE : shopt -s histappend
Basculer le bash en mode vi : set -o vi ou ajouter set editing-mode vi dans le fichier /etc/inputrc ou ~/.inputrc

Variables globales

Pour voir le contenu d’une variable globale : echo \$LD_LIBRARY_PATH renverra /usr/local/lib.

Liste des principales variables globales de bash

CDPATH : Liste des répertoires (séparés par : ) dans lesquels cd va rechercher.
DISPLAY : Serveur X géré par ssh.
EDITOR : Editeur par défaut.
UID : L’UID de l’utilsateur courant.

Redirections

Rediriger la sortie d’une commande, vers un fichier (A noter, que le fichier ls.txt, si il existe, sera écrasé.): ls $>$ ls.txt.
Rediriger la sortie d’une commande, à la suite d’un fichier : ls $>>$ ls.txt
Rediriger le flux sortant stdout dans un fichier: ./programme $1>$ result_stdout.log
Rediriger le flux sortant stderr fans un fichier : /programme $2>$ result_stderr.log
Rediriger les flux sortant stderr et stdout dans un fichier (Supporté uniquement à partir de la version 4 de bash.) : ./programme $&>$ result_stderr.log
Rediriger le flux sortant stderr sur stdout (Et vice-versa $1>&2$) :./programme $2>&1$

Exporter une variable depuis un script bash

Dans un fichier test.sh :

#!/bin/bash
export CSCOPE_DB=/home/jmfrouin/cscope.out

Scripts

Tous les scripts bash doivent commencer avec le sha-bang : #!/bin/bash

De plus, ils doivent pouvoir être exécutés directement depuis le bash :

chmod u+x script.sh

Variables spéciales

Le bash définit quelques variables ayant une signification bien précise :

$0 : Nom du script.
$i ($i>0$) : Contient le i^eme argument (équivalent de argv en C).
$# : Nombre d’arguments (équivalent de argc en C).
$? : Contient le code de retour de la dernière commande shell.
$@ : “$1” “$2” “$3” …
$* : Liste de tous les paramètres séparés par un espace.
$$ : PID de l’interpréteur.
$\ : Chemin d’accès absolu.

Variables

Il est possible d’utiliser des variables dans les scripts bash.

Pour définir une variable, on utilise le signe =:

variable=14
variable=‘Test’

Pour y accéder plus tard, il suffit d’utiliser:

echo ${variable}

Tableaux

Il est possible d’utiliser des tableaux dans les scripts bash.

variable[0]=14
variable[1]=‘Test’

Pour y accéder plus tard, il suffit d’utiliser:

echo ${variable[0]}
echo ${variable[*]}

On remarque qu’il est donc possible de créer des tableaux de variables mixtes (nombres, chaînes de caractères …).

Chaînes de caractères

Chaîne de caractères sans interprétation : ’.
Chaîne de caractères sans interprétation, sauf de `, \$ et \ : “.
Pour toutes les fonctions ci dessous, string=abcABC123ABCabc

Longueur

Équivalent de la fonction strlen en C:

echo ${#string} # renverra 15

Sous Chaine

echo ${string:7:3} # 23A

Commandes composées

for nom [ in mot ] ; do liste ; done
for (( expr1 ; expr2 ; expr3 )) ; do liste ; done
select nom [ in mot ] ; do liste ; done
case mot in [ [(] motif [ | motif ] … ) liste ;; ] … esac
if liste; then liste; [ elif liste; then liste; ] … [ else liste; ] fi
while liste; do liste; done
until liste; do liste; done

Tests

test -a fichier ou [ -a fichier ]

-a fichier : Vrai si le fichier existe.
-b fichier : Vrai si le fichier existe et est un fichier spécial bloc.
-c fichier : Vrai si le fichier existe et est un fichier spécial caractère.
-d fichier : Vrai si le fichier existe et est un répertoire.
-e fichier : Vrai si le fichier existe.
-f fichier : Vrai si le fichier existe et est un fichier normal.
-g fichier : Vrai si le fichier existe et a son bit Set-GID de mis.
-h fichier : Vrai si le fichier existe et est un lien symbolique.
-k fichier : Vrai si le fichier existe et a son bit « sticky » de mis.
-p fichier : Vrai si le fichier existe et est un tube nommé (FIFO).
-r fichier : Vrai si le fichier existe et est accessible en lecture.
-s fichier : Vrai si le fichier existe et a une taille strictement positive.
-t fd : Vrai si fd est ouvert sur un terminal.
-u fichier : Vrai si le fichier existe et a son bit Set-UID de mis.
-w fichier : Vrai si le fichier existe et est accessible en écriture.
-x fichier : Vrai si le fichier existe et est exécutable.
-O fichier : Vrai si le fichier existe et appartient à l’UID effectif de l’utilisateur.
-G fichier : Vrai si le fichier existe et appartient au GID effectif du groupe.
-L fichier : Vrai si le fichier existe et est un lien symbolique.
-S fichier : Vrai si le fichier existe et est une « socket ».
-N fichier : Vrai si le fichier existe et a été modifié depuis sa dernière lecture.
fichier_1 -nt fichier_2 : Vrai si le fichier_1 est plus récent que le fichier_2 (selon les dates de dernière modification) ou si fichier_1 existe et non fichier_2.
fichier_1 -ot fichier_2 : Vrai si le fichier_1 est plus vieux que le fichier_2 ou si fichier_2 existe et non pas fichier_1.
fichier_1 -ef fichier_2 : Vrai si le fichier_1 et le fichier_2 se réfèrent au même périphérique et ont les mêmes numéros d’i-n.

String Manipulation