Mise à jour : Debian 10.10
Sous Linux, l'exécution de plusieurs commandes peut s'effectuer
Sommaire
On dispose de trois types d'enchaînement :
$ commande1 | commande2
$ cat /etc/apt/sources.list |wc -l
25
$ yes | sudo aptitude upgrade
$ echo '#######' |sudo tee /etc/test
$ pv ./*.png |zip <backup.zip
$ dd if=/dev/urandom count=1000 bs=1 |shasum
$ dd if=/dev/urandom count=1000 bs=1 |pv |shasum
A; B MODE SEQUENTIEL : Exécuter A puis B, indépendamment du succès de A
A & Exécuter A en arrière plan
A & B & MODE PARALLEL : Exécuter A et B en arrière plan
Mode séquentiel : A ; B ; C : Exécuter A puis B puis C
$ var=5; var=$((var+5)) ; echo $var
10
Mode parallèle : A & B & : Exécuter A et B en arrière-plan
$ firefox & geany &
A && B Exécuter B si A réussit
A || B Exécuter B si A échoue
A && B || C Exécuter B si A réussit, exécuter C si A échoue
$ date && echo commande date réussie
mardi 24 août 2021, 22:43:54 (UTC+0200)
commande date réussie
$ datexxx && echo commande date réussie
datexxx: command not found
Exécuter B si A échoue
$ date || echo commande date échouée
mardi 24 août 2021, 22:45:48 (UTC+0200)
$ datexx || echo commande date échouée
datexx: command not found
commande date échouée
Exécuter B si A réussit, exécuter C si A échoue
$ date && echo commande date réussie || echo commande date échouée
mardi 24 août 2021, 22:46:55 (UTC+0200)
commande date réussie
$ datexx && echo commande date réussie || echo commande date échouée
datexx: command not found
commande date échouée
Les commandes peuvent être regroupées et exécutées
Soit dans le shell : utilisation des accolades : { commande1; commande2; } - Noter l'espace après la première accolade et avant la dernière accolade et le point virgule après chaque commande, y compris la dernière -
les variables disponibles dans le shell sont disponibles dans le sous-shell
les variables modifiées (ou créées) dans le regroupement sont modifiées ou crées dans le shell
Soit dans un sous-shell : utilisation des parenthèses : (commande1; commande2)
les variables disponibles dans le shell sont disponibles dans le sous-shell
les variables modifiées dans le sous-shell retrouvent leur valeur lors du retour dans le shell parent
les variables crées dans le sous-shell sont perdues au retour dans le shell parent
Comparaison regroupement avec et sans création de sous-shell :
Exécution dans le shell { }, les variables du shell sont modifiées :
$ unset i; { for i in {1..4}; do echo $i ; done; } > test ; echo i=$i
i=4
$ cat test
1
2
3
4
Exécution dans un sous-shell (), les variables du shell ne sont pas modifiées :
$ unset i; (for i in {1..4}; do echo $i ; done) > test ; echo i=$i
i=
$ cat test
1
2
3
4
$ rm test;(umask 66;touch test); ls -og test
-rw------- 1 0 août 24 23:01 test
Utilisation de la création de sous-shell pour afficher le résultat de la commande set avec l'option posix sans que soit modifié le shell appelant :
$ (set -o posix ; set )
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
.....
$ echo test |shasum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
$ echo test >démofile
$ cat démofile
test
$ echo test |shasum |wc -c
44
$ echo test >démofile
$ cat démofile
test
$ >démofile echo test
cat démofile
test
$ shasum <démofile
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
$ <démofile shasum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
$ <démofile shasum >shafile
$ cat shafile
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
$ shasum <démofile >shafile
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
$ <demofile shasum |hexdump -C 2>errorfile|wc -c >countfile
$ cat countfile
242
$ shasum <demofile |2> errorfile hexdump -C |>countfile wc -c
16:54 philippe@debian:~$ cat countfile
242
$ sort <<EOF |tr '[a-z]' '[A-Z]' >test
> Classement
> Par
> Ordre
> Alphabétique
> EOF
$ cat test
ALPHABéTIQUE
CLASSEMENT
ORDRE
PAR