Ceci est une ancienne révision du document !
Table des matières
Workshop Shell Unix (Interpréteur de commandes)
Guidelines pour l'atelier
- Deconseiler de prendre des notes le workshop est disponible sur le wiki.
- Proposer d'interrompre et poser des questions à chaud.
- Demander à l'assemblé ce que va produire une ligne commande avant de l'exécuter.
Intro: shell / terminal
On désigne souvent le shell par :
- le terminal
- la console
- le shell
- le bash
Le shell Unix est une Interface en Ligne de Commande (CLI) qui permet à un utilisateur d’interagir avec un système d'exploitation Unix en entrant du texte. Le premier shell Unix date de 1971, et depuis, plusieurs sont nés avec chacun ses subtilités, ses avantages, et ses préférences. Dans les grandes lignes, tous les shell Unix se ressemblent. Dans la suite de cet article nous le désignerons simplement le shell.
Exemples de shell
- sh (Bourne shell) le plus répendu
- bash (Bourn again shell) le plus populaire ?
- zsh le plus geek ?
- ksh (Korn shell)
- ...
Navigation dans un FS (système de fichiers) : pwd ; cd ; ls
Présentation avec GUI ouvert.
pwd cd /tmp pwd cd pwd cd - pwd cd cd ~ pwd ls ls -a
Manipulation des fichiers : touch ; cp ; mv ; rm ; mkdir
Présentation avec GUI ouvert.
touch foo cp foo bar mv bar baz rm foo mkdir pif mkdir -p paf/pouf
Permissions des fichiers : ls -l ; chmod ; chown
ls -l foo chmod u-r foo ls -l foo sudo chown root:root foo ls -l
Obtenir de l'aide : man ; help
La commande man permet d'obtenir de l'aide sur les programmes installés. On peut rechercher le mot clé "foo" dans le manuel en tappant "/foo".
man man
L'aide des commandes internes au shell n'est pas disponible dans le manuel man. La commande help permet d'obtenir une aide sommaire sur les commandes du shell. Cette commande n'est pas disponible dans tous les shell : sur zsh elle est remplacée par run-help.
help help cd
Administration : ps ; top ; du ; df ; free ; mount
id last ps u ps aux uptime top du -h df -h free -h mount
Expansion : * ? ~ {1..5} {Z..A}
Attention les expansions dependent beaucoup du shell (sh, bash, zsh, ...)
rm -rf work1 ; mkdir work1 ; cd work1 touch foo bar baz ls f* ls b* ls b?z echo {A..C}
IO (Entrées Sorties) (redirection / pipelines) : > >> < << 2> |
TODO: Utiliser des schéma
Ecriture dans fichier : >
rm -rf work2 ; mkdir work2 ; cd work2 echo "Hello World" > foo cat foo > foo cat foo
Ecrire à la fin d'un fichier : >>
> bar echo hello > bar cat bar echo world >> bar cat bar
Rediriger l' entree : <
Lecture de l'entrée depuis un fichier.
read txt ; echo "$txt" echo "Hello world !" > foo read txt < foo ; echo "$txt"
Ecrire sur la sortie d'erreur : >&2
echo "sur la sortie standard" >&2 echo "sur la sortie d'erreur"
Rediriger les sorties : > 2> 2>&1
echo "pif" > stdout >&2 echo "paf" 2> stderr >&2 echo "pouf" > stdout 2>&1
Pipeline (chaîner des programmes) : |
cat bar | grep "lo"
Logique : ; && ||
echo "un" ; echo "deux" echo "OR_1" || echo "OR_2" echo "AND_1" && echo "AND_2" false ; echo "RC=$?" true || echo "second statement" ; echo "RC=$?" false || echo "second statement" ; echo "RC=$?" true && echo "second statement" ; echo "RC=$?" false && echo "second statement" ; echo "RC=$?"
Interpretation des variables : $USER $PATH $PS1 $?
echo $PATH echo $HOME echo $USER echo "$USER" echo '$USER' echo '"$USER"' echo "'$USER'" export echo $PS1 echo $? echo $!
Il existe une priorité entre simple et double quotte. Une variable ne sera jamais interprété entre simple quottes sauf si englobé entre double quottes.
Un peu de recul : execution des commandes
On peut exécuter les commandes intégrés au shell ou les programmes executables.
which cd ; echo $? which pwd ; echo $? ls -l /usr/bin/pwd
Pour exécuter un programme il faut qu'il soit exécutable puis il faut tapper son nom dans l'invite de commande suivi de entrer.
/usr/bin/ls ls echo $PATH PATH="/tmp" ls which ls /usr/bin/ls cd /usr/bin ls ./ls
Scripts : philosophie tests loops fonctions
Fil rouge : un script pour trier ses photos
- variables
- conditions
- fonctions
- boucles
- return code (exit)
Philosophie UNIX
- Écrivez des programmes qui effectuent une seule chose et qui le font bien.
- Écrivez des programmes qui collaborent.
- Écrivez des programmes pour gérer des flux de texte [en pratique des flux d'octets], car c'est une interface universelle.