Le Shell Bash

De Wiki de la GUILDE
Aller à la navigationAller à la recherche

BASH

par E. Rouat pour Guilde

Introduction

Le shell est un programme qui vous permet de lancer des applications, d'interroger votre babasse, de dialoguer avec votre système en quelque sorte. C'est la base de n'importe quel système UNIX. Des shells, il en existe plusieurs: ksh (Korn Shell) bsh (Bourne Shell), csh (C Shell)... chacun avec ses avantages, ses inconvénients, ses particularités. Lorsque vous travaillez en mode texte (donc sans X), vous êtes en réalité directement en relation avec le shell. En mode X (donc avec des fenêtres), il faut d'abord exécuter un programme spécial pour pouvoir utiliser un shell - Xterm est l'un de ces programmes (et un des plus répandus). Avec le shell, vous pouvez exécuter n'importe quelle commande unix/linux classique (comme find , ou gzip, ou mkdir ..) plus quelques autres qui sont propres au shell (comme ulimit ou umask).

Pourquoi BASH (Bourne Again Shell) ?

  1. parce que c'est le shell par défaut de Linux
  2. parce que c'est celui que j'utilise
  3. commencez pas, hein !!

Quel est mon shell par défaut ?

Pour connaitre votre shell par défaut, il suffit de regarder dans le fichier /etc/passwd . Dans la ligne qui correspond à votre nom d'utilisateur, vous verrez à la fin votre shell par défaut. Pour changer de shell par défaut, utilisez la commande chsh (CHange SHell).

Configuration

Se loger sur un compte (utilisateur ou root) revient en fait à lancer un shell, nommé le 'login shell' (c'est en tout cas vrai si on se loge avec 'login', c'est à dire en mode texte. Si on se loge via xdm, donc en mode graphique, c'est un peu plus compliqué). Au moment de son lancement, ce login shell va lire un certain nombre de fichiers dans lesquels sont positionnées ou déterminées des variables d'environnements. Le premier fichier que Bash va lire est /etc/profile . Il est lu une seule fois, au login. Ceci étant vrai pour tous les utilisateurs, il peux donc servir à déterminer un certain nombre de variables communes à tous les utilisateurs de votre système. Voici un exemple de /etc/profile. Attention: le /etc/profile est commun à tous les shells (sauf csh/tcsh) il ne faut donc rien y mettre de particulier à Bash. Ensuite, bash lira le fichier ~/.bash_profile, qui est en fait votre /etc/profile personnel. Il est également lu une fois, au login. Voici un exemple de fichier .bash_profile. Il peux également s'appeler ~/.profile . (note : le symbole ~ (tilda) est un raccourci pour désigner votre répertoire racine personnel - ex., pour moi, ~ = /home/rouat ) Ensuite,, bash lira ensuite votre fichier ~/.bashrc dans lequel vous pouvez définir des raccourcis (alias) ou des fonctions plus complexes. L'exemple que voici commence par exécuter un autre bashrc, en l'occurence /etc/bashrc . C'est une astuce très simple pour permettre à l'administrateur système de définir des alias universels. Voici un exemple de /etc/bashrc. Le fichier .bashrc est lu à chaque fois qu'on lance bash, pas uniquement au login.

Il reste 3 fichiers qui peuvent être utiles:

  • le ~/.inputrc sert à modifier le comportement interactif de bash (entrée au clavier, sortie à l'écran...),
  • le ~/.logout est éxécuté lorsque vous quittez votre session,
  • le ~/.bash_history est le fichier où est stocké l'ensemble de vos commandes passées à bash - fort utile à l'occasion.

Trucs et astuces

Quelques trucs à connaitre sur bash:

  • la complétion de nom de fichiers se fait en appuyant sur la touche TABULATION. S'il y a plusieurs possibilités, bash vous les signalera.
  • si vous tapez !! comme commande, bash exécutera la dernière commande entrée. Si vous tapez !c , bash éxécutera la dernière commande commençant par 'c' . Vous pouvez aussi utiliser la flèche pointant vers le haut pour remonter dans l'historique des commandes.
  • plutôt que de retaper souvent une commande assez longue, définissez des 'alias' ou des 'function' , qui sont en fait des raccourcis bien pratiques pour les utilisateurs. Quelques exemples d'alias et de fonctions sont donnés dans les .bashrc qui accompagnent ce texte.
  • utilisez la commande 'help' pour avoir une aide (succinte) sur les commandes du shell (qui ne sont PAS des commandes unix, mais des fonctions internes au shell!)
  • pour lancer une application en arrière plan, il suffit de la faire suivre par un '&' ex.:
gzip toto &
compressera le fichier toto, tout en vous laissant la main.
  • on peut utilisez les symboles '>' et '<' pour rediriger un flot de données vers un fichier. Ex:
ls -l /usr/bin > toto
écrira le contenu de /usr/bin dans le fichier toto.
  • le symbole '|' sert à créer un 'tuyau' ('pipe' in Angliche) entre commandes - TRES PUISSANT !! Ex:
ls /usr/bin | wc -l
vous donnera le nombre de fichiers dans /usr/bin C'est exactement comme si on avait fait:
ls /usr/bin > toto
wc -l toto
sauf que l'on n'a pas eu à créer de fichier toto.
  • une commande placée entre `` sera substituée par son résultat au moment de l'éxécution du reste de la commande. Ex:
gunzip `find . -name '*.gz' `
va décompresser tous les fichiers se finissant par .gz récursivement à partir du répertoire courant.
  • Il est très simple d'éxecuter une commande si et seulement si la précedente à aboutie - par ex:
make depend && make all
Le 'make all' n'aura lieu que losque le 'make depend' sera terminé sans retourner d'erreur.
  • un 'man bash' vous procurera d'autres informations bien utiles. Pour finir, voici une commande:
tar cf - `find $HOME \! -type d -mtime -2 -print` | tar -C /mnt/zip -xvf -
Etudions la :
find $HOME \! -type d -mtime -2 -print va nous donner les noms des fichiers (mais PAS des répertoires) modifiés depuis moins de 2 jours.
Ensuite :
tar cf - `find $HOME \! -type d -mtime -2 -print` va en fait créer une archive tar (donc un fichier) de tous ces fichiers, avec comme point de sortie la sortie standard, donc l'écran.
On va donc capter cette sortie, et la rediriger vers une autre foncion via un tube :
tar cf - `find $HOME \! -type d -mtime -2 -print` | tar -C /mnt/zip -xvf - le second tar prend ce qui lui arrive via le tube, et le redéploie dans le répertoire /mnt/zip qui est celui ou j'ai monté mon zip.

Bilan: j'ai recopié tous les fichiers modifiés depuis moins de 2 jours de mon répertoire personnel ($HOME) sur un zip, en conservant l'arborescence. Pile-poil pour faire du backup (un peu simple, certes). Et aux petits malins qui me diraient qu'il y a plus simple, je répondrais que oui, mais que c'était pour expliquer !Notez: si j'avais fait un cp -R $HOME /mnt/zip , ça n'aurait pas donné le même résultat, car un cp recopie en dur tous les liens !

Voilà, ceci n'est qu'un premier jet. N'hésitez pas à réagir constructivement à cet article, en m'envoyant par exemple un petit emmanuel.rouat@wanadoo.fr mel (missive électronique)