RapazP Home Page
«Using GNU/Linux isn't a matter of choice. It's a matter of freedom!»
left_arrow Introduction
down_arrow GNU/Linux
left_arrow OpenSource
left_arrow Loisirs
left_arrow About me
Table des matières

Bash (Bourne-again shell) est l’interpréteur de commandes (ou shell) du projet GNU.

Bash est le shell par défaut de la plupart des distribution GNU/Linux ainsi que sur Mac OS X. Il peut être exécuté sur la plupart des systèmes d’exploitation Unix. Il a également été porté sur Microsoft Windows en utilisant l'émulation POSIX fournis par Cygwin.

1. Principe de redirection

Par défaut, lors de l’exécution d’une commande, toutes les informations sont affichées dans la console.

Il est cependant très simple de rediriger les sorties dans un fichier. Il suffit pour cela d’utiliser le caractère de redirection >.

La redirection > a pour effet de créer le fichier de sortie. Si ce fichier existe déjà, il est tout simplement écrasé. Ceci peut être gênant si vous désirez conserver le contenu de votre fichier, dans ce cas, la redirection >> l’ouvrira en mode ajout.

  • > ou 1> redirige la sortie standard (stdout) dans le fichier

    $ ls > liste.txt
    ou
    $ ls 1> liste.txt
  • 2> redirige la sortie d’erreur (stderr) dans le fichier

    $ ls 2> liste.txt
  • 2>&1 redirige stderr vers stdout puis dans le fichier

    $ ls > liste.txt 2>&1
  • &> redirige stderr et stdout dans le fichier

    $ ls &> liste.txt
Note
L’ordre d’utilisation des redirections est important.

La commande suivante ajoute "Bonjour" au fichier hello.txt

echo "Bonjour" 2> hello.txt 1>&2

alors que la commande suivante affiche "Bonjour" sur stdout.

echo "Bonjour" 1>&2 2> hello.txt

2. Raccourcis clavier

Il existe de nombreux raccourcis clavier destinés à vous faciliter la vie pour autant que vous arriviez à les mémoriser!

Déplacement

Ctrl + a

Déplace le curseur au début de la ligne courante

Ctrl + e

Déplace le curseur à la fin de la ligne courante

Alt + b

Déplace le curseur mot à mot vers l’arrière

Alt + f

Déplace le curseur mot à mot vers l’avant

Crtl + xx

Positionne le curseur au début ou à la fin du mot

Edition

Ctrl + k

Coupe la ligne après la position du curseur

Ctrl + u

Coupe la ligne avant la position du curseur

Ctrl + w

Coupe le chaîne avant le curseur

Alt + Backspace

Coupe le chaîne avant le curseur mais s’arrête aux "/" et au "."

Alt + d

Coupe le chaîne après le curseur

Ctrl + y

Colle la ligne ou la chaîne

Ctrl + h

Supprime le caractère avant le curseur (identique touche Backspace)

Ctrl + t

Inverse la position des deux caractères avant le curseur

Alt + t

Inverse la position des deux mots avant le curseur

Alt + c

Met une lettre en majuscule

Alt + l

Met un mot en minuscule

Alt + u

Met un mot en majuscule

Alt + .

Réécrit le dernier mot de la ligne précédente

Crtl + _

Annule la dernière modification

Historique

Ctrl + r

Recherche parmi les commandes précédentes

Ctrl + p

Commande précédente

Ctrl + n

Commande suivante

^[chaîne 1]^[chaîne 2]^

Exécute la dernière commande en remplaçant la [chaîne 1] par la [chaîne 2]

!#

Exécute la plus ancienne commande de l’historique

!!

Exécute la dernière commande

! + [chaîne]

Exécute la dernière commande commançant par la [chaîne] de caractères

!? + [chaîne]

Exécute la dernière commande contenant la [chaîne] de caractères

! + [n]

Rappelle la commande lancée il y a [n] commandes

[commande] + !^

Exécute la commande avec le premier argument de la commande précédente

[commande] + !:[n]-[m]

Exécute la commande avec les arguments de [n] à [m] de la commande précédente

[commande] + !:[n]

Exécute la commande avec l’argument [n] de la commande précédente

[commande] + !$

