On désigne souvent le shell par :
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.
COMMANDE [ESPACE] ARGUMENT_1 [ESPACE] ARGUMENT_2 [ESPACE] ... ARGUMENT_N
Retourne un "Result Code" (RC) compris entre 0 et 127.
Présentation avec GUI ouvert.
pwd cd /tmp pwd cd pwd cd - pwd cd cd ~ pwd ls ls -a
Présentation avec GUI ouvert.
touch foo cp foo bar mv bar baz rm foo mkdir pif mkdir -p paf/pouf
ls -l foo chmod u-r foo ls -l foo sudo chown root:root foo ls -l
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
id last ps u ps aux uptime top du -h df -h free -h mount
history
On peut utiliser les fleches haut et bas du clavier pour parcourir l'historique des commandes que l'on a entrées.
Avec la combinaison de touch [CTRL]-[R] on peut rechercher dans l'historique et ça ça change la vie.
Avec la variable d'envrionnement HISTCONTROL=ignoreboth (en général configurée par défaut) si on ne souhaite pas qu'une commande apparaissent dans l'historique, on peut la préfixer par un [ESPACE].
echo "$HISTCONTROL" HISTCONTROL=ignoreboth echo "message public" echo "message secret" echo "message public 2" history 10
Généralement la commande history à des options pour allez supprimer des entrées dans l'historique.
help history echo "mon secret" history 5 history -d -3 history 5
Attention les expansions dependent beaucoup du shell (sh, bash, zsh, ...) L'expansion des arguments a lieu avant d'executer la commande.
rm -rf work1 ; mkdir work1 ; cd work1 touch foo bar baz ls f* ls b* ls b?z echo {A..C}
Tous les programmes :
Par défaut :
rm bar ; echo $? rm bar 2> /dev/null ; echo $?
rm -rf work2 ; mkdir work2 ; cd work2 echo "Hello World" > foo cat foo > foo cat foo
> bar echo hello > bar cat bar echo world >> bar cat bar
Lecture de l'entrée depuis un fichier.
read txt ; echo "$txt" echo "Hello world !" > foo read txt < foo ; echo "$txt"
cat << EOF foo bar baz EOF
echo "sur la sortie standard" >&2 echo "sur la sortie d'erreur"
echo "pif" > stdout >&2 echo "paf" 2> stderr >&2 echo "pouf" > stdout 2>&1
"Pipeliner" 2 programmes permet d'enchainer l'exécution des 2 programmes. La sortie standard (STDOUT) du premier programme (à gauche) sera "streamée" dans l'entrée standard (STDIN) du second programme.
cat bar | grep "lo"
echo "un" ; echo "deux" echo "OR_1" || echo "OR_2" echo "AND_1" && echo "AND_2" false ; echo "RC=$?" ! 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=$?"
echo $PATH echo $HOME echo $USER echo "$USER" echo '$USER' echo '"$USER"' echo "'$USER'" echo "$USERfoo echo "${USER}foo echo ${USER^^} TOUT_EN_MAJ="FOOBARBAZ" ; echo "${TOUT_EN_MAJ,,}" 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.
false || ( echo foo ; echo bar ; var=baz ) ; echo $var false || { echo foo ; echo bar ; var=baz ; } ; echo $var
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
Pour installer les packages nécéssaires sur debian/ubuntu like :
sudo apt install imagemagick exiftool
vim gere_mes_photos.sh #! /bin/bash usage() { >&2 echo "Message: $1" >&2 echo "usage: $0 [PHOTO_1] ... [PHOTO_N]" exit 1 } >&2 echo "Lancement de mon outil de gestion des photos ..." ./gere_mes_photos.sh chmod u+x gere_mes_photos.sh ./gere_mes_photos.sh
Un programme prend en paramètre des arguments séparés par des espaces (par défaut).
On vérifie que l'utilisateur nous fournit au moins un argument. On enrobe la variable $1 de double quottes ("") pour éviter les bugs lorsque la variable contient un espace par exemple.
test -n "$1" || usage "No picture supplied as argument !" test -n "$@" || usage "No picture supplied as argument !" ./gere_mes_photos.sh ./gere_mes_photos.sh foo
On utilise une boucle pour parser tous les arguments un par un.
for file in "$@"; do >&2 echo "Traitement du fichier: '$file' ..." done
On peut utiliser un bloc conditionnel pour effectuer un traitement.
if ! [ -f "$file" ]; then usage "Supplied file: [$file] is not a valid file !" fi ./gere_mes_photos.sh foo bar
tmpFile="compressed.${file}" >&2 echo "Compression du fichier [$file] > [$tmpFile] ..." convert -resize 50% "$file" "$tmpFile" >&2 echo "Renommage du fichier [$file] ..." exiftool '-Filename<CreateDate' -d '%Y-%m-%d-%H_%M_%S%%-c.%%e' "$tmpFile" rm -- "$tmpFile"
#! /bin/sh usage() { >&2 echo "$1" >&2 echo "usage: $0 <PHOTO_1> [PHOTO_2] ... [PHOTO_N]" exit 1 } test -n "$1" || usage "No picture supplied as argument !" for file in "$@"; do >&2 echo "Processing $file ..." if ! [ -f "$file" ]; then usage "Supplied file: [$file] is not a valid file !" fi tmpFile="compressed.${file}" >&2 echo "Compression du fichier [$file] > [$tmpFile] ..." convert -resize 50% "$file" "$tmpFile" >&2 echo "Renommage du fichier [$file] ..." exiftool '-Filename<CreateDate' -d '%Y-%m-%d-%H_%M_%S%%-c.%%e' "$tmpFile" rm -- "$tmpFile" done
Si focus sur les scripts, ne pas présenter les trucs non nécéssaires pour les scripts
tldr comme manuel express ?