$ ls > liste.txt ou $ ls 1> liste.txt
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.
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
|
|
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 |
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) |
|
|
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. |
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.
|
|
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'. |
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.
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.
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 (|)
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 (\;).
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
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
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]
|
|
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 |
|
|
N’utilisez pas le même nom pour la source et la destination au risque de perdre votre fichier! |
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
La commande ci-dessous permet de changer le serveur cvs d’un projet.
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).
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/
--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
|
|
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. |