Exécute la commande avec le dernier argument de la commande précédente

Processus

Ctrl + c

Arrête la commande en cours

Ctrl + d

Quitte le shell courant

Ctrl + z

"Suspend" l’exécution de tous les processus en cours d’exécution. Les commandes fg ou bg permettent de (re)démarrer les processus.

Ctrl + s

Masque la saisie et suspends le défilement (Ctrl + q pour revenir)

Ctrl + q

Fait apparaître la saisie et relance l’affichage

Divers

Tab

Complète automatiquement le nom du fichier ou répertoire

Ctrl + l

Efface le contenu de l'écran (idem commande clear)

Note Certaine de ces commandes ne fonctionnent pas selon que vous accédez au bash via une session telnet/ssh ou selon la façon dont vous avez organiser les touches de votre clavier.

3. Recherche avec la commande find

La commande find permet de chercher des fichiers et éventuellement d’effectuer une action sur les résultats recherche. Bien que sa syntaxe est quelque peu complexe, il n’en demeure pas moins qu’elle est très puissante et souple.

Dans les lignes qui suivent je n’ai pas prétention d’expliquer le fonctionnement de la commande find mais plutôt de donner quelques astuces afin de vous simplifier la vie lors d’une recherche.

find cherche de manière récursive les fichiers qui correspondent aux critères définis: nom (name), propriétaire (owner), groupe (group), type (type), autorisations (permissions), taille (size), etc.

Tip Par défaut, le contenu d’un répertoire lié symboliquement n’est pas traité. Pour y remédier, il faut ajouter l’option '-L'.

3.1. Actions sur le résultat

Il existe deux moyens d’exploiter le résultat d’une recherche soit via la commande xargs, soit via l’option -exec, toutes deux ayants certains avantages et inconvénients.

3.1.1. xargs

xargs divise les arguments reçus en paramètre avec des espaces ou des retour-chariots. Si un nom de fichier (ou de chemin) contient des espaces par exemple "mon document.odt", xargs va interpréter "mon" et "document.odt" comme étant deux fichiers distincts.

La solution pour éviter ce problème consiste à ajouter le paramètre '-0' à la commande xargs et '-print0' comme dernier argument de la commande find. Ainsi les espaces de fin de chaînes sont remplacés par null au lieu de blanc.

De plus, dans le cas où le résultat de la commande find est vide, xargs ne mettra pas fin au traitement et tentera d’exécuter la commande cible ce qui peut occasionner une erreur dans le traitement de cette dernière. Pour éviter ce cas de bord on ajoutera l’option '-r' à la commande xargs.

Avantages
  • Le traitement des résultats est plus efficace qu’avec l’option -exec

  • Le résultat de la commande xargs peut être réutilisée avec un pipe (|)

3.1.2. -exec

L’option -exec (à ne pas confondre avec la commande shell exec) exécute la commande sur chaque fichier trouvé répondant aux critères de recherche.

La paire d’accolade est automatiquement remplacée par le nom du fichier. Si le nom du fichier contient des caractères spéciaux, le shell tentera de les interpréter. Pour éviter cette interprétation, les accolades doivent être entourées d’apostrophe ('{}').

Enfin, l’instruction à exécuter (ou commande) doit être terminée par un backslash et un point-virgule (\;).

3.1.3. Exemples

Recherche d’une expression

Il est parfois nécessaire de pouvoir rechercher une chaîne de caractères dans une série de fichiers.

Les commandes suivantes effectuent cette recherche depuis le répertoire courant de manière récursive et affiche le résultat dans la console. L’une utilise la commande xargs, l’autre l’option -exec.

$ find . -name '*.txt' -print0 | xargs -0 -r grep 'linux'

ou

$ find . -name '*.txt' -exec grep 'linux' '{}' \; -print

3.1.4. Sources

4. Manipulation de fichiers

4.1. Compression

Il peut être intéressant parfois de ne prendre un compte que certains fichiers lors de la création d’une archive zip.

La commande suivante permet de créer un fichier \*.zip (nommé sources.zip) contenant tous les fichiers ayant l’extension \*.java de manière récursive à partir du répertoire courant.

$ zip -r sources.zip . -i \*.java

4.2. Changement de l’encodage

Certains OS utilisent par défaut l’encodage UTF-8 (cas de linux) alors que d’autres utilisent l’encodage ISO-8859-1 (également appelée Latin-1). Ce codage différent des caractères pose parfois des problèmes lorsque l’on souhaite réutiliser des fichiers créés sous un autre système.

Pour continuer à manipuler ces fichiers, deux commandes peuvent être utiles: file et iconv.

  • La première permet de vérifier l’encodage:

    $ file liste.txt
    liste.txt: UTF-8 Unicode HTML document text, with CRLF line terminators
  • La seconde permet de convertir l’encodage:

    $ iconv -f ISO-8859-1 -t UTF-8 < [source] > [destination]
    ou
    $ iconv --from-code=UTF-8 --to-code=ISO-8859-1 < [source] > [destination]
Note

Pour convertir l’encodage d’un fichier provenant d’un iSeries (encodage EBCDIC), il faut utiliser le jeu de caractères IBM-1047.

Pour ce genre de fichiers, il est également possible de les convertir à la volée ainsi le contenu de ce dernier sera affiché dans la console. Si vous désirez les éditer par la suite, il faudra rediriger la sortie dans un fichier.

$ cat <fichier_ebcdic> | dd conv=ascii      # ebcdic vers ascii
ou
$ cat <fichier_ascii> | dd conv=ebcdic      # ascii vers ebcdic
Warning N’utilisez pas le même nom pour la source et la destination au risque de perdre votre fichier!

4.3. Remplacement d’une chaîne

Cette commande remplace toutes les occurences de la chaîne de caractères recherchée dans le fichier par une nouvelle chaîne.

$ perl -pi -e 's/hello/goodbye/g;' monTexte.txt

Une autre solution consiste à utiliser l'éditeur non interactif sed. Cet éditeur permet d’appliquer un certain nombres de commandes sur un fichier puis d’en afficher le résultat sur la sortie standard. Le fichier d’origine n’est de ce fait pas modifié.

$ sed 's/hello/goodbye/g;' monTexte.txt

Il est néanmoins possible de modifier le contenu du fichier d’origine en ajoutant l’option '-i'.

La commande ci-après recherche toutes les lignes contenant le mot nombre puis remplace le mot hello par goodbye si ce dernier est présent sur la ligne.

$ sed -i '/nombre/ s/hello/goodbye/g;' monTexte.txt

4.3.1. Changement de CVS

La commande ci-dessous permet de changer le serveur cvs d’un projet.

4.3.2. Changement du carriage return

GNU\Linux et Windows n’encode malheureusement pas les fins de ligne de la même manière.

La commande suivante liste tous les fichiers ('-type f') du répertoire courant ('-maxdepth 1') et remplace tous les caractères de fin de ligne; '\r\n' (Windows) par '\n' (GNU\Linux).

5. Divers

5.1. Reprise d’une copie avec scp

La commande scp (secure copy) permet de copier de manière sécurisée (via ssh) des fichiers sur des ordinateurs distants. Bien que très pratique, cette dernière ne permet pas la reprise d’une copie après une interruption du téléchargement.

Ceci est plutôt déplaisant lorsque vous transférer de gros fichiers. Néanmoins il existe une solution: la commande rsync.

Prenons l’exemple d’une copie d’un fichier de mon poste sur un ordinateur distant. Dans ce cas, j’utiliserai la syntaxe suivante:

$ scp monTexte.txt toto@hostName:/tmp/

En cas de coupure de téléchargement, je vais reprendre le transfert avec la commande ci-dessous.

$ rsync --partial --progress --rsh=ssh monTexte.txt toto@hostName:/tmp/
Les options utilisées sont les suivantes
--partial       Permet de relancer le téléchargement depuis le point d'arrêt
--progress      Affiche la progression du transfert
--rsh=ssh       Permet de sécuriser le transfert
Tip

Afin d'éviter une saisie régulière de l’intégralité de cette commande, vous pouvez ajouter l'alias ci-après dans le fichier .bashrc de votre profile ('~/.bashrc').

alias scpresume="rsync --partial --progress --rsh=ssh"

Ainsi la commande scpresume fonctionnera comme la commande scp.

5.1.1. Sources

6. Liens