TetaTricks/chap/shell.tex

168 lines
6.5 KiB
TeX
Raw Normal View History

2020-11-02 23:08:45 +01:00
\chapter{Le Shell}\index{shell}
2020-11-16 19:45:21 +01:00
\label{chap:shell}
2020-11-02 23:08:45 +01:00
2021-10-04 22:24:01 +02:00
Le \texttt{shell} est le coquillage qui isole le
MC/P\footnote{Master Control Program} des yusers.
2020-11-02 23:08:45 +01: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-02 23:32:29 +02: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-08 21:56:41 +02:00
allons essayer de le voir. Certains qualifient le shell de
« langage de glue », et c'est une image assez pertinente.
2023-04-02 23:32:29 +02: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-08 21:56:41 +02: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-16 19:45:21 +01:00
2020-11-02 23:08:45 +01:00
% ==============================================================
\section{Interpréteur}\index{cli}
2023-10-08 21:56:41 +02:00
Ceci est un prompt : \texttt{tth@redlady:\textasciitilde\$}.
Son petit nom est \texttt{PS1}. On peut y
2023-06-29 11:23:11 +02:00
mettre plein d'informations utiles et de \textsl{mises en forme} assez
funky\footnote{Un peu de calme, fatalerrors !} permettant
2023-10-08 21:56:41 +02: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-02 23:08:45 +01:00
% ==============================================================
\section{Langage}\index{script}
2023-06-29 11:23:11 +02: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.
\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-02 23:08:45 +01:00
% ==============================================================
2021-08-01 14:53:41 +02:00
\section{Le pipeline}\index{pipeline}\label{pipeline}
2023-06-29 11:23:11 +02: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 14:53:41 +02:00
un bout de code C en page \pageref{filtre-unix}.
2023-10-08 21:56:41 +02: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 11:23:11 +02:00
\begin{verbatim}
2023-10-08 21:56:41 +02:00
$ uptime | tr ' ' 'X'
2023-06-29 11:23:11 +02:00
X09:22:29XupX33Xdays,X14:00,XX8Xusers,XXloadXaverage:X0.12,X0.17,X0.17
\end{verbatim}
2023-10-08 21:56:41 +02: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}
% ==============================================================
\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}
Un nom difficile à traduire, peut-être par « document en place » ?
\lstinputlisting{code/shell/heredoc.sh}
\begin{verbatim}
tth@redlady:~/Devel/TetaTricks$ code/shell/heredoc.sh
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
\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 11:23:11 +02: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 09:56:36 +01:00
% ==============================================================
2020-11-02 23:08:45 +01:00
\section{Questions à voir}
2020-11-16 19:45:21 +01:00
\begin{itemize}
\item le traitement des chaines de caractères\dots
2023-06-29 11:23:11 +02:00
\item la gestion des co-routines\dots
2020-11-16 19:45:21 +01:00
\end{itemize}
2020-11-02 23:08:45 +01:00
% ==============================================================