2020-11-03 09:08:45 +11:00
|
|
|
\chapter{Le Shell}\index{shell}
|
2020-11-17 05:45:21 +11:00
|
|
|
\label{chap:shell}
|
2020-11-03 09:08:45 +11:00
|
|
|
|
2021-10-05 07:24:01 +11:00
|
|
|
Le \texttt{shell} est le coquillage qui isole le
|
|
|
|
MC/P\footnote{Master Control Program} des yusers.
|
2020-11-03 09:08:45 +11:00
|
|
|
En gros, hein, je vais simplifier, et me limiter aux
|
|
|
|
bricolages constructifs et/ou amusant. Il y aura du gore\index{gore}
|
2023-04-03 08:32:29 +11:00
|
|
|
aussi, parce que le shell est à la fois un interpréteur de commande
|
|
|
|
et un langage de programmation.
|
|
|
|
Ces deux notions ont beaucoup de choses en commun, comme nous
|
2023-10-09 06:56:41 +11:00
|
|
|
allons essayer de le voir. Certains qualifient le shell de
|
|
|
|
« langage de glue », et c'est une image assez pertinente.
|
2023-04-03 08:32:29 +11:00
|
|
|
|
|
|
|
Nous allons nous concentrer sur le \textsl{Bourne again shell}
|
|
|
|
(aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus
|
|
|
|
répandus, du moins dans le monde Linux\index{Linux}.
|
|
|
|
Mais il en existe d'autres : sh, ksh, ash, zsh, tthsh\dots
|
2023-10-09 06:56:41 +11:00
|
|
|
Ce qui, bien entendu, pose quelques problèmes de compatibilité.
|
|
|
|
|
|
|
|
Ou alors, il faut reste \textsc{posix}, mais c'est pour le moment
|
|
|
|
une autre histoire. Parce que là, on est plutôt dans une optique
|
|
|
|
« morefun » sur l'utilisation de nos machines.
|
2020-11-17 05:45:21 +11:00
|
|
|
|
2020-11-03 09:08:45 +11:00
|
|
|
% ==============================================================
|
|
|
|
|
|
|
|
\section{Interpréteur}\index{cli}
|
|
|
|
|
2023-10-09 06:56:41 +11:00
|
|
|
Ceci est un prompt : \texttt{tth@redlady:\textasciitilde\$}.
|
|
|
|
Son petit nom est \texttt{PS1}. On peut y
|
2023-06-29 20:23:11 +11:00
|
|
|
mettre plein d'informations utiles et de \textsl{mises en forme} assez
|
|
|
|
funky\footnote{Un peu de calme, fatalerrors !} permettant
|
2023-10-09 06:56:41 +11:00
|
|
|
d'enhancer la reliability de votre UI/UX. Mais surtout il est
|
|
|
|
là pour indiquer qu'il attend vos ordres, qu'il est prèt à
|
|
|
|
interpréter vos lignes de commandes.
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
tth@redlady:~$ date --utc
|
|
|
|
Thu Oct 5 00:53:01 UTC 2023
|
|
|
|
tth@redlady:~$
|
|
|
|
\end{verbatim}
|
2020-11-03 09:08:45 +11:00
|
|
|
|
|
|
|
% ==============================================================
|
|
|
|
|
|
|
|
\section{Langage}\index{script}
|
|
|
|
|
2023-06-29 20:23:11 +11:00
|
|
|
Le shell est aussi, et surtout, un langage de programmation, parfois
|
|
|
|
appelé \textsl{glue-language} parce qu'il permet de "coller" ensemble
|
|
|
|
plusieurs opérations élémentaires, d'abord avec ses opérateurs internes
|
|
|
|
et ensuite l'utilisation d'outils
|
|
|
|
extérieurs\footnote{Grep, Sed, Awk, BwBasic...}
|
|
|
|
divers. C'est \textsl{très} efficace.
|
|
|
|
|
2023-11-30 00:12:03 +11:00
|
|
|
% --------------------------------------------------------------
|
|
|
|
|
2023-06-29 20:23:11 +11:00
|
|
|
\subsection{Le \textsc{shebang}} \index{shebang}
|
|
|
|
|
|
|
|
Le shebang, c'est ce couple de caractères \texttt{\#!} qui apparait
|
|
|
|
au tout début d'un script shell.
|
|
|
|
Le 'she' est l'abréviation de 'sharp', coupant en français. C'est
|
|
|
|
probablement une allusion aux cotés tranchants du \texttt{\#}.
|
|
|
|
Quand au 'bang', c'est le point d'exclamation après l'explosion
|
|
|
|
de la forkbomb.
|
|
|
|
|
|
|
|
Quand on demande au noyau\index{kernel} d'exécuter un fichier
|
|
|
|
\texttt{(man 3 exec}), il va en lire d'abord les premiers
|
|
|
|
octets. Si les deux premiers sont \textsl{0x23 0x21}, le reste
|
|
|
|
de la première ligne sera interprété pour lancer un autre exécutable,
|
|
|
|
avec un traitement particuler des options.
|
2020-11-03 09:08:45 +11:00
|
|
|
|
|
|
|
% ==============================================================
|
2021-08-01 23:53:41 +11:00
|
|
|
\section{Le pipeline}\index{pipeline}\label{pipeline}
|
|
|
|
|
2023-06-29 20:23:11 +11:00
|
|
|
Une invention géniale, dont vous pouvez voir un exemple d'utilisation
|
|
|
|
par un gadget sonore en page \pageref{say-uptime} et
|
2021-08-01 23:53:41 +11:00
|
|
|
un bout de code C en page \pageref{filtre-unix}.
|
|
|
|
|
2023-10-09 06:56:41 +11:00
|
|
|
Exemple rapide, où la commande \texttt{uptime} envoie sa sortie dans
|
|
|
|
le tuyau, et la commande \texttt{tr} va lire le tuyau pour
|
|
|
|
son entrée~:
|
2023-06-29 20:23:11 +11:00
|
|
|
|
|
|
|
\begin{verbatim}
|
2023-10-09 06:56:41 +11:00
|
|
|
$ uptime | tr ' ' 'X'
|
2023-06-29 20:23:11 +11:00
|
|
|
X09:22:29XupX33Xdays,X14:00,XX8Xusers,XXloadXaverage:X0.12,X0.17,X0.17
|
|
|
|
\end{verbatim}
|
|
|
|
|
2023-10-09 06:56:41 +11:00
|
|
|
Bien entendu, on peut utiliser plusieurs tuyaux pour construire
|
|
|
|
une chaine de traitements\footnote{La
|
|
|
|
chaine de compilation \textsc{eqn/tbl/roff} est un bon exemple}.
|
|
|
|
On peut même « intercepter » ce qui transite par un des tuyaux.
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
$
|
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
% ==============================================================
|
|
|
|
|
2023-11-30 00:12:03 +11:00
|
|
|
\section{Structures de contrôle}
|
|
|
|
|
|
|
|
% --------------------------------------------------------------
|
|
|
|
|
|
|
|
\subsection {Les tests}
|
|
|
|
|
|
|
|
Deux éléments sont ils-égaux ?
|
|
|
|
|
|
|
|
% --------------------------------------------------------------
|
|
|
|
|
|
|
|
\subsection {Les boucles}
|
|
|
|
|
|
|
|
% ==============================================================
|
|
|
|
|
2023-10-09 06:56:41 +11:00
|
|
|
\section{Les fonctions}
|
|
|
|
|
|
|
|
Une bonne manière de rendre votre code modulaire, et de réutiliser
|
|
|
|
des bouts de code à volonté depuis plusieurs programmes.
|
|
|
|
|
|
|
|
Voici quelques fonctions~:
|
|
|
|
|
|
|
|
\lstinputlisting{code/shell/fonctions.sh}
|
|
|
|
|
|
|
|
Et comment les utiliser~:
|
|
|
|
|
|
|
|
\lstinputlisting{code/shell/demofonctions.sh}
|
|
|
|
|
|
|
|
% ==============================================================
|
|
|
|
|
|
|
|
% https://bwog-notes.chagratt.site/2023/le-heredoc/
|
|
|
|
|
|
|
|
\section{Heredoc}
|
|
|
|
|
2023-11-30 00:12:03 +11:00
|
|
|
Un nom bien difficile à traduire, peut-être par « document en place » ?
|
|
|
|
|
2023-10-09 06:56:41 +11:00
|
|
|
|
|
|
|
\lstinputlisting{code/shell/heredoc.sh}
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
tth@redlady:~/Devel/TetaTricks$ code/shell/heredoc.sh
|
2023-11-30 00:12:03 +11:00
|
|
|
|
|
|
|
Here Doc
|
|
|
|
|
|
|
|
1 +--------------------------------------------------------------------+
|
|
|
|
| +** *** + + + + |
|
|
|
|
0.8 |-+.......**..........:.**.......:..........:.........sin(x).*******-|
|
|
|
|
| ** : : * : : : : |
|
|
|
|
0.6 |-+....**..:..........:....**....:..........:..........:..........:+-|
|
|
|
|
| * : : * : : : : |
|
|
|
|
0.4 |-+.**.....:..........:.......*..:..........:..........:..........:+-|
|
|
|
|
| * : : * : : : : |
|
|
|
|
0.2 |-*........:..........:.........**..........:..........:..........:+-|
|
|
|
|
|* : : * : : : |
|
|
|
|
0 |-+........:..........:..........:**........:..........:..........:+-|
|
|
|
|
| : : : * : : : *|
|
|
|
|
-0.2 |-+........:..........:..........:..**......:..........:..........:*-|
|
|
|
|
| : : : * : : * |
|
|
|
|
-0.4 |-+........:..........:..........:.....*....:..........:........**:+-|
|
|
|
|
| : : : * : : * : |
|
|
|
|
-0.6 |-+........:..........:..........:.......**.:..........:.....**...:+-|
|
|
|
|
| : : : *: : ** : |
|
|
|
|
-0.8 |-+........:..........:..........:..........**.........:..**......:+-|
|
|
|
|
| + + + + *** +** + |
|
|
|
|
-1 +--------------------------------------------------------------------+
|
|
|
|
0 1 2 3 4 5 6
|
2023-10-09 06:56:41 +11:00
|
|
|
\end{verbatim}
|
|
|
|
|
|
|
|
Je pense que l'exemple est assez parlant.
|
|
|
|
Pour un exemple plus complet, toujours avec gnuplot, c'est vers la
|
|
|
|
page \pageref{chap:gnuplot}.
|
|
|
|
|
2023-06-29 20:23:11 +11:00
|
|
|
% ==============================================================
|
|
|
|
\section{Les \textsl{locales}}
|
|
|
|
\index{locales}
|
|
|
|
|
|
|
|
% new: Mon Apr 17 10:54:45 UTC 2023
|
|
|
|
|
|
|
|
Quelle sont les différences entre \texttt{en\_US.UTF-8} et
|
|
|
|
\texttt{C.UTF-8} ?
|
|
|
|
|
2021-02-04 19:56:36 +11:00
|
|
|
% ==============================================================
|
2020-11-03 09:08:45 +11:00
|
|
|
\section{Questions à voir}
|
|
|
|
|
2020-11-17 05:45:21 +11:00
|
|
|
\begin{itemize}
|
|
|
|
\item le traitement des chaines de caractères\dots
|
2023-06-29 20:23:11 +11:00
|
|
|
\item la gestion des co-routines\dots
|
2020-11-17 05:45:21 +11:00
|
|
|
\end{itemize}
|
2020-11-03 09:08:45 +11:00
|
|
|
|
|
|
|
|
|
|
|
% ==============================================================
|