<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://knowledge.pinon-hebert.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jpinon</id>
	<title>knowledge - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://knowledge.pinon-hebert.fr/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jpinon"/>
	<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/Sp%C3%A9cial:Contributions/Jpinon"/>
	<updated>2026-09-18T15:03:05Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ANSI&amp;diff=2210</id>
		<title>ANSI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ANSI&amp;diff=2210"/>
		<updated>2026-09-10T11:55:35Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Couleurs étendues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Les codes d&#039;échappement ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!Abbr&lt;br /&gt;
!Name&lt;br /&gt;
!Effect&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; A&lt;br /&gt;
|CUU&lt;br /&gt;
|Cursor Up&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Moves the cursor &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) cells in the given direction. If the cursor is already at the edge of the screen, this has no effect.&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; B&lt;br /&gt;
|CUD&lt;br /&gt;
|Cursor Down&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; C&lt;br /&gt;
|CUF&lt;br /&gt;
|Cursor Forward&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; D&lt;br /&gt;
|CUB&lt;br /&gt;
|Cursor Back&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; E&lt;br /&gt;
|CNL&lt;br /&gt;
|Cursor Next Line&lt;br /&gt;
|Moves cursor to beginning of the line &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines down. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; F&lt;br /&gt;
|CPL&lt;br /&gt;
|Cursor Previous Line&lt;br /&gt;
|Moves cursor to beginning of the line &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines up. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; G&lt;br /&gt;
|CHA&lt;br /&gt;
|Cursor Horizontal Absolute&lt;br /&gt;
|Moves the cursor to column &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; ; &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt; H&lt;br /&gt;
|CUP&lt;br /&gt;
|Cursor Position&lt;br /&gt;
|Moves the cursor to row &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;, column &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt;. The values are 1-based, and default to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (top left corner) if omitted. A sequence such as &amp;lt;code&amp;gt;CSI ;5H&amp;lt;/code&amp;gt; is a synonym for &amp;lt;code&amp;gt;CSI 1;5H&amp;lt;/code&amp;gt; as well as &amp;lt;code&amp;gt;CSI 17;H&amp;lt;/code&amp;gt; is the same as &amp;lt;code&amp;gt;CSI 17H&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CSI 17;1H&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; J&lt;br /&gt;
|ED&lt;br /&gt;
|Erase in Display&lt;br /&gt;
|Clears part of the screen. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (or missing), clear from cursor to end of screen. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, clear from cursor to beginning of the screen. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS). If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, clear entire screen and delete all lines saved in the scrollback buffer (this feature was added for xterm and is supported by other terminal applications).&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; K&lt;br /&gt;
|EL&lt;br /&gt;
|Erase in Line&lt;br /&gt;
|Erases part of the line. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (or missing), clear from cursor to the end of the line. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, clear from cursor to beginning of the line. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, clear entire line. Cursor position does not change.&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; S&lt;br /&gt;
|SU&lt;br /&gt;
|Scroll Up&lt;br /&gt;
|Scroll whole page up by &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines. New lines are added at the bottom. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; T&lt;br /&gt;
|SD&lt;br /&gt;
|Scroll Down&lt;br /&gt;
|Scroll whole page down by &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines. New lines are added at the top. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; ; &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt; f&lt;br /&gt;
|HVP&lt;br /&gt;
|Horizontal Vertical Position&lt;br /&gt;
|Same as CUP, but counts as a format effector function (like CR or LF) rather than an editor function (like CUD or CNL). This can lead to different handling in certain terminal modes.&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; m&lt;br /&gt;
|SGR&lt;br /&gt;
|Select Graphic Rendition&lt;br /&gt;
|Sets colors and style of the characters following this code&lt;br /&gt;
|-&lt;br /&gt;
|CSI 5i&lt;br /&gt;
|&lt;br /&gt;
|AUX Port On&lt;br /&gt;
|Enable aux serial port usually for local serial printer&lt;br /&gt;
|-&lt;br /&gt;
|CSI 4i&lt;br /&gt;
|&lt;br /&gt;
|AUX Port Off&lt;br /&gt;
|Disable aux serial port usually for local serial printer&lt;br /&gt;
|-&lt;br /&gt;
|CSI 6n&lt;br /&gt;
|DSR&lt;br /&gt;
|Device Status Report&lt;br /&gt;
|Reports the cursor position (CPR) by transmitting &amp;lt;code&amp;gt;ESC[n;mR&amp;lt;/code&amp;gt;, where &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is the row and &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt; is the column.&lt;br /&gt;
|-&lt;br /&gt;
|CSI s&lt;br /&gt;
|SAV&lt;br /&gt;
|Save cursor&lt;br /&gt;
|Save the current cursor position (L;C). to be used with RCL&lt;br /&gt;
|-&lt;br /&gt;
|CSI u&lt;br /&gt;
|RCL&lt;br /&gt;
|Restore cursor&lt;br /&gt;
|Move back cursor to the position saved by SAV&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Les styles ==&lt;br /&gt;
Il s&#039;agit de détailler les codes :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; m&lt;br /&gt;
|SGR&lt;br /&gt;
|Select Graphic Rendition&lt;br /&gt;
|Sets colors and style of the characters following this code&lt;br /&gt;
|}&lt;br /&gt;
Le tableau suivant donne les modes existants:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;n&#039;&#039;&lt;br /&gt;
!Name&lt;br /&gt;
!Note&lt;br /&gt;
!Exemple *&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Reset &#039;&#039;or&#039;&#039; normal&lt;br /&gt;
|All attributes become turned off&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Bold or increased intensity&lt;br /&gt;
|As with faint, the color change is a PC (SCO / CGA) invention.&amp;lt;sup&amp;gt;[&#039;&#039;better source needed&#039;&#039;]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Faint, decreased intensity, &#039;&#039;or&#039;&#039; dim&lt;br /&gt;
|May be implemented as a light font weight like bold.&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Italic&lt;br /&gt;
|Not widely supported. Sometimes treated as inverse or blink.&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Underline&lt;br /&gt;
|Style extensions exist for Kitty, VTE, mintty and iTerm2.&lt;br /&gt;
|[[Fichier:ANSI4M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Slow blink&lt;br /&gt;
|Sets blinking to less than 150 times per minute&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Rapid blink&lt;br /&gt;
|MS-DOS ANSI.SYS, 150+ per minute; not widely supported&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|Reverse video &#039;&#039;or&#039;&#039; invert&lt;br /&gt;
|Swap foreground and background colors; inconsistent emulation&amp;lt;sup&amp;gt;[&#039;&#039;dubious – discuss&#039;&#039;]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|[[Fichier:ANSI7m.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Conceal &#039;&#039;or&#039;&#039; hide&lt;br /&gt;
|Not widely supported.&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Crossed-out, &#039;&#039;or&#039;&#039; strike&lt;br /&gt;
|Characters legible but marked as if for deletion. Not supported in Terminal.app&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Primary (default) font&lt;br /&gt;
|&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|11–19&lt;br /&gt;
|Alternative font&lt;br /&gt;
|Select alternative font &#039;&#039;n&#039;&#039; − 10&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|Fraktur (Gothic)&lt;br /&gt;
|Rarely supported&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|Doubly underlined; or: not bold&lt;br /&gt;
|Double-underline per ECMA-48, but instead disables bold intensity on several terminals, including in the Linux kernel&#039;s console before version 4.17.&lt;br /&gt;
|[[Fichier:ANSI4M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|Normal intensity&lt;br /&gt;
|Neither bold nor faint; color changes where intensity is implemented as such.&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|Neither italic, nor blackletter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|Not underlined&lt;br /&gt;
|Neither singly nor doubly underlined&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|Not blinking&lt;br /&gt;
|Turn blinking off&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|Proportional spacing&lt;br /&gt;
|ITU T.61 and T.416, not known to be used on terminals&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|Not reversed&lt;br /&gt;
|&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|Reveal&lt;br /&gt;
|Not concealed&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Les exemples sont pris sut putty/mobaxterm. N/A c&#039;est que, sur les terminaux caractère standards ce code est sans effet.&lt;br /&gt;
&lt;br /&gt;
== Les couleurs ==&lt;br /&gt;
&lt;br /&gt;
=== Couleurs de bases ===&lt;br /&gt;
On à 8 couleurs de bases + les mêmes couleurs en surintensité. (à la CGA pour ceux qui s&#039;en souviennent)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|30–37&lt;br /&gt;
|Set foreground color&lt;br /&gt;
|[[Fichier:ForogroundANSI.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|90-97&lt;br /&gt;
|Set bright foreground color&lt;br /&gt;
|[[Fichier:Ansi9x.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|40–47&lt;br /&gt;
|Set background color&lt;br /&gt;
|[[Fichier:ANSIbackground.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|100-107&lt;br /&gt;
|Set bright background color&lt;br /&gt;
|[[Fichier:10xansi.png|sans_cadre]]&lt;br /&gt;
|}&lt;br /&gt;
On peut chainer les changements en une seule commande:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
printf &amp;quot;\n\e[31;47m Hello Wor\e[0m\n\n&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Passe en rouge sur fond blanc!&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ansii combine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
=== Couleurs étendues ===&lt;br /&gt;
Là on passe aux écrans EGA, On agrandie la palette:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PaletteANSI.png|sans_cadre|395x395px]]&lt;br /&gt;
&lt;br /&gt;
Le nombre indique la couleur de fond :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ESC[48:5:⟨n⟩m Select background color&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La couleur du texte est soit blanc soit noir pour qu&#039;on puise le voir. Pour changer la couleur du texte on peut, de la même façon, &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ESC[38:5:⟨n⟩m Select foreground color&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Attention tous les terminaux ne savent pas interpréter ces codes:&lt;br /&gt;
&lt;br /&gt;
* Ceux qui ne savent pas : putty, cygwin (et donc mobaxterm)&lt;br /&gt;
* Ceux qui savent :  Le terminal de base linux sur raspberry PI (en mode texte), lxterminal, MINGW64 sous Windows et le terminal Windows (utilisé par WSL, powerShell...).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $c=0;&lt;br /&gt;
for ($i=16; $i&amp;lt;=231; $i++) {&lt;br /&gt;
        printf &amp;quot;\033[48:5:%3sm  &amp;quot;, $i;&lt;br /&gt;
        $c++;&lt;br /&gt;
        if (($c % 36)==0){&lt;br /&gt;
                print (&amp;quot;\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Rainbowlut.png|sans_cadre|512x512px]]&lt;br /&gt;
&lt;br /&gt;
==== En 24 bits ====&lt;br /&gt;
On passe au VGA. 8 bits par composantes &#039;&#039;&#039;r&#039;&#039;&#039;, &#039;&#039;&#039;g&#039;&#039;&#039; et &#039;&#039;&#039;b&#039;&#039;&#039;. 8x3=24 bits. Ca fait quelque chose comme 17 million de couleurs différentes (16 777 216 exactement). &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
for ($y=0; $y&amp;lt;=255; $y+=4){&lt;br /&gt;
        for ($x=0; $x&amp;lt;=255; $x+=2){&lt;br /&gt;
                printf (&amp;quot;\033[48;2;%s;%s;%sm &amp;quot;,$x,$y,255-$x);&lt;br /&gt;
        }&lt;br /&gt;
        print (&amp;quot;\033[0m\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne un joli:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RGBANSI.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Comme quoi dans un terminal en mode caractère on peut faire de joli dessins!&lt;br /&gt;
&lt;br /&gt;
Ces couleurs en 24 bits sont, elles, correctement gérées par putty/mobaxterm.&lt;br /&gt;
&lt;br /&gt;
== Utiliser dans du code ==&lt;br /&gt;
L&#039;utilisation des codes ANSI dans un programme peut se faire en incluant simplement les codes d’échappement dans les chaines de caractères écrites à l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
Ainsi pour écrire!&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ANSI example.png|sans_cadre|180x180px]] &lt;br /&gt;
&lt;br /&gt;
On utilisera la chaine :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Hello \033[7m world \033[0m !&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En shell ===&lt;br /&gt;
Attention en bash ou tout descendant du bourne shell un simple:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 echo &amp;quot;Hello \033[7m world \033[0m !&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Donnera ...&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Hello \033[7m world \033[0m !&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut préciser l&#039;option -e (enable escape characters) &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 echo -e &amp;quot;Hello \033[7m world \033[0m !&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ou (seulement en bash) la commande printf dont la syntaxes est celle du C.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 printf &amp;quot;Hello \033[7m world \033[0m !\n&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En C/C++ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void main(int argc, char** argv){&lt;br /&gt;
    printf (&amp;quot;Hello \033[7m world \033[0m !\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En perl ===&lt;br /&gt;
On peut faire simplement :&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
print &amp;quot;Hello \033[7m world \033[0m !\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:HelloWorld-ANSIPL.png|sans_cadre|147x147px]]&lt;br /&gt;
&lt;br /&gt;
Mais on peut utiliser la module Term::ANSIColor&lt;br /&gt;
&lt;br /&gt;
Il y a pas mal de façon de l&#039;utiliser. La plus simple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use Term::ANSIColor qw(:constants);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;[&amp;quot;.GREEN.&amp;quot;PASS&amp;quot;.RESET.&amp;quot;]\n&amp;quot;;&lt;br /&gt;
print &amp;quot;[&amp;quot;.RED.&amp;quot;FAIL&amp;quot;.RESET.&amp;quot;]\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PASSFAIL-ANSI-PL.png|sans_cadre|109x109px]]&lt;br /&gt;
&lt;br /&gt;
Les constantes utilisables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CLEAR           RESET             BOLD            DARK&lt;br /&gt;
FAINT           ITALIC            UNDERLINE       UNDERSCORE&lt;br /&gt;
BLINK           REVERSE           CONCEALED&lt;br /&gt;
&lt;br /&gt;
BLACK           RED               GREEN           YELLOW&lt;br /&gt;
BLUE            MAGENTA           CYAN            WHITE&lt;br /&gt;
BRIGHT_BLACK    BRIGHT_RED        BRIGHT_GREEN    BRIGHT_YELLOW&lt;br /&gt;
BRIGHT_BLUE     BRIGHT_MAGENTA    BRIGHT_CYAN     BRIGHT_WHITE&lt;br /&gt;
&lt;br /&gt;
ON_BLACK        ON_RED            ON_GREEN        ON_YELLOW&lt;br /&gt;
ON_BLUE         ON_MAGENTA        ON_CYAN         ON_WHITE&lt;br /&gt;
ON_BRIGHT_BLACK ON_BRIGHT_RED     ON_BRIGHT_GREEN ON_BRIGHT_YELLOW&lt;br /&gt;
ON_BRIGHT_BLUE  ON_BRIGHT_MAGENTA ON_BRIGHT_CYAN  ON_BRIGHT_WHITE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On se limite aux couleurs mais le module permet beaucoup de choses. Une description en français est disponible sur [https://perldoc.perl.org/Term::ANSIColor la page du module] lui même.&lt;br /&gt;
&lt;br /&gt;
=== En java ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class HelloWorld {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        System.out.println(&amp;quot;Hello \033[7m world \033[0m !&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bon au retour à la ligne près (certaint l&#039;incluent par défaut d&#039;autres pas) c&#039;est toujours la même chaine. &lt;br /&gt;
&lt;br /&gt;
Un langage fait le malin pour pas faire comme les autres python&lt;br /&gt;
&lt;br /&gt;
=== En python ===&lt;br /&gt;
Un simple &amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
print (&amp;quot;Hello \033[7m world \033[0m !&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afficahit un truc moche :Il interprètait (un peu) les codes ANSI pour les remplacer par... des espaces. Etrange.&lt;br /&gt;
Pour utiliser les codes ANSI il fallait utiliser une autre syntaxe et, de plus, seul les changements de couleurs (3x pour la couleur du texte et 4x pour le fond) sont acceptés.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print (u&amp;quot;Hello \u001B[47m\u001B[30m World \u001B[0m !&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne &amp;quot;presque&amp;quot; ce que nous attendons.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python-Hello-almost-perfect.png|sans_cadre|505x505px]]&lt;br /&gt;
&lt;br /&gt;
Le &amp;quot;World&amp;quot; est écrit en noir sur fond &#039;&#039;blanc sale&#039;&#039;. en Gris quoi.&lt;br /&gt;
&lt;br /&gt;
N&#039;essayez pas de remplacer \001B[47m par \001B[107m ça ne marches pas.&lt;br /&gt;
&lt;br /&gt;
Python a &amp;quot;sa syntaxe&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print (u&amp;quot;\nHello \u001B[47;1m\u001B[30m World \u001B[0m !&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le ;1 après le \u001B[47 et le m dit que la couleur doit être &amp;quot;vive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un nombre limité de fonctions de gestion de curseur sont aussi gérées:&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Up&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}A&amp;lt;/code&amp;gt; moves cursor up by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Down&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}B&amp;lt;/code&amp;gt; moves cursor down by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Right&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}C&amp;lt;/code&amp;gt; moves cursor right by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Left&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}D&amp;lt;/code&amp;gt; moves cursor left by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Next Line&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}E&amp;lt;/code&amp;gt; moves cursor to beginning of line &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; lines down&lt;br /&gt;
* &#039;&#039;&#039;Prev Line&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}F&amp;lt;/code&amp;gt; moves cursor to beginning of line &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; lines down&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Set Column&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}G&amp;lt;/code&amp;gt; moves cursor to column &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Set Position&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n};{m}H&amp;lt;/code&amp;gt; moves cursor to row &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; column &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Clear Screen&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}J&amp;lt;/code&amp;gt; clears the screen&lt;br /&gt;
** &amp;lt;code&amp;gt;n=0&amp;lt;/code&amp;gt; clears from cursor until end of screen,&lt;br /&gt;
** &amp;lt;code&amp;gt;n=1&amp;lt;/code&amp;gt; clears from cursor to beginning of screen&lt;br /&gt;
** &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; clears entire screen&lt;br /&gt;
* &#039;&#039;&#039;Clear Line&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}K&amp;lt;/code&amp;gt; clears the current line&lt;br /&gt;
** &amp;lt;code&amp;gt;n=0&amp;lt;/code&amp;gt; clears from cursor to end of line&lt;br /&gt;
** &amp;lt;code&amp;gt;n=1&amp;lt;/code&amp;gt; clears from cursor to start of line&lt;br /&gt;
** &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; clears entire line&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Save Position&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{s}&amp;lt;/code&amp;gt; saves the current cursor position&lt;br /&gt;
* &#039;&#039;&#039;Save Position&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{u}&amp;lt;/code&amp;gt; restores the cursor to the last saved position&lt;br /&gt;
&lt;br /&gt;
Ces infos ont été trouvées sur : https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html&lt;br /&gt;
&lt;br /&gt;
En Python ce qui est compliqué devient très simple (numpy par exemple permet de gérer des matrices de réels en deux lignes de code) mais ce qui était simple (écrite en inversion vidéo) devient très compliqué!&lt;br /&gt;
&lt;br /&gt;
== Avec vi (vim) ==&lt;br /&gt;
On peut vouloir ajouter des codes ANSI dans un fichier texte. Il faut cependant ajouter un ESC dans le flux de caractères. Pour cela on tape au clavier (en mode insertion):&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Ctrl&amp;gt;V + &amp;lt;Esc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans vi son on tape:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
^[[7mHello world!^[[0m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et bien le cat de ce fichier donnera:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ANSI Hello.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ANSI&amp;diff=2209</id>
		<title>ANSI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=ANSI&amp;diff=2209"/>
		<updated>2026-09-10T11:42:25Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Les codes d&#039;échappement ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Code&lt;br /&gt;
!Abbr&lt;br /&gt;
!Name&lt;br /&gt;
!Effect&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; A&lt;br /&gt;
|CUU&lt;br /&gt;
|Cursor Up&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Moves the cursor &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) cells in the given direction. If the cursor is already at the edge of the screen, this has no effect.&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; B&lt;br /&gt;
|CUD&lt;br /&gt;
|Cursor Down&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; C&lt;br /&gt;
|CUF&lt;br /&gt;
|Cursor Forward&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; D&lt;br /&gt;
|CUB&lt;br /&gt;
|Cursor Back&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; E&lt;br /&gt;
|CNL&lt;br /&gt;
|Cursor Next Line&lt;br /&gt;
|Moves cursor to beginning of the line &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines down. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; F&lt;br /&gt;
|CPL&lt;br /&gt;
|Cursor Previous Line&lt;br /&gt;
|Moves cursor to beginning of the line &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines up. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; G&lt;br /&gt;
|CHA&lt;br /&gt;
|Cursor Horizontal Absolute&lt;br /&gt;
|Moves the cursor to column &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;). (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; ; &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt; H&lt;br /&gt;
|CUP&lt;br /&gt;
|Cursor Position&lt;br /&gt;
|Moves the cursor to row &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt;, column &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt;. The values are 1-based, and default to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; (top left corner) if omitted. A sequence such as &amp;lt;code&amp;gt;CSI ;5H&amp;lt;/code&amp;gt; is a synonym for &amp;lt;code&amp;gt;CSI 1;5H&amp;lt;/code&amp;gt; as well as &amp;lt;code&amp;gt;CSI 17;H&amp;lt;/code&amp;gt; is the same as &amp;lt;code&amp;gt;CSI 17H&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;CSI 17;1H&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; J&lt;br /&gt;
|ED&lt;br /&gt;
|Erase in Display&lt;br /&gt;
|Clears part of the screen. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (or missing), clear from cursor to end of screen. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, clear from cursor to beginning of the screen. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS). If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;, clear entire screen and delete all lines saved in the scrollback buffer (this feature was added for xterm and is supported by other terminal applications).&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; K&lt;br /&gt;
|EL&lt;br /&gt;
|Erase in Line&lt;br /&gt;
|Erases part of the line. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; (or missing), clear from cursor to the end of the line. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, clear from cursor to beginning of the line. If &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;, clear entire line. Cursor position does not change.&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; S&lt;br /&gt;
|SU&lt;br /&gt;
|Scroll Up&lt;br /&gt;
|Scroll whole page up by &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines. New lines are added at the bottom. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; T&lt;br /&gt;
|SD&lt;br /&gt;
|Scroll Down&lt;br /&gt;
|Scroll whole page down by &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; (default &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) lines. New lines are added at the top. (not ANSI.SYS)&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; ; &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt; f&lt;br /&gt;
|HVP&lt;br /&gt;
|Horizontal Vertical Position&lt;br /&gt;
|Same as CUP, but counts as a format effector function (like CR or LF) rather than an editor function (like CUD or CNL). This can lead to different handling in certain terminal modes.&lt;br /&gt;
|-&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; m&lt;br /&gt;
|SGR&lt;br /&gt;
|Select Graphic Rendition&lt;br /&gt;
|Sets colors and style of the characters following this code&lt;br /&gt;
|-&lt;br /&gt;
|CSI 5i&lt;br /&gt;
|&lt;br /&gt;
|AUX Port On&lt;br /&gt;
|Enable aux serial port usually for local serial printer&lt;br /&gt;
|-&lt;br /&gt;
|CSI 4i&lt;br /&gt;
|&lt;br /&gt;
|AUX Port Off&lt;br /&gt;
|Disable aux serial port usually for local serial printer&lt;br /&gt;
|-&lt;br /&gt;
|CSI 6n&lt;br /&gt;
|DSR&lt;br /&gt;
|Device Status Report&lt;br /&gt;
|Reports the cursor position (CPR) by transmitting &amp;lt;code&amp;gt;ESC[n;mR&amp;lt;/code&amp;gt;, where &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; is the row and &amp;lt;var&amp;gt;m&amp;lt;/var&amp;gt; is the column.&lt;br /&gt;
|-&lt;br /&gt;
|CSI s&lt;br /&gt;
|SAV&lt;br /&gt;
|Save cursor&lt;br /&gt;
|Save the current cursor position (L;C). to be used with RCL&lt;br /&gt;
|-&lt;br /&gt;
|CSI u&lt;br /&gt;
|RCL&lt;br /&gt;
|Restore cursor&lt;br /&gt;
|Move back cursor to the position saved by SAV&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Les styles ==&lt;br /&gt;
Il s&#039;agit de détailler les codes :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|CSI &amp;lt;var&amp;gt;n&amp;lt;/var&amp;gt; m&lt;br /&gt;
|SGR&lt;br /&gt;
|Select Graphic Rendition&lt;br /&gt;
|Sets colors and style of the characters following this code&lt;br /&gt;
|}&lt;br /&gt;
Le tableau suivant donne les modes existants:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&#039;&#039;n&#039;&#039;&lt;br /&gt;
!Name&lt;br /&gt;
!Note&lt;br /&gt;
!Exemple *&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Reset &#039;&#039;or&#039;&#039; normal&lt;br /&gt;
|All attributes become turned off&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Bold or increased intensity&lt;br /&gt;
|As with faint, the color change is a PC (SCO / CGA) invention.&amp;lt;sup&amp;gt;[&#039;&#039;better source needed&#039;&#039;]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Faint, decreased intensity, &#039;&#039;or&#039;&#039; dim&lt;br /&gt;
|May be implemented as a light font weight like bold.&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Italic&lt;br /&gt;
|Not widely supported. Sometimes treated as inverse or blink.&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Underline&lt;br /&gt;
|Style extensions exist for Kitty, VTE, mintty and iTerm2.&lt;br /&gt;
|[[Fichier:ANSI4M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Slow blink&lt;br /&gt;
|Sets blinking to less than 150 times per minute&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Rapid blink&lt;br /&gt;
|MS-DOS ANSI.SYS, 150+ per minute; not widely supported&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|Reverse video &#039;&#039;or&#039;&#039; invert&lt;br /&gt;
|Swap foreground and background colors; inconsistent emulation&amp;lt;sup&amp;gt;[&#039;&#039;dubious – discuss&#039;&#039;]&amp;lt;/sup&amp;gt;&lt;br /&gt;
|[[Fichier:ANSI7m.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Conceal &#039;&#039;or&#039;&#039; hide&lt;br /&gt;
|Not widely supported.&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Crossed-out, &#039;&#039;or&#039;&#039; strike&lt;br /&gt;
|Characters legible but marked as if for deletion. Not supported in Terminal.app&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Primary (default) font&lt;br /&gt;
|&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|11–19&lt;br /&gt;
|Alternative font&lt;br /&gt;
|Select alternative font &#039;&#039;n&#039;&#039; − 10&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|Fraktur (Gothic)&lt;br /&gt;
|Rarely supported&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|Doubly underlined; or: not bold&lt;br /&gt;
|Double-underline per ECMA-48, but instead disables bold intensity on several terminals, including in the Linux kernel&#039;s console before version 4.17.&lt;br /&gt;
|[[Fichier:ANSI4M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|Normal intensity&lt;br /&gt;
|Neither bold nor faint; color changes where intensity is implemented as such.&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|Neither italic, nor blackletter&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|Not underlined&lt;br /&gt;
|Neither singly nor doubly underlined&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|Not blinking&lt;br /&gt;
|Turn blinking off&lt;br /&gt;
|[[Fichier:ANSO0M.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|Proportional spacing&lt;br /&gt;
|ITU T.61 and T.416, not known to be used on terminals&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|Not reversed&lt;br /&gt;
|&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|Reveal&lt;br /&gt;
|Not concealed&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; Les exemples sont pris sut putty/mobaxterm. N/A c&#039;est que, sur les terminaux caractère standards ce code est sans effet.&lt;br /&gt;
&lt;br /&gt;
== Les couleurs ==&lt;br /&gt;
&lt;br /&gt;
=== Couleurs de bases ===&lt;br /&gt;
On à 8 couleurs de bases + les mêmes couleurs en surintensité. (à la CGA pour ceux qui s&#039;en souviennent)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|30–37&lt;br /&gt;
|Set foreground color&lt;br /&gt;
|[[Fichier:ForogroundANSI.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|90-97&lt;br /&gt;
|Set bright foreground color&lt;br /&gt;
|[[Fichier:Ansi9x.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|40–47&lt;br /&gt;
|Set background color&lt;br /&gt;
|[[Fichier:ANSIbackground.png|sans_cadre]]&lt;br /&gt;
|-&lt;br /&gt;
|100-107&lt;br /&gt;
|Set bright background color&lt;br /&gt;
|[[Fichier:10xansi.png|sans_cadre]]&lt;br /&gt;
|}&lt;br /&gt;
On peut chainer les changements en une seule commande:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
printf &amp;quot;\n\e[31;47m Hello Wor\e[0m\n\n&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Passe en rouge sur fond blanc!&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ansii combine.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
=== Couleurs étendues ===&lt;br /&gt;
Là on passe aux écrans EGA, On agrandie la palette:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:PaletteANSI.png|sans_cadre|395x395px]]&lt;br /&gt;
&lt;br /&gt;
Le nombre indique la couleur de fond :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ESC[48:5:⟨n⟩m Select background color&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La couleur du texte est soit blanc soit noir pour qu&#039;on puise le voir. Pour changer la couleur du texte on peut, de la même façon, &amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ESC[38:5:⟨n⟩m Select foreground color&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Attention avec putty, cygwin et donc mobaxterm, par défaut, ces subtilités ne sont pas gérées. En revanche le terminal de base linux sur raspberry PI et MINGW64 sous Windows marche tres bien.&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
my $c=0;&lt;br /&gt;
for ($i=16; $i&amp;lt;=231; $i++) {&lt;br /&gt;
        printf &amp;quot;\033[48:5:%3sm  &amp;quot;, $i;&lt;br /&gt;
        $c++;&lt;br /&gt;
        if (($c % 36)==0){&lt;br /&gt;
                print (&amp;quot;\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Rainbowlut.png|sans_cadre|512x512px]]&lt;br /&gt;
&lt;br /&gt;
==== En 24 bits ====&lt;br /&gt;
On passe au VGA. 8 bits par composantes &#039;&#039;&#039;r&#039;&#039;&#039;, &#039;&#039;&#039;g&#039;&#039;&#039; et &#039;&#039;&#039;b&#039;&#039;&#039;. 8x3=24 bits. Ca fait quelque chose comme 17 million de couleurs différentes (16 777 216 exactement). &amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
for ($y=0; $y&amp;lt;=255; $y+=4){&lt;br /&gt;
        for ($x=0; $x&amp;lt;=255; $x+=2){&lt;br /&gt;
                printf (&amp;quot;\033[48;2;%s;%s;%sm &amp;quot;,$x,$y,255-$x);&lt;br /&gt;
        }&lt;br /&gt;
        print (&amp;quot;\033[0m\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne un joli:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:RGBANSI.png|sans_cadre|593x593px]]&lt;br /&gt;
&lt;br /&gt;
Comme quoi dans un terminal en mode caractère on peut faire de joli dessins!&lt;br /&gt;
&lt;br /&gt;
Ces couleurs en 24 bits sont, elles, correctement gérées par putty/mobaxterm.&lt;br /&gt;
&lt;br /&gt;
== Utiliser dans du code ==&lt;br /&gt;
L&#039;utilisation des codes ANSI dans un programme peut se faire en incluant simplement les codes d’échappement dans les chaines de caractères écrites à l&#039;écran.&lt;br /&gt;
&lt;br /&gt;
Ainsi pour écrire!&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ANSI example.png|sans_cadre|180x180px]] &lt;br /&gt;
&lt;br /&gt;
On utilisera la chaine :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Hello \033[7m world \033[0m !&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En shell ===&lt;br /&gt;
Attention en bash ou tout descendant du bourne shell un simple:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 echo &amp;quot;Hello \033[7m world \033[0m !&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Donnera ...&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Hello \033[7m world \033[0m !&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il faut préciser l&#039;option -e (enable escape characters) &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 echo -e &amp;quot;Hello \033[7m world \033[0m !&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ou (seulement en bash) la commande printf dont la syntaxes est celle du C.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
 printf &amp;quot;Hello \033[7m world \033[0m !\n&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En C/C++ ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
void main(int argc, char** argv){&lt;br /&gt;
    printf (&amp;quot;Hello \033[7m world \033[0m !\n&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== En perl ===&lt;br /&gt;
On peut faire simplement :&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
print &amp;quot;Hello \033[7m world \033[0m !\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:HelloWorld-ANSIPL.png|sans_cadre|147x147px]]&lt;br /&gt;
&lt;br /&gt;
Mais on peut utiliser la module Term::ANSIColor&lt;br /&gt;
&lt;br /&gt;
Il y a pas mal de façon de l&#039;utiliser. La plus simple :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;perl&amp;quot;&amp;gt;&lt;br /&gt;
use Term::ANSIColor qw(:constants);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;[&amp;quot;.GREEN.&amp;quot;PASS&amp;quot;.RESET.&amp;quot;]\n&amp;quot;;&lt;br /&gt;
print &amp;quot;[&amp;quot;.RED.&amp;quot;FAIL&amp;quot;.RESET.&amp;quot;]\n&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:PASSFAIL-ANSI-PL.png|sans_cadre|109x109px]]&lt;br /&gt;
&lt;br /&gt;
Les constantes utilisables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
CLEAR           RESET             BOLD            DARK&lt;br /&gt;
FAINT           ITALIC            UNDERLINE       UNDERSCORE&lt;br /&gt;
BLINK           REVERSE           CONCEALED&lt;br /&gt;
&lt;br /&gt;
BLACK           RED               GREEN           YELLOW&lt;br /&gt;
BLUE            MAGENTA           CYAN            WHITE&lt;br /&gt;
BRIGHT_BLACK    BRIGHT_RED        BRIGHT_GREEN    BRIGHT_YELLOW&lt;br /&gt;
BRIGHT_BLUE     BRIGHT_MAGENTA    BRIGHT_CYAN     BRIGHT_WHITE&lt;br /&gt;
&lt;br /&gt;
ON_BLACK        ON_RED            ON_GREEN        ON_YELLOW&lt;br /&gt;
ON_BLUE         ON_MAGENTA        ON_CYAN         ON_WHITE&lt;br /&gt;
ON_BRIGHT_BLACK ON_BRIGHT_RED     ON_BRIGHT_GREEN ON_BRIGHT_YELLOW&lt;br /&gt;
ON_BRIGHT_BLUE  ON_BRIGHT_MAGENTA ON_BRIGHT_CYAN  ON_BRIGHT_WHITE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On se limite aux couleurs mais le module permet beaucoup de choses. Une description en français est disponible sur [https://perldoc.perl.org/Term::ANSIColor la page du module] lui même.&lt;br /&gt;
&lt;br /&gt;
=== En java ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
class HelloWorld {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        System.out.println(&amp;quot;Hello \033[7m world \033[0m !&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Bon au retour à la ligne près (certaint l&#039;incluent par défaut d&#039;autres pas) c&#039;est toujours la même chaine. &lt;br /&gt;
&lt;br /&gt;
Un langage fait le malin pour pas faire comme les autres python&lt;br /&gt;
&lt;br /&gt;
=== En python ===&lt;br /&gt;
Un simple &amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
print (&amp;quot;Hello \033[7m world \033[0m !&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Afficahit un truc moche :Il interprètait (un peu) les codes ANSI pour les remplacer par... des espaces. Etrange.&lt;br /&gt;
Pour utiliser les codes ANSI il fallait utiliser une autre syntaxe et, de plus, seul les changements de couleurs (3x pour la couleur du texte et 4x pour le fond) sont acceptés.&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print (u&amp;quot;Hello \u001B[47m\u001B[30m World \u001B[0m !&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne &amp;quot;presque&amp;quot; ce que nous attendons.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Python-Hello-almost-perfect.png|sans_cadre|505x505px]]&lt;br /&gt;
&lt;br /&gt;
Le &amp;quot;World&amp;quot; est écrit en noir sur fond &#039;&#039;blanc sale&#039;&#039;. en Gris quoi.&lt;br /&gt;
&lt;br /&gt;
N&#039;essayez pas de remplacer \001B[47m par \001B[107m ça ne marches pas.&lt;br /&gt;
&lt;br /&gt;
Python a &amp;quot;sa syntaxe&amp;quot;:&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
print (u&amp;quot;\nHello \u001B[47;1m\u001B[30m World \u001B[0m !&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le ;1 après le \u001B[47 et le m dit que la couleur doit être &amp;quot;vive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un nombre limité de fonctions de gestion de curseur sont aussi gérées:&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Up&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}A&amp;lt;/code&amp;gt; moves cursor up by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Down&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}B&amp;lt;/code&amp;gt; moves cursor down by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Right&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}C&amp;lt;/code&amp;gt; moves cursor right by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Left&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}D&amp;lt;/code&amp;gt; moves cursor left by &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Next Line&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}E&amp;lt;/code&amp;gt; moves cursor to beginning of line &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; lines down&lt;br /&gt;
* &#039;&#039;&#039;Prev Line&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}F&amp;lt;/code&amp;gt; moves cursor to beginning of line &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; lines down&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Set Column&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}G&amp;lt;/code&amp;gt; moves cursor to column &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Set Position&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n};{m}H&amp;lt;/code&amp;gt; moves cursor to row &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; column &amp;lt;code&amp;gt;m&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Clear Screen&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}J&amp;lt;/code&amp;gt; clears the screen&lt;br /&gt;
** &amp;lt;code&amp;gt;n=0&amp;lt;/code&amp;gt; clears from cursor until end of screen,&lt;br /&gt;
** &amp;lt;code&amp;gt;n=1&amp;lt;/code&amp;gt; clears from cursor to beginning of screen&lt;br /&gt;
** &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; clears entire screen&lt;br /&gt;
* &#039;&#039;&#039;Clear Line&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{n}K&amp;lt;/code&amp;gt; clears the current line&lt;br /&gt;
** &amp;lt;code&amp;gt;n=0&amp;lt;/code&amp;gt; clears from cursor to end of line&lt;br /&gt;
** &amp;lt;code&amp;gt;n=1&amp;lt;/code&amp;gt; clears from cursor to start of line&lt;br /&gt;
** &amp;lt;code&amp;gt;n=2&amp;lt;/code&amp;gt; clears entire line&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Save Position&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{s}&amp;lt;/code&amp;gt; saves the current cursor position&lt;br /&gt;
* &#039;&#039;&#039;Save Position&#039;&#039;&#039;: &amp;lt;code&amp;gt;\u001b[{u}&amp;lt;/code&amp;gt; restores the cursor to the last saved position&lt;br /&gt;
&lt;br /&gt;
Ces infos ont été trouvées sur : https://www.lihaoyi.com/post/BuildyourownCommandLinewithANSIescapecodes.html&lt;br /&gt;
&lt;br /&gt;
En Python ce qui est compliqué devient très simple (numpy par exemple permet de gérer des matrices de réels en deux lignes de code) mais ce qui était simple (écrite en inversion vidéo) devient très compliqué!&lt;br /&gt;
&lt;br /&gt;
== Avec vi (vim) ==&lt;br /&gt;
On peut vouloir ajouter des codes ANSI dans un fichier texte. Il faut cependant ajouter un ESC dans le flux de caractères. Pour cela on tape au clavier (en mode insertion):&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;Ctrl&amp;gt;V + &amp;lt;Esc&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans vi son on tape:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
^[[7mHello world!^[[0m&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;et bien le cat de ce fichier donnera:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ANSI Hello.png|sans_cadre]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ANSI_Hello.png&amp;diff=2208</id>
		<title>Fichier:ANSI Hello.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:ANSI_Hello.png&amp;diff=2208"/>
		<updated>2026-09-10T11:41:57Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello World reverse&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Camera_PI&amp;diff=2207</id>
		<title>Camera PI</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Camera_PI&amp;diff=2207"/>
		<updated>2026-09-04T22:25:58Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Page créée avec « == Installation == L&amp;#039;utilisation d&amp;#039;une caméra est assez simple quand elle est branchée sur le port CSI.  On la branche et tout est installé par défaut.  On peut le vérifier avec&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; dmesg | grep -i csi &amp;lt;/syntaxhighlight&amp;gt;Moi j&amp;#039;ai les lignes:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt; /soc/csi@7e801000: Fixed dependency cycle(s) with /soc/i2c0mux/i2c@1/ov5647@36 &amp;lt;/syntaxhighlight&amp;gt;J&amp;#039;ai bien une caméra sur le port CSI qui utilise le capteur ov5647 su... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Installation ==&lt;br /&gt;
L&#039;utilisation d&#039;une caméra est assez simple quand elle est branchée sur le port CSI.&lt;br /&gt;
&lt;br /&gt;
On la branche et tout est installé par défaut.&lt;br /&gt;
&lt;br /&gt;
On peut le vérifier avec&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dmesg | grep -i csi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Moi j&#039;ai les lignes:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/soc/csi@7e801000: Fixed dependency cycle(s) with&lt;br /&gt;
/soc/i2c0mux/i2c@1/ov5647@36&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;J&#039;ai bien une caméra sur le port CSI qui utilise le capteur ov5647 super connu.&lt;br /&gt;
&lt;br /&gt;
== Utilisation ==&lt;br /&gt;
Pour l&#039;utiliser c&#039;est très simple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpicam-hello -t 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Les logs sur la console sont bavardes mais on a bien une fenêtre à l&#039;écran qui affiche ce que voit la caméra.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;CTRL&amp;gt; + C pour sortir!&lt;br /&gt;
&lt;br /&gt;
Avec &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpicam-still -o test.jpg&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca ouvre l&#039;écran et on a 10 sec pour prendre la pause!&lt;br /&gt;
&lt;br /&gt;
=== Utilisation a travers une connexion ssh ===&lt;br /&gt;
Si on veut que ce soit l&#039;écran du PI qui affiche la prise de vue :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export DISPLAY=:0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Sera nécessaire avant utilisation.&lt;br /&gt;
&lt;br /&gt;
Ne tentez pas de vous connecter en ssh -X il n&#039;arrivera pas à mètre en place DRI3 pour faire le Transfer (e tout ca moi sur WSL).&lt;br /&gt;
&lt;br /&gt;
=== Streamer la video ===&lt;br /&gt;
On lance un streaming par :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
rpicam-vid --nopreview --listen -t 0 --inline -o tcp://0.0.0.0:8888&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et ailleurs dans le LAN on regarde avec VLC et l&#039;URL : tcp/h264://192.168.8.132:8888&lt;br /&gt;
&lt;br /&gt;
Ca marche. C&#039;est super lent, un délai de 4 sec entre la captation et la restitution, mais ca marche.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=%C3%89cran_Adafruit_2.8_pouces_TFT&amp;diff=2206</id>
		<title>Écran Adafruit 2.8 pouces TFT</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=%C3%89cran_Adafruit_2.8_pouces_TFT&amp;diff=2206"/>
		<updated>2026-09-04T21:16:37Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Activation du tactile résistif */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installation du PiTFT capacitif Adafruit sur Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
Ce module PiTFT 2.8&amp;quot; d’Adafruit combine :&lt;br /&gt;
* Un écran TFT ILI9341 (320×240)&lt;br /&gt;
* Un contrôleur tactile capacitif FT5x06 ou FT6206&lt;br /&gt;
* Une interface GPIO directe pour Raspberry Pi B+, Pi 2, Pi 3&lt;br /&gt;
&lt;br /&gt;
== Préparation du système ==&lt;br /&gt;
* OS recommandé : Raspberry Pi OS Lite ou Desktop&lt;br /&gt;
* Mise à jour :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt full-upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activation de l&#039;écran ==&lt;br /&gt;
Que se soit un écran résistif ou capacitif il faut choisir son orientation.&lt;br /&gt;
&lt;br /&gt;
Il y a 4 orientations possibles: 0, 90, 180 et 270.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Adafruit 2.8&#039;&#039; orientation 0.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Adafruit 2.8&#039;&#039; 90.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;exemple 0 et 90 (RJ45 et USB a droite). L&#039;un en mode graphique l&#039;autre en mode texte.&lt;br /&gt;
&lt;br /&gt;
Ma position favorite (si j&#039;ose dire) c&#039;est 270 :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ecran Adafruit 270.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On peut le poser sur son seul côté dénué de connecteurs.&lt;br /&gt;
&lt;br /&gt;
=== Activation du tactile résistif ===&lt;br /&gt;
Ajouter dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=pitft28-resistive,rotate=90,speed=64000000,fps=30,drm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Pour utiliser l&#039;écran résistif il faudra le caligrer:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
DISPLAY=:0 xinput_calibrator&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activation du tactile capacitif ===&lt;br /&gt;
Ajouter dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;dtoverlay=pitft28-capacitive,rotate=90,speed=64000000,fps=30,drm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si besoin de GPIO personnalisés :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;dtoverlay=pitft28-capacitive,touch-reset=5,touch-int=17&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruse HDMI pour éviter la perte de framebuffer ==&lt;br /&gt;
Sans écran HDMI, le Pi peut désactiver &amp;lt;code&amp;gt;/dev/fb0&amp;lt;/code&amp;gt;. Pour forcer sa création :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
hdmi_force_hotplug=1&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
hdmi_mode=87&lt;br /&gt;
hdmi_cvt=320 240 60 1 0 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tests post-installation ==&lt;br /&gt;
* Vérifier le périphérique tactile :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/bus/input/devices&lt;br /&gt;
dmesg | grep ft5&lt;br /&gt;
sudo evtest /dev/input/eventX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Vérifier l’affichage :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cat /dev/urandom &amp;gt; /dev/fb0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dépannage ==&lt;br /&gt;
=== GPIO bloqués ===&lt;br /&gt;
Utiliser &amp;lt;code&amp;gt;gpiod&amp;lt;/code&amp;gt; pour tester :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gpioset gpiochip0 5=1&lt;br /&gt;
gpioget gpiochip0 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FT5x06 actif mais dalle muette ===&lt;br /&gt;
* Vérifier la nappe tactile&lt;br /&gt;
* Tester le registre 0x02 via I²C :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo i2cget -y 1 0x38 0x02&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Utilisation des 4 boutons physiques =  &lt;br /&gt;
== Objectif == &lt;br /&gt;
Utiliser les 4 boutons physiques à gauche de l’écran Adafruit PiTFT comme des touches clavier virtuelles : `1`, `2`, `3`, `4`.  &lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi avec écran Adafruit PiTFT 2.8&amp;quot; capacitif&lt;br /&gt;
* Boutons connectés aux GPIO : 17, 22, 23, 27  &lt;br /&gt;
== Méthode == &lt;br /&gt;
Ajouter les lignes suivantes dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=gpio-key,gpio=17,keycode=2,label=&amp;quot;BTN1&amp;quot;   # KEY_1&lt;br /&gt;
dtoverlay=gpio-key,gpio=22,keycode=3,label=&amp;quot;BTN2&amp;quot;   # KEY_2&lt;br /&gt;
dtoverlay=gpio-key,gpio=23,keycode=4,label=&amp;quot;BTN3&amp;quot;   # KEY_3&lt;br /&gt;
dtoverlay=gpio-key,gpio=27,keycode=5,label=&amp;quot;BTN4&amp;quot;   # KEY_4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication Chaque ligne:&lt;br /&gt;
* Configure le GPIO en entrée avec pull-up&lt;br /&gt;
* Associe un &amp;lt;code&amp;gt;keycode&amp;lt;/code&amp;gt; Linux standard&lt;br /&gt;
* Crée un périphérique &amp;lt;code&amp;gt;/dev/input/eventX&amp;lt;/code&amp;gt; géré par le noyau  &lt;br /&gt;
== Codes clavier utilisés == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Touche simulée !! Code Linux !! GPIO utilisé&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 (KEY_1) || GPIO 17&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3 (KEY_2) || GPIO 22&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 4 (KEY_3) || GPIO 23&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 5 (KEY_4) || GPIO 27&lt;br /&gt;
|}&lt;br /&gt;
== Test == &lt;br /&gt;
Lancer :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo evtest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Appuyer sur les boutons : chaque pression génère un événement &amp;lt;code&amp;gt;EV_KEY&amp;lt;/code&amp;gt; correspondant à la touche simulée.&lt;br /&gt;
&lt;br /&gt;
== Utilisation dans un script == &lt;br /&gt;
Exemple en shell :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
read -n1 key&lt;br /&gt;
case &amp;quot;$key&amp;quot; in&lt;br /&gt;
  1) echo &amp;quot;Bouton 1 pressé&amp;quot; ;;&lt;br /&gt;
  2) echo &amp;quot;Bouton 2 pressé&amp;quot; ;;&lt;br /&gt;
  3) echo &amp;quot;Bouton 3 pressé&amp;quot; ;;&lt;br /&gt;
  4) echo &amp;quot;Bouton 4 pressé&amp;quot; ;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cohabitation entre ecran LCD Adafruit et HDMI =&lt;br /&gt;
Une [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|page spécifique]] concerne ce point.&lt;br /&gt;
&lt;br /&gt;
= Le rétro-éclairage =&lt;br /&gt;
Après pas mal de bidouillage (même mon ami copilot y a perdu son latin) j&#039;ai trouvé le mécanisme. Je ne suis pas du tout certain que ca marche sur tous les modèles pareil!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai un écran Adafruit 2.8 pouces capacitif qui date de presque dix ans qui tourne sur un Raspberry PI2.&lt;br /&gt;
&lt;br /&gt;
Dans ce cas c&#039;est GPIO 18 qui gère le rétro-éclairage.&lt;br /&gt;
&lt;br /&gt;
Les GPIO sont gérés par un gpiochip512. &lt;br /&gt;
&lt;br /&gt;
Les sudo sont saoulant avec les redirections je conseille de faire les tests en tant que root. &amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/label&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne pinctrl-bcm2835 qui est le gestionaire de GPIO du SoC bcm2835 (c&#039;est un PI2 donc ca devrait être un bcm2836 mais c&#039;est le contrôleur de GPIO qui est resté basé sur la version précédente)&lt;br /&gt;
&lt;br /&gt;
On regarde ensuite les caractéristiques :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/base&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/ngpio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne respectivement 512 et 54.&lt;br /&gt;
&lt;br /&gt;
Donc, le gestionnaire de GPIO possède 54 lignes numérotées à partir de 512. La plage est alors de 512 à 566.&lt;br /&gt;
&lt;br /&gt;
Notre GPIO 18 est dont repéré 512+18 = 530&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo 530 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
echo out &amp;gt; /sys/class/gpio/gpio530/direction&lt;br /&gt;
echo 1 &amp;gt; /sys/class/gpio/gpio530/value   # Allumé&lt;br /&gt;
echo 0 &amp;gt; /sys/class/gpio/gpio530/value   # Éteint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=%C3%89cran_Adafruit_2.8_pouces_TFT&amp;diff=2205</id>
		<title>Écran Adafruit 2.8 pouces TFT</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=%C3%89cran_Adafruit_2.8_pouces_TFT&amp;diff=2205"/>
		<updated>2026-09-04T20:26:18Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Activation de l&amp;#039;écran */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installation du PiTFT capacitif Adafruit sur Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
Ce module PiTFT 2.8&amp;quot; d’Adafruit combine :&lt;br /&gt;
* Un écran TFT ILI9341 (320×240)&lt;br /&gt;
* Un contrôleur tactile capacitif FT5x06 ou FT6206&lt;br /&gt;
* Une interface GPIO directe pour Raspberry Pi B+, Pi 2, Pi 3&lt;br /&gt;
&lt;br /&gt;
== Préparation du système ==&lt;br /&gt;
* OS recommandé : Raspberry Pi OS Lite ou Desktop&lt;br /&gt;
* Mise à jour :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt full-upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activation de l&#039;écran ==&lt;br /&gt;
Que se soit un écran résistif ou capacitif il faut choisir son orientation.&lt;br /&gt;
&lt;br /&gt;
Il y a 4 orientations possibles: 0, 90, 180 et 270.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Adafruit 2.8&#039;&#039; orientation 0.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Adafruit 2.8&#039;&#039; 90.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;exemple 0 et 90 (RJ45 et USB a droite). L&#039;un en mode graphique l&#039;autre en mode texte.&lt;br /&gt;
&lt;br /&gt;
Ma position favorite (si j&#039;ose dire) c&#039;est 270 :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Ecran Adafruit 270.jpg|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
On peut le poser sur son seul côté dénué de connecteurs.&lt;br /&gt;
&lt;br /&gt;
=== Activation du tactile résistif ===&lt;br /&gt;
Ajouter dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=pitft28-resistive,rotate=90,speed=64000000,fps=30,drm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activation du tactile capacitif ===&lt;br /&gt;
Ajouter dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;dtoverlay=pitft28-capacitive,rotate=90,speed=64000000,fps=30,drm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si besoin de GPIO personnalisés :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;dtoverlay=pitft28-capacitive,touch-reset=5,touch-int=17&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruse HDMI pour éviter la perte de framebuffer ==&lt;br /&gt;
Sans écran HDMI, le Pi peut désactiver &amp;lt;code&amp;gt;/dev/fb0&amp;lt;/code&amp;gt;. Pour forcer sa création :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
hdmi_force_hotplug=1&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
hdmi_mode=87&lt;br /&gt;
hdmi_cvt=320 240 60 1 0 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tests post-installation ==&lt;br /&gt;
* Vérifier le périphérique tactile :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/bus/input/devices&lt;br /&gt;
dmesg | grep ft5&lt;br /&gt;
sudo evtest /dev/input/eventX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Vérifier l’affichage :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cat /dev/urandom &amp;gt; /dev/fb0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dépannage ==&lt;br /&gt;
=== GPIO bloqués ===&lt;br /&gt;
Utiliser &amp;lt;code&amp;gt;gpiod&amp;lt;/code&amp;gt; pour tester :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gpioset gpiochip0 5=1&lt;br /&gt;
gpioget gpiochip0 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FT5x06 actif mais dalle muette ===&lt;br /&gt;
* Vérifier la nappe tactile&lt;br /&gt;
* Tester le registre 0x02 via I²C :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo i2cget -y 1 0x38 0x02&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Utilisation des 4 boutons physiques =  &lt;br /&gt;
== Objectif == &lt;br /&gt;
Utiliser les 4 boutons physiques à gauche de l’écran Adafruit PiTFT comme des touches clavier virtuelles : `1`, `2`, `3`, `4`.  &lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi avec écran Adafruit PiTFT 2.8&amp;quot; capacitif&lt;br /&gt;
* Boutons connectés aux GPIO : 17, 22, 23, 27  &lt;br /&gt;
== Méthode == &lt;br /&gt;
Ajouter les lignes suivantes dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=gpio-key,gpio=17,keycode=2,label=&amp;quot;BTN1&amp;quot;   # KEY_1&lt;br /&gt;
dtoverlay=gpio-key,gpio=22,keycode=3,label=&amp;quot;BTN2&amp;quot;   # KEY_2&lt;br /&gt;
dtoverlay=gpio-key,gpio=23,keycode=4,label=&amp;quot;BTN3&amp;quot;   # KEY_3&lt;br /&gt;
dtoverlay=gpio-key,gpio=27,keycode=5,label=&amp;quot;BTN4&amp;quot;   # KEY_4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication Chaque ligne:&lt;br /&gt;
* Configure le GPIO en entrée avec pull-up&lt;br /&gt;
* Associe un &amp;lt;code&amp;gt;keycode&amp;lt;/code&amp;gt; Linux standard&lt;br /&gt;
* Crée un périphérique &amp;lt;code&amp;gt;/dev/input/eventX&amp;lt;/code&amp;gt; géré par le noyau  &lt;br /&gt;
== Codes clavier utilisés == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Touche simulée !! Code Linux !! GPIO utilisé&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 (KEY_1) || GPIO 17&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3 (KEY_2) || GPIO 22&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 4 (KEY_3) || GPIO 23&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 5 (KEY_4) || GPIO 27&lt;br /&gt;
|}&lt;br /&gt;
== Test == &lt;br /&gt;
Lancer :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo evtest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Appuyer sur les boutons : chaque pression génère un événement &amp;lt;code&amp;gt;EV_KEY&amp;lt;/code&amp;gt; correspondant à la touche simulée.&lt;br /&gt;
&lt;br /&gt;
== Utilisation dans un script == &lt;br /&gt;
Exemple en shell :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
read -n1 key&lt;br /&gt;
case &amp;quot;$key&amp;quot; in&lt;br /&gt;
  1) echo &amp;quot;Bouton 1 pressé&amp;quot; ;;&lt;br /&gt;
  2) echo &amp;quot;Bouton 2 pressé&amp;quot; ;;&lt;br /&gt;
  3) echo &amp;quot;Bouton 3 pressé&amp;quot; ;;&lt;br /&gt;
  4) echo &amp;quot;Bouton 4 pressé&amp;quot; ;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cohabitation entre ecran LCD Adafruit et HDMI =&lt;br /&gt;
Une [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|page spécifique]] concerne ce point.&lt;br /&gt;
&lt;br /&gt;
= Le rétro-éclairage =&lt;br /&gt;
Après pas mal de bidouillage (même mon ami copilot y a perdu son latin) j&#039;ai trouvé le mécanisme. Je ne suis pas du tout certain que ca marche sur tous les modèles pareil!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai un écran Adafruit 2.8 pouces capacitif qui date de presque dix ans qui tourne sur un Raspberry PI2.&lt;br /&gt;
&lt;br /&gt;
Dans ce cas c&#039;est GPIO 18 qui gère le rétro-éclairage.&lt;br /&gt;
&lt;br /&gt;
Les GPIO sont gérés par un gpiochip512. &lt;br /&gt;
&lt;br /&gt;
Les sudo sont saoulant avec les redirections je conseille de faire les tests en tant que root. &amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/label&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne pinctrl-bcm2835 qui est le gestionaire de GPIO du SoC bcm2835 (c&#039;est un PI2 donc ca devrait être un bcm2836 mais c&#039;est le contrôleur de GPIO qui est resté basé sur la version précédente)&lt;br /&gt;
&lt;br /&gt;
On regarde ensuite les caractéristiques :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/base&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/ngpio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne respectivement 512 et 54.&lt;br /&gt;
&lt;br /&gt;
Donc, le gestionnaire de GPIO possède 54 lignes numérotées à partir de 512. La plage est alors de 512 à 566.&lt;br /&gt;
&lt;br /&gt;
Notre GPIO 18 est dont repéré 512+18 = 530&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo 530 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
echo out &amp;gt; /sys/class/gpio/gpio530/direction&lt;br /&gt;
echo 1 &amp;gt; /sys/class/gpio/gpio530/value   # Allumé&lt;br /&gt;
echo 0 &amp;gt; /sys/class/gpio/gpio530/value   # Éteint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Ecran_Adafruit_270.jpg&amp;diff=2204</id>
		<title>Fichier:Ecran Adafruit 270.jpg</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Ecran_Adafruit_270.jpg&amp;diff=2204"/>
		<updated>2026-09-04T20:25:22Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A 270 degres&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Adafruit_2.8%27%27_90.jpg&amp;diff=2203</id>
		<title>Fichier:Adafruit 2.8&#039;&#039; 90.jpg</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Adafruit_2.8%27%27_90.jpg&amp;diff=2203"/>
		<updated>2026-09-04T20:20:06Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ecran a 90 degré mode texte&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Adafruit_90.jpg&amp;diff=2202</id>
		<title>Fichier:Adafruit 90.jpg</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Adafruit_90.jpg&amp;diff=2202"/>
		<updated>2026-09-04T20:18:55Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;a 90 degres en mode texte&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Adafruit_2.8%27%27_orientation_0.jpg&amp;diff=2201</id>
		<title>Fichier:Adafruit 2.8&#039;&#039; orientation 0.jpg</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Adafruit_2.8%27%27_orientation_0.jpg&amp;diff=2201"/>
		<updated>2026-09-04T20:14:41Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ecran Adafruit 2,8 pouces configuré avec l&#039;orientation par défaut.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=%C3%89cran_Adafruit_2.8_pouces_TFT&amp;diff=2200</id>
		<title>Écran Adafruit 2.8 pouces TFT</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=%C3%89cran_Adafruit_2.8_pouces_TFT&amp;diff=2200"/>
		<updated>2026-09-04T19:53:55Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Activation du tactile capacitif */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installation du PiTFT capacitif Adafruit sur Raspberry Pi =&lt;br /&gt;
&lt;br /&gt;
== Présentation ==&lt;br /&gt;
Ce module PiTFT 2.8&amp;quot; d’Adafruit combine :&lt;br /&gt;
* Un écran TFT ILI9341 (320×240)&lt;br /&gt;
* Un contrôleur tactile capacitif FT5x06 ou FT6206&lt;br /&gt;
* Une interface GPIO directe pour Raspberry Pi B+, Pi 2, Pi 3&lt;br /&gt;
&lt;br /&gt;
== Préparation du système ==&lt;br /&gt;
* OS recommandé : Raspberry Pi OS Lite ou Desktop&lt;br /&gt;
* Mise à jour :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt full-upgrade&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Activation de l&#039;écran ==&lt;br /&gt;
&lt;br /&gt;
=== Activation du tactile résistif ===&lt;br /&gt;
Ajouter dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=pitft28-resistive,rotate=90,speed=64000000,fps=30,drm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Activation du tactile capacitif ===&lt;br /&gt;
Ajouter dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;dtoverlay=pitft28-capacitive,rotate=90,speed=64000000,fps=30,drm&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si besoin de GPIO personnalisés :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;dtoverlay=pitft28-capacitive,touch-reset=5,touch-int=17&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ruse HDMI pour éviter la perte de framebuffer ==&lt;br /&gt;
Sans écran HDMI, le Pi peut désactiver &amp;lt;code&amp;gt;/dev/fb0&amp;lt;/code&amp;gt;. Pour forcer sa création :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
hdmi_force_hotplug=1&lt;br /&gt;
hdmi_group=2&lt;br /&gt;
hdmi_mode=87&lt;br /&gt;
hdmi_cvt=320 240 60 1 0 0 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tests post-installation ==&lt;br /&gt;
* Vérifier le périphérique tactile :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /proc/bus/input/devices&lt;br /&gt;
dmesg | grep ft5&lt;br /&gt;
sudo evtest /dev/input/eventX&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Vérifier l’affichage :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo cat /dev/urandom &amp;gt; /dev/fb0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reboot ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo reboot&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dépannage ==&lt;br /&gt;
=== GPIO bloqués ===&lt;br /&gt;
Utiliser &amp;lt;code&amp;gt;gpiod&amp;lt;/code&amp;gt; pour tester :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gpioset gpiochip0 5=1&lt;br /&gt;
gpioget gpiochip0 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FT5x06 actif mais dalle muette ===&lt;br /&gt;
* Vérifier la nappe tactile&lt;br /&gt;
* Tester le registre 0x02 via I²C :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo i2cget -y 1 0x38 0x02&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Utilisation des 4 boutons physiques =  &lt;br /&gt;
== Objectif == &lt;br /&gt;
Utiliser les 4 boutons physiques à gauche de l’écran Adafruit PiTFT comme des touches clavier virtuelles : `1`, `2`, `3`, `4`.  &lt;br /&gt;
== Matériel ==&lt;br /&gt;
* Raspberry Pi avec écran Adafruit PiTFT 2.8&amp;quot; capacitif&lt;br /&gt;
* Boutons connectés aux GPIO : 17, 22, 23, 27  &lt;br /&gt;
== Méthode == &lt;br /&gt;
Ajouter les lignes suivantes dans &amp;lt;code&amp;gt;/boot/firmware/config.txt&amp;lt;/code&amp;gt; :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
dtoverlay=gpio-key,gpio=17,keycode=2,label=&amp;quot;BTN1&amp;quot;   # KEY_1&lt;br /&gt;
dtoverlay=gpio-key,gpio=22,keycode=3,label=&amp;quot;BTN2&amp;quot;   # KEY_2&lt;br /&gt;
dtoverlay=gpio-key,gpio=23,keycode=4,label=&amp;quot;BTN3&amp;quot;   # KEY_3&lt;br /&gt;
dtoverlay=gpio-key,gpio=27,keycode=5,label=&amp;quot;BTN4&amp;quot;   # KEY_4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Explication Chaque ligne:&lt;br /&gt;
* Configure le GPIO en entrée avec pull-up&lt;br /&gt;
* Associe un &amp;lt;code&amp;gt;keycode&amp;lt;/code&amp;gt; Linux standard&lt;br /&gt;
* Crée un périphérique &amp;lt;code&amp;gt;/dev/input/eventX&amp;lt;/code&amp;gt; géré par le noyau  &lt;br /&gt;
== Codes clavier utilisés == &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Touche simulée !! Code Linux !! GPIO utilisé&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 (KEY_1) || GPIO 17&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 3 (KEY_2) || GPIO 22&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 4 (KEY_3) || GPIO 23&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 5 (KEY_4) || GPIO 27&lt;br /&gt;
|}&lt;br /&gt;
== Test == &lt;br /&gt;
Lancer :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo evtest&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;  &lt;br /&gt;
&lt;br /&gt;
Appuyer sur les boutons : chaque pression génère un événement &amp;lt;code&amp;gt;EV_KEY&amp;lt;/code&amp;gt; correspondant à la touche simulée.&lt;br /&gt;
&lt;br /&gt;
== Utilisation dans un script == &lt;br /&gt;
Exemple en shell :&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
read -n1 key&lt;br /&gt;
case &amp;quot;$key&amp;quot; in&lt;br /&gt;
  1) echo &amp;quot;Bouton 1 pressé&amp;quot; ;;&lt;br /&gt;
  2) echo &amp;quot;Bouton 2 pressé&amp;quot; ;;&lt;br /&gt;
  3) echo &amp;quot;Bouton 3 pressé&amp;quot; ;;&lt;br /&gt;
  4) echo &amp;quot;Bouton 4 pressé&amp;quot; ;;&lt;br /&gt;
esac&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cohabitation entre ecran LCD Adafruit et HDMI =&lt;br /&gt;
Une [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|page spécifique]] concerne ce point.&lt;br /&gt;
&lt;br /&gt;
= Le rétro-éclairage =&lt;br /&gt;
Après pas mal de bidouillage (même mon ami copilot y a perdu son latin) j&#039;ai trouvé le mécanisme. Je ne suis pas du tout certain que ca marche sur tous les modèles pareil!&lt;br /&gt;
&lt;br /&gt;
Moi j&#039;ai un écran Adafruit 2.8 pouces capacitif qui date de presque dix ans qui tourne sur un Raspberry PI2.&lt;br /&gt;
&lt;br /&gt;
Dans ce cas c&#039;est GPIO 18 qui gère le rétro-éclairage.&lt;br /&gt;
&lt;br /&gt;
Les GPIO sont gérés par un gpiochip512. &lt;br /&gt;
&lt;br /&gt;
Les sudo sont saoulant avec les redirections je conseille de faire les tests en tant que root. &amp;lt;code&amp;gt;sudo su -&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/label&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne pinctrl-bcm2835 qui est le gestionaire de GPIO du SoC bcm2835 (c&#039;est un PI2 donc ca devrait être un bcm2836 mais c&#039;est le contrôleur de GPIO qui est resté basé sur la version précédente)&lt;br /&gt;
&lt;br /&gt;
On regarde ensuite les caractéristiques :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/base&lt;br /&gt;
cat /sys/class/gpio/gpiochip512/ngpio&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Nous donne respectivement 512 et 54.&lt;br /&gt;
&lt;br /&gt;
Donc, le gestionnaire de GPIO possède 54 lignes numérotées à partir de 512. La plage est alors de 512 à 566.&lt;br /&gt;
&lt;br /&gt;
Notre GPIO 18 est dont repéré 512+18 = 530&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo 530 &amp;gt; /sys/class/gpio/export&lt;br /&gt;
echo out &amp;gt; /sys/class/gpio/gpio530/direction&lt;br /&gt;
echo 1 &amp;gt; /sys/class/gpio/gpio530/value   # Allumé&lt;br /&gt;
echo 0 &amp;gt; /sys/class/gpio/gpio530/value   # Éteint&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Etc/hosts_debian&amp;diff=2199</id>
		<title>Etc/hosts debian</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Etc/hosts_debian&amp;diff=2199"/>
		<updated>2026-08-24T21:50:59Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Le problème ==&lt;br /&gt;
A partie de la version 11 (Buster) les distributions Debian (et les Ubuntu et autres qui en découlent) gèrent le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; d&#039;une façon différente d&#039;avant. &lt;br /&gt;
&lt;br /&gt;
Un truc qui marchait depuis plus de 50 ans :&lt;br /&gt;
&lt;br /&gt;
Ajouter un nouveau hôte distant avec un :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On croit que ca marche mais au prochain reboot... la modification est perdue.&lt;br /&gt;
&lt;br /&gt;
Pourquoi changer un truc truc qui marche depuis 50 ans... je ne sais pas. Ils ont surement de très très bonnes raisons mais ils nous saoulent! &lt;br /&gt;
&lt;br /&gt;
Bon si on regarde le contenu du fichier:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Your system has configured &#039;manage_etc_hosts&#039; as True.&lt;br /&gt;
# As a result, if you wish for changes to this file to persist&lt;br /&gt;
# then you will need to either&lt;br /&gt;
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
# b.) change or remove the value of &#039;manage_etc_hosts&#039; in&lt;br /&gt;
#     /etc/cloud/cloud.cfg or cloud-config from user-data&lt;br /&gt;
#&lt;br /&gt;
127.0.1.1 hote.domaine.fr hote&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1 localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&amp;lt;/syntaxhighlight&amp;gt;C&amp;lt;nowiki&amp;gt;&#039;est clairement expliqué suffit de lire le commentaire... ce que je n&#039;avais pas fait sur mon Raspberry PI avec un micro écran de 5&#039;&#039;&amp;lt;/nowiki&amp;gt;. Ok ma faute mais quand même.&lt;br /&gt;
&lt;br /&gt;
Il y a donc deux solutions:&lt;br /&gt;
&lt;br /&gt;
== Les solutions ==&lt;br /&gt;
&lt;br /&gt;
=== Le fichier hosts.debian.tmpl ===&lt;br /&gt;
Je trouve que c&#039;est la solution la plus simple. &lt;br /&gt;
&lt;br /&gt;
Avant on faisait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ils se sont fait plaisir sur le PATH!&lt;br /&gt;
&lt;br /&gt;
Le template ressemble à ça:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;## template:jinja&lt;br /&gt;
{#&lt;br /&gt;
This file (/etc/cloud/templates/hosts.debian.tmpl) is only utilized&lt;br /&gt;
if enabled in cloud-config.  Specifically, in order to enable it&lt;br /&gt;
you need to add the following to config:&lt;br /&gt;
   manage_etc_hosts: True&lt;br /&gt;
-#}&lt;br /&gt;
# Your system has configured &#039;manage_etc_hosts&#039; as True.&lt;br /&gt;
# As a result, if you wish for changes to this file to persist&lt;br /&gt;
# then you will need to either&lt;br /&gt;
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
# b.) change or remove the value of &#039;manage_etc_hosts&#039; in&lt;br /&gt;
#     /etc/cloud/cloud.cfg or cloud-config from user-data&lt;br /&gt;
#&lt;br /&gt;
{# The value &#039;{{hostname}}&#039; will be replaced with the local-hostname -#}&lt;br /&gt;
127.0.1.1 {{fqdn}} {{hostname}}&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1 localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&amp;lt;/syntaxhighlight&amp;gt;Si j&#039;ai bien tout compris c&#039;est pour que, après le DHCP le nom de domaine peut changer donc &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{fqdn}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; a une origine externe. De même si on change le hostname de la machine pas besoin de changer le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bon pourquoi pas....&lt;br /&gt;
&lt;br /&gt;
Il faut donc ajouter ses &amp;quot;hôtes&amp;quot; dans le fichier. Moi je fais ca après le &amp;lt;code&amp;gt;127.0.0.1 localhost&amp;lt;/code&amp;gt; mais finalement on fait ça ou on veut.&lt;br /&gt;
&lt;br /&gt;
=== Le fichier /etc/cloud/cloud.cfg ===&lt;br /&gt;
&lt;br /&gt;
Dans ce fichier il y a une section (il est long je donne pas tout):&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;cloud_init_modules:&lt;br /&gt;
  - seed_random&lt;br /&gt;
  - bootcmd&lt;br /&gt;
  - write_files&lt;br /&gt;
  - disk_setup&lt;br /&gt;
  - mounts&lt;br /&gt;
  - set_hostname&lt;br /&gt;
  - update_hostname&lt;br /&gt;
  - update_etc_hosts&lt;br /&gt;
  - ca_certs&lt;br /&gt;
  - rsyslog&lt;br /&gt;
  - users_groups&lt;br /&gt;
  - ssh&lt;br /&gt;
  - set_passwords&amp;lt;/syntaxhighlight&amp;gt;Il suffit ce commenter le   &amp;lt;code&amp;gt;- update_etc_hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Personnellement je préfère la solution avec le template. Tant qu&#039;à changer quelque chose utilisons la nouvelle methode.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Etc/hosts_debian&amp;diff=2198</id>
		<title>Etc/hosts debian</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Etc/hosts_debian&amp;diff=2198"/>
		<updated>2026-08-24T21:49:49Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A partie de la version 11 (Buster) les distributions Debian (et les Ubuntu et autres qui en découlent) gèrent le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; d&#039;une façon différente d&#039;avant. &lt;br /&gt;
&lt;br /&gt;
Un truc qui marchait depuis plus de 50 ans :&lt;br /&gt;
&lt;br /&gt;
Ajouter un nouveau hôte distant avec un :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On croit que ca marche mais au prochain reboot... la modification est perdue.&lt;br /&gt;
&lt;br /&gt;
Pourquoi changer un truc truc qui marche depuis 50 ans... je ne sais pas. Ils ont surement de très très bonnes raisons mais ils nous saoulent! &lt;br /&gt;
&lt;br /&gt;
Bon si on regarde le contenu du fichier:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Your system has configured &#039;manage_etc_hosts&#039; as True.&lt;br /&gt;
# As a result, if you wish for changes to this file to persist&lt;br /&gt;
# then you will need to either&lt;br /&gt;
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
# b.) change or remove the value of &#039;manage_etc_hosts&#039; in&lt;br /&gt;
#     /etc/cloud/cloud.cfg or cloud-config from user-data&lt;br /&gt;
#&lt;br /&gt;
127.0.1.1 hote.domaine.fr hote&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1 localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&amp;lt;/syntaxhighlight&amp;gt;C&amp;lt;nowiki&amp;gt;&#039;est clairement expliqué suffit de lire le commentaire... ce que je n&#039;avais pas fait sur mon Raspberry PI avec un micro écran de 5&#039;&#039;&amp;lt;/nowiki&amp;gt;. Ok ma faute mais quand même.&lt;br /&gt;
&lt;br /&gt;
Il y a donc deux solutions:&lt;br /&gt;
&lt;br /&gt;
== Le fichier hosts.debian.tmpl ==&lt;br /&gt;
Je trouve que c&#039;est la solution la plus simple. &lt;br /&gt;
&lt;br /&gt;
Avant on faisait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ils se sont fait plaisir sur le PATH!&lt;br /&gt;
&lt;br /&gt;
Le template ressemble à ça:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;## template:jinja&lt;br /&gt;
{#&lt;br /&gt;
This file (/etc/cloud/templates/hosts.debian.tmpl) is only utilized&lt;br /&gt;
if enabled in cloud-config.  Specifically, in order to enable it&lt;br /&gt;
you need to add the following to config:&lt;br /&gt;
   manage_etc_hosts: True&lt;br /&gt;
-#}&lt;br /&gt;
# Your system has configured &#039;manage_etc_hosts&#039; as True.&lt;br /&gt;
# As a result, if you wish for changes to this file to persist&lt;br /&gt;
# then you will need to either&lt;br /&gt;
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
# b.) change or remove the value of &#039;manage_etc_hosts&#039; in&lt;br /&gt;
#     /etc/cloud/cloud.cfg or cloud-config from user-data&lt;br /&gt;
#&lt;br /&gt;
{# The value &#039;{{hostname}}&#039; will be replaced with the local-hostname -#}&lt;br /&gt;
127.0.1.1 {{fqdn}} {{hostname}}&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1 localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&amp;lt;/syntaxhighlight&amp;gt;Si j&#039;ai bien tout compris c&#039;est pour que, après le DHCP le nom de domaine peut changer donc &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{fqdn}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; a une origine externe. De même si on change le hostname de la machine pas besoin de changer le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bon pourquoi pas....&lt;br /&gt;
&lt;br /&gt;
Il faut donc ajouter ses &amp;quot;hôtes&amp;quot; dans le fichier. Moi je fais ca après le &amp;lt;code&amp;gt;127.0.0.1 localhost&amp;lt;/code&amp;gt; mais finalement on fait ça ou on veut.&lt;br /&gt;
&lt;br /&gt;
== Solution /etc/cloud/cloud.cfg ==&lt;br /&gt;
Dans ce fichier il y a une section (il est long je donne pas tout):&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;cloud_init_modules:&lt;br /&gt;
  - seed_random&lt;br /&gt;
  - bootcmd&lt;br /&gt;
  - write_files&lt;br /&gt;
  - disk_setup&lt;br /&gt;
  - mounts&lt;br /&gt;
  - set_hostname&lt;br /&gt;
  - update_hostname&lt;br /&gt;
  - update_etc_hosts&lt;br /&gt;
  - ca_certs&lt;br /&gt;
  - rsyslog&lt;br /&gt;
  - users_groups&lt;br /&gt;
  - ssh&lt;br /&gt;
  - set_passwords&amp;lt;/syntaxhighlight&amp;gt;Il suffit ce commenter le   &amp;lt;code&amp;gt;- update_etc_hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Personnellement je préfère la solution avec le template. Tant qu&#039;à changer quelque chose utilisons la nouvelle methode.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Etc/hosts_debian&amp;diff=2197</id>
		<title>Etc/hosts debian</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Etc/hosts_debian&amp;diff=2197"/>
		<updated>2026-08-24T21:48:58Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Page créée avec « A partie de la version 11 (Buster) les distributions Debian (et les Ubuntu et autres qui en découlent) gèrent le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; d&amp;#039;une façon différente d&amp;#039;avant.   Un truc qui marchait depuis plus de 50 ans :  Ajouter un nouveau hôte distant avec un :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt; sudo vi /etc/hosts &amp;lt;/syntaxhighlight&amp;gt;On croit que ca marche mais au prochain reboot... la modification est perdue.  Pourquoi changer un truc truc qui marche depuis 50 ans...... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A partie de la version 11 (Buster) les distributions Debian (et les Ubuntu et autres qui en découlent) gèrent le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt; d&#039;une façon différente d&#039;avant. &lt;br /&gt;
&lt;br /&gt;
Un truc qui marchait depuis plus de 50 ans :&lt;br /&gt;
&lt;br /&gt;
Ajouter un nouveau hôte distant avec un :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On croit que ca marche mais au prochain reboot... la modification est perdue.&lt;br /&gt;
&lt;br /&gt;
Pourquoi changer un truc truc qui marche depuis 50 ans... je ne sais pas. Ils ont surement de très très bonnes raisons mais ils nous saoulent! &lt;br /&gt;
&lt;br /&gt;
Bon si on regarde le contenu du fichier:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;# Your system has configured &#039;manage_etc_hosts&#039; as True.&lt;br /&gt;
# As a result, if you wish for changes to this file to persist&lt;br /&gt;
# then you will need to either&lt;br /&gt;
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
# b.) change or remove the value of &#039;manage_etc_hosts&#039; in&lt;br /&gt;
#     /etc/cloud/cloud.cfg or cloud-config from user-data&lt;br /&gt;
#&lt;br /&gt;
127.0.1.1 labo labo&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1 localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&amp;lt;/syntaxhighlight&amp;gt;C&amp;lt;nowiki&amp;gt;&#039;est clairement expliqué suffit de lire le commentaire... ce que je n&#039;avais pas fait sur mon Raspberry PI avec un micro écran de 5&#039;&#039;&amp;lt;/nowiki&amp;gt;. Ok ma faute mais quand même.&lt;br /&gt;
&lt;br /&gt;
Il y a donc deux solutions:&lt;br /&gt;
&lt;br /&gt;
== Le fichier hosts.debian.tmpl ==&lt;br /&gt;
Je trouve que c&#039;est la solution la plus simple. &lt;br /&gt;
&lt;br /&gt;
Avant on faisait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/hosts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Maintenant on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo vi /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ils se sont fait plaisir sur le PATH!&lt;br /&gt;
&lt;br /&gt;
Le template ressemble à ça:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;## template:jinja&lt;br /&gt;
{#&lt;br /&gt;
This file (/etc/cloud/templates/hosts.debian.tmpl) is only utilized&lt;br /&gt;
if enabled in cloud-config.  Specifically, in order to enable it&lt;br /&gt;
you need to add the following to config:&lt;br /&gt;
   manage_etc_hosts: True&lt;br /&gt;
-#}&lt;br /&gt;
# Your system has configured &#039;manage_etc_hosts&#039; as True.&lt;br /&gt;
# As a result, if you wish for changes to this file to persist&lt;br /&gt;
# then you will need to either&lt;br /&gt;
# a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl&lt;br /&gt;
# b.) change or remove the value of &#039;manage_etc_hosts&#039; in&lt;br /&gt;
#     /etc/cloud/cloud.cfg or cloud-config from user-data&lt;br /&gt;
#&lt;br /&gt;
{# The value &#039;{{hostname}}&#039; will be replaced with the local-hostname -#}&lt;br /&gt;
127.0.1.1 {{fqdn}} {{hostname}}&lt;br /&gt;
127.0.0.1 localhost&lt;br /&gt;
&lt;br /&gt;
# The following lines are desirable for IPv6 capable hosts&lt;br /&gt;
::1 localhost ip6-localhost ip6-loopback&lt;br /&gt;
ff02::1 ip6-allnodes&lt;br /&gt;
ff02::2 ip6-allrouters&amp;lt;/syntaxhighlight&amp;gt;Si j&#039;ai bien tout compris c&#039;est pour que, après le DHCP le nom de domaine peut changer donc &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{fqdn}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; a une origine externe. De même si on change le hostname de la machine pas besoin de changer le &amp;lt;code&amp;gt;/etc/hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Bon pourquoi pas....&lt;br /&gt;
&lt;br /&gt;
Il faut donc ajouter ses &amp;quot;hôtes&amp;quot; dans le fichier. Moi je fais ca après le &amp;lt;code&amp;gt;127.0.0.1 localhost&amp;lt;/code&amp;gt; mais finalement on fait ça ou on veut.&lt;br /&gt;
&lt;br /&gt;
== Solution /etc/cloud/cloud.cfg ==&lt;br /&gt;
Dans ce fichier il y a une section (il est long je donne pas tout):&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;cloud_init_modules:&lt;br /&gt;
  - seed_random&lt;br /&gt;
  - bootcmd&lt;br /&gt;
  - write_files&lt;br /&gt;
  - disk_setup&lt;br /&gt;
  - mounts&lt;br /&gt;
  - set_hostname&lt;br /&gt;
  - update_hostname&lt;br /&gt;
  - update_etc_hosts&lt;br /&gt;
  - ca_certs&lt;br /&gt;
  - rsyslog&lt;br /&gt;
  - users_groups&lt;br /&gt;
  - ssh&lt;br /&gt;
  - set_passwords&amp;lt;/syntaxhighlight&amp;gt;Il suffit ce commenter le   &amp;lt;code&amp;gt;- update_etc_hosts&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Personnellement je préfère la solution avec le template. Tant qu&#039;à changer quelque chose utilisons la nouvelle methode.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2196</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Accueil&amp;diff=2196"/>
		<updated>2026-08-24T21:27:52Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bienvenu sur ma nouvelle &amp;quot;Knowledge base&amp;quot; [[Spécial:Version|Version]] autohébergée.&lt;br /&gt;
&lt;br /&gt;
Une page temporaire pour la mise à jour de ce wiki-ci: [[MAJ WIKI]] (a faire)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Développement &lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Logo C++.png|sans_cadre|61x61px]] C/C++ : C&#039;est[[Fichier:Le.png|sans_cadre|44x44px]] langage de programmation.&lt;br /&gt;
|Les [[sockets C]]&lt;br /&gt;
Gérer l&#039;écran &amp;quot;à la vi&amp;quot; avec [[Curses en C|curses]]&lt;br /&gt;
&lt;br /&gt;
Gérer le [[Temps à la milliseconde en C|temps à la milliseconde]].&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Perl logo.png|sans_cadre|48x48px]]Perl : Le meilleur langage de script. &lt;br /&gt;
|Quelques [[Quelques modules Perl|modules Perl]] utiles.&lt;br /&gt;
Petits [[hacks en perl]]. &lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |[[Fichier:Python Logo.png|alt=Python|sans_cadre|74x74px]]Python : Pas mon préféré mais il est tellement utilisé!&lt;br /&gt;
|Syntaxe [[Les bases de Python|de base]],&lt;br /&gt;
Gestion des [[Exceptions en Python|exceptions]].&lt;br /&gt;
&lt;br /&gt;
Python et ses [[Environnements virtuels Python|environnements virtuels]].&lt;br /&gt;
&lt;br /&gt;
Les [[Modules et outils de développement Python|modules et les outils de développement]]. &lt;br /&gt;
&lt;br /&gt;
[[Gestion des documents PDF en Python|Gestion des documents PDF]]. &lt;br /&gt;
&lt;br /&gt;
[[Petits exemples de code Python|Petits exemples de code]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outils&lt;br /&gt;
|[[Fichier:Git logo.png|sans_cadre|67x67px]]Git&lt;br /&gt;
|[[GIT Utilisation simple|Utilisation simple]] &lt;br /&gt;
[[GIT-HUB]]&lt;br /&gt;
|-&lt;br /&gt;
|Shell&lt;br /&gt;
|sh/bash&lt;br /&gt;
[[Fichier:Bash.png|sans_cadre]]&lt;br /&gt;
|Syntaxe du [[If en bash|if]], [[For in bash|for]] et [[While in bash|while]].&lt;br /&gt;
Les [[Redirections bash|redirections]].&lt;br /&gt;
&lt;br /&gt;
Les [[Alias en bash|alias]].&lt;br /&gt;
&lt;br /&gt;
Traiter des [[CSV bash|fichiers csv]]&lt;br /&gt;
Traitement de phrases [[Encodage d&#039;objets complexes#Usage en shell (commande jq)|JSON avec jq]]&lt;br /&gt;
&lt;br /&gt;
[[Bash random|Générer de hasard]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;8&amp;quot; |Système&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Global&lt;br /&gt;
|[[Encodage]] de caractères&lt;br /&gt;
|Le [[code morse]], le [[code baudot]], les codes [[ASCII]], les séquences [[ANSI]] le code [[Code Gray|Gray]] et un OVNI, le code [[Extended Binary Coded Decimal Interchange Code|EBCEDIC]]&lt;br /&gt;
les code [[UNICODE]].&lt;br /&gt;
|-&lt;br /&gt;
|Encodage d&#039;objets&lt;br /&gt;
|Les [[entiers]]&lt;br /&gt;
le [[temps]]&lt;br /&gt;
&lt;br /&gt;
Les [[nombres flottants]]&lt;br /&gt;
&lt;br /&gt;
[[Encodage d&#039;objets complexes|Les objets complexes]]&lt;br /&gt;
&lt;br /&gt;
Encodage de binaire en [[base64]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Linux [[Fichier:Linux-logo.png|sans_cadre|93x93px]]&lt;br /&gt;
|Général&lt;br /&gt;
|[[Généralités Linux|Généralités]] quel que soient les distributions de linux (ou UNIX).&lt;br /&gt;
Lancer un [[deamon avec systemd]].&lt;br /&gt;
&lt;br /&gt;
Configurer une client [[Connexion SSH|ssh]].&lt;br /&gt;
&lt;br /&gt;
Installer [[web-ssh]]&lt;br /&gt;
|-&lt;br /&gt;
|Debian (Ubuntu...)&lt;br /&gt;
[[Fichier:Debian.png|sans_cadre|80x80px]]&lt;br /&gt;
|[[Gestion des services Debian/Ubuntu|Gestion des services]]&lt;br /&gt;
&lt;br /&gt;
[[Nettoyage APT]]&lt;br /&gt;
&lt;br /&gt;
Informations sur une [[Info distribution DEBIAN|distribution]]&lt;br /&gt;
&lt;br /&gt;
[[Etc/hosts debian|Gérer /etc/hosts]] sur les versions récentes (&amp;gt;11 &amp;quot;buster&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Windows Subsystem for Linux logo.png|gauche|sans_cadre|64x64px]]WSL &lt;br /&gt;
|Utiliser et personnaliser [[WSL /etc/hosts|/etc/hosts]]&lt;br /&gt;
[[Relancer WSL]]&lt;br /&gt;
&lt;br /&gt;
[[Monter un disque externe dans wsl]]&lt;br /&gt;
&lt;br /&gt;
[[Utiliser un port USB dans WSL]]&lt;br /&gt;
|-&lt;br /&gt;
|Windows [[Fichier:Microsoft Windows Logo.png|sans_cadre|96x96px]]&lt;br /&gt;
|..., 10, 11&lt;br /&gt;
|[[Wireshark]] &amp;lt;sub&amp;gt;(images manquantes)&amp;lt;/sub&amp;gt;&lt;br /&gt;
CYGWIN&lt;br /&gt;
&lt;br /&gt;
[[MINGW32]]&lt;br /&gt;
&lt;br /&gt;
[[Scoop]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Open WRT]]&lt;br /&gt;
[[Fichier:Open WRT LOGO.png|sans_cadre|135x135px]]&lt;br /&gt;
|Global&lt;br /&gt;
[[GL Inet]]&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Gl-inet-router.png|sans_cadre|147x147px]]&lt;br /&gt;
|[[GL Inet Reset|Reset]] sortie d&#039;usine.&lt;br /&gt;
Réglage du serveur [[Open WRT DHCP|DHCP]]&lt;br /&gt;
&lt;br /&gt;
Ajouter un [[OpenWRTpackages|package]].&lt;br /&gt;
&lt;br /&gt;
[[Open WRT Commandes de base pour le réseau|Commandes de base pour le réseau]].&lt;br /&gt;
&lt;br /&gt;
[[tcpdump]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le ssh depuis le côté WAN.]]&lt;br /&gt;
&lt;br /&gt;
Comment [[configurer un routeur pour activer le WEB depuis le coté WAN]]&lt;br /&gt;
&lt;br /&gt;
Gérer des ampoules [[Wiz et OpenWRT|Phillips Wiz]].&lt;br /&gt;
&lt;br /&gt;
Installer un outil de [[Test de la bande passante Open WRT|test de la bande passante]] de la patte &amp;quot;wan&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Auto hébergement&lt;br /&gt;
[[Fichier:AnarchySymbol.png|sans_cadre|107x107px]]&lt;br /&gt;
|[[Fichier:Raspberry.png|sans_cadre|40x40px]]  [[Raspberry PI]]&lt;br /&gt;
|L&#039;auto hébergement est assez facile à réaliser chez sois. Une solution est d&#039;utiliser un ou plusieurs raspberry PI.&lt;br /&gt;
[[Auto Hebergement|La base]] explique l&#039;installation de base d&#039;un PI comme serveur solitaire.&lt;br /&gt;
&lt;br /&gt;
En revanche on donne ci-dessous un exemple d&#039;architecture complète avec un cluster de 5 Raspberry PI :&lt;br /&gt;
&lt;br /&gt;
# [[Infrastructure basée PI|Architecture]]&lt;br /&gt;
# &amp;lt;code&amp;gt;front-router&amp;lt;/code&amp;gt;[[Le routeur en tête réseau PI|Le routeur en tête]] &lt;br /&gt;
# &amp;lt;code&amp;gt;main-host&amp;lt;/code&amp;gt; un [[Node-red dans le LAN|serveur IoT avec note-red]]. &lt;br /&gt;
#&amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;[[PI GitLab|Un serveur Git]]&lt;br /&gt;
#&amp;lt;code&amp;gt;database&amp;lt;/code&amp;gt;[[PI MariaDB|Un serveur de base de données]]&lt;br /&gt;
#&amp;lt;code&amp;gt;mediawiki&amp;lt;/code&amp;gt; [[PI MediaWiki|Un serveur mediawiki]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |APIs&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Géolocalisation et cartographie&lt;br /&gt;
|IP API&lt;br /&gt;
|[[Abstract API]] Donne une localisation a partir d&#039;une IP&lt;br /&gt;
[[IPinfo]] Une autre bibliotheque de localisation d&#039;IP&lt;br /&gt;
|-&lt;br /&gt;
|Ephemérides&lt;br /&gt;
|[[Sunset and sunrise times API]] va nous dire quand le soleil se lève quand il se couche, la lune…&lt;br /&gt;
|-&lt;br /&gt;
|Trafic Aérien&lt;br /&gt;
|[[FlightRadar24]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;6&amp;quot; |Logiciels&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Middleware&lt;br /&gt;
|Bases de données relationelles&lt;br /&gt;
|Le langage [[SQL]] &lt;br /&gt;
Les &amp;quot;minimales&amp;quot;: [[MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Les encore plus minimales: [[SQLite]] &lt;br /&gt;
&lt;br /&gt;
Les maximales: [[Oracle]], [[PostgeSQL]]&lt;br /&gt;
|-&lt;br /&gt;
|Bases de données NoSQL&lt;br /&gt;
|[[mongodb]]&lt;br /&gt;
|-&lt;br /&gt;
|Messages&lt;br /&gt;
|[[MQTT]]&lt;br /&gt;
|-&lt;br /&gt;
|Serveur applicatifs/web&lt;br /&gt;
|[[Apache]]&lt;br /&gt;
&lt;br /&gt;
[[Weblogic]]&lt;br /&gt;
&lt;br /&gt;
[[RPi-NodeRed|Nodered]] (exemple avec Raspberry PI) et certaines [[Applications node-red|applications]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Bureautique&lt;br /&gt;
[[Fichier:Bureautique.png|sans_cadre|166x166px]]&lt;br /&gt;
|Excel&lt;br /&gt;
|[[Gestion des dates sous Excel|Gestion des dates]]&amp;lt;nowiki/&amp;gt; &lt;br /&gt;
[[EXCEL Gestion des chaines de caractères|Gest]][[EXCEL Gestion des chaines de caractères|io]][[EXCEL Gestion des chaines de caractères|n d]][[EXCEL Gestion des chaines de caractères|es cha]][[EXCEL Gestion des chaines de caractères|în]][[EXCEL Gestion des chaines de caractères|es de c]][[EXCEL Gestion des chaines de caractères|ar]][[EXCEL Gestion des chaines de caractères|actère]][[EXCEL Gestion des chaines de caractères|s]]&lt;br /&gt;
&lt;br /&gt;
[[Identifier si la clé d&#039;une ligne est présente dans un autre tableau]]. &lt;br /&gt;
|-&lt;br /&gt;
|Outlook&lt;br /&gt;
|[[Outlook - Gestion des archives|Gestion des archives]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;4&amp;quot; |Sécurite&lt;br /&gt;
|Chiffrement / déchiffrement&lt;br /&gt;
[[Fichier:Aliceetbob.png|sans_cadre]]&lt;br /&gt;
|OpenSSL&lt;br /&gt;
|[[Les bases de Open SSL|La base]]&lt;br /&gt;
[[OpenSSL et AES]] (symetrique)&lt;br /&gt;
&lt;br /&gt;
[[OpenSSL_et_RSA]] (asymetrique)&lt;br /&gt;
&lt;br /&gt;
Avec [[SMIME et Certificats x509|x509 et SMIME]] on marie les deux&lt;br /&gt;
&lt;br /&gt;
Comment [[OpenSSL extraire un certificat|extraire un certificat]] d&#039;un serveur en production.&lt;br /&gt;
&lt;br /&gt;
PGP et [[GPG]] (chiffrer de documents)&lt;br /&gt;
&lt;br /&gt;
Générer un [[mode de passe sécurisé]]&lt;br /&gt;
&lt;br /&gt;
Les autres commandes [[openssl]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Certificats&lt;br /&gt;
[[Fichier:Certif.png|sans_cadre|60x60px]]&lt;br /&gt;
|Generalités&lt;br /&gt;
|[[Les certificats X.509|Un certificat c&#039;est quoi?]]&lt;br /&gt;
|-&lt;br /&gt;
|PKI&lt;br /&gt;
|[[PKI familiale|Faire une PKI &amp;quot;familiale&amp;quot;]]&lt;br /&gt;
|-&lt;br /&gt;
|https&lt;br /&gt;
|[[Certificats Serveur https|Certificats Serveur]]&lt;br /&gt;
[[Certificats Client https|Certificats Client]]&lt;br /&gt;
&lt;br /&gt;
[[Let&#039;s encrypt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Embarqué&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Microcontroleurs&lt;br /&gt;
[[Fichier:Esp32.png|sans_cadre|93x93px]]&lt;br /&gt;
|[[Fichier:Arduino Logo.png|sans_cadre|40x40px]][[Arduino]]&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|[[ESP8266]]&lt;br /&gt;
|Le module [[SON/OFF Smart Switch|Smart Switch]] de SONOFF&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Espessif logo.png|gauche|sans_cadre|40x40px]][[ESP32]]&lt;br /&gt;
|Environnement de dev [[ESP-IDF]], Utiliser [[mkspiffs]].&lt;br /&gt;
La carte &amp;quot;breakout&amp;quot; [[ESP32_DEVKITV1]]&lt;br /&gt;
La carte &amp;quot;AZ delivery&amp;quot; [[ESP32_DEVKITV2]]&lt;br /&gt;
&lt;br /&gt;
Faire des [[ESP32 Requetês HTTPs|requetês HTTPs]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Firmware Update|Firmware Update]]&lt;br /&gt;
&lt;br /&gt;
[[ESP32 Matrice de led|Exemple d&#039;utilisation de matrice de LED]] (circuit MAX 72xx)&lt;br /&gt;
&lt;br /&gt;
Programmation module [[ESP32C3 avec écran spotear]].&lt;br /&gt;
|-&lt;br /&gt;
!Fusion&lt;br /&gt;
|Dev ESP 32 sur Raspberry PI&lt;br /&gt;
|Ici un article qui touche aux deux sujets. [[Poste de DEV ESP32 sur PI|Comment programmes les  microcontrôleurs ESP32 à partir d&#039;un raspberry PI]].&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |SBC (single board computers)&lt;br /&gt;
[[Fichier:Sbc.png|sans_cadre|147x147px]]&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Logo PI.png|sans_cadre|36x36px]][[Raspberry PI]]&lt;br /&gt;
|[[Les modèles de Raspberry PI]]&lt;br /&gt;
La configuration réseau [[DHCP ou IP fixe]]&lt;br /&gt;
&lt;br /&gt;
Le truc différentiant pour un raspberry PI : le [[GPIO-PI|GPIO]]. &lt;br /&gt;
&lt;br /&gt;
Ecran [[Écran Adafruit 2.8 pouces TFT|Adafruit 2.8&#039;]]&#039;et [[Cohabitation écran Adafruit PiTFT 2.8&amp;quot; et HDMI|Cohabitation des écrans]]. &lt;br /&gt;
&lt;br /&gt;
Utiliser le [[frame-buffer]] &lt;br /&gt;
&lt;br /&gt;
[[Wayland X11 et ssh]].&lt;br /&gt;
&lt;br /&gt;
[[Demarrer PI4 en USB|Gérer un PI4 dont le lecteur de carte SD est HS]].&lt;br /&gt;
&lt;br /&gt;
Utiliser la [[camera PI]]&lt;br /&gt;
&lt;br /&gt;
Créer un [[Nouveau Menu Raspberry PI|nouveau sous menu dans le &amp;quot;main menu&amp;quot;]] du bureau.&lt;br /&gt;
|-&lt;br /&gt;
|Installer :&lt;br /&gt;
[[RPi-NodeRed|NodeRed]], [[Mosquitto]], [[MariaDB sur Raspberry PI|MariaDB]]&lt;br /&gt;
&lt;br /&gt;
Le service graphique de gestion des mises à jour [[PackageKit]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Bpi.png|sans_cadre|48x48px]]Banana PI&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; |Objets connectés&lt;br /&gt;
|[[Fichier:PHILLIPS HUE LOGO.png|sans_cadre|87x87px]]&lt;br /&gt;
|Description [[PHILLIPS HUE|API]] de base&lt;br /&gt;
Le site de Phillips : https://developers.meethue.com/develop/hue-api-v2/getting-started/&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:X-sense logo.png|sans_cadre|52x52px]]x-sense&lt;br /&gt;
|[[X-sense|Description générale]]&lt;br /&gt;
Utilisation avec le module [[python-xsense]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Wiz.png|sans_cadre|103x103px]]Phillips Wiz&lt;br /&gt;
|Les limites de ces [[Securite PHILLIPS WIZ|ampoules au niveau sécurité]].&lt;br /&gt;
Utilisation avec un [[Wiz et OpenWRT|routeur OpenWrt]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;10&amp;quot; |Electronique&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Compsantselec.png|sans_cadre|91x91px]]Composants&lt;br /&gt;
|Composants actifs&lt;br /&gt;
|[[Le transistor bipolaire]]&lt;br /&gt;
|-&lt;br /&gt;
|Les batteries&lt;br /&gt;
|Généralités sur [[Les batteries]]&lt;br /&gt;
|-&lt;br /&gt;
|Circuits&lt;br /&gt;
|Filtres&lt;br /&gt;
|Filtre de rejection : https://poujouly.net/2015/10/25/filtre-notch-50hz/ (oui un lien externe pour le moment)&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;5&amp;quot; |Le labo&lt;br /&gt;
|Le protocoles&lt;br /&gt;
|[[UART/RS323]]&lt;br /&gt;
&lt;br /&gt;
[[SCPI uart]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Les outils de mesures connectables&lt;br /&gt;
[[Fichier:Laboelec.png|sans_cadre|207x207px]]&lt;br /&gt;
|[[Multimètre]] modèle : &lt;br /&gt;
&lt;br /&gt;
* [[Multicomp PRO MP730027]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Générateur de fonctions arbitraire]] modèles : &lt;br /&gt;
&lt;br /&gt;
* [[GwINSTEK AFG-2012]]&lt;br /&gt;
* [[Multicomp MP75511]]&lt;br /&gt;
* [[FeelTech FY6600]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Osciloscope]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Alimantation]]&lt;br /&gt;
&lt;br /&gt;
[[Alimentation USB C]]&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |Conception&lt;br /&gt;
|[[Fichier:Autodesk Eagle logo.png|sans_cadre|123x123px]]&lt;br /&gt;
|Logiciel de conception de circuits et de modélisation de circuit imprimés.&lt;br /&gt;
[[EAGLE - Plans de masse|Plans de masse]]&lt;br /&gt;
&lt;br /&gt;
[[Les unités dans EAGLE]]&lt;br /&gt;
|-&lt;br /&gt;
|LTspice&lt;br /&gt;
|Logiciel de simulation électronique&lt;br /&gt;
[[LTspice fichier de simulation|Utiliser un signal numérisé en entré d&#039;une simulation]].&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;7&amp;quot; |CAO FAO&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; |[[Fichier:Mecanique.png|sans_cadre|78x78px]]Mécanique&lt;br /&gt;
|Visserie&lt;br /&gt;
|[[Fichier:Logo-iso.png|sans_cadre|105x105px]][[Dimensions visserie ISO]]&lt;br /&gt;
|-&lt;br /&gt;
|Usinage&lt;br /&gt;
|Dimensions des [[fraises en unités Imériales/US]]&lt;br /&gt;
|-&lt;br /&gt;
|Fabrication additive&lt;br /&gt;
|Imprimantes 3D FDM&lt;br /&gt;
|[[Fichier:Ultimaker logo.png|sans_cadre|37x37px]] [[Ultimaker 2]]&lt;br /&gt;
|-&lt;br /&gt;
|CNC&lt;br /&gt;
|Fraiseuses&lt;br /&gt;
|La base… la [[CNC 3018|3018]].&lt;br /&gt;
Faire des perçages avec un [[CNC Percages gcode|programme python]].&lt;br /&gt;
&lt;br /&gt;
Graver des [[PCB avec CNC|PCB]]&lt;br /&gt;
&lt;br /&gt;
[[Changer la broche CNC3018|Changer la broche]]&lt;br /&gt;
|-&lt;br /&gt;
|Découpeuse (Vinyle ou autre)&lt;br /&gt;
|Silhouette&lt;br /&gt;
|[[SILHOUETTE Paramètres de base|Paramètres de base]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciels de CAO&lt;br /&gt;
|[[Fichier:Freecad logo.png|alt=FREE CAD|sans_cadre|47x47px]]FreeCad&lt;br /&gt;
|[[FreeCad]]&lt;br /&gt;
|-&lt;br /&gt;
|Outillage&lt;br /&gt;
|Metrologie&lt;br /&gt;
|[[Comparateur Numérique]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;5&amp;quot; |Projets complets&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Création/Configuration de serveur&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; |Exemple chez GANDI&lt;br /&gt;
|[[Serveur mediawiki basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur nodered basé docker]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur Owncloud]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Serveur DNS GANDI|Serveur DNS]]&lt;br /&gt;
|-&lt;br /&gt;
|Objets connectés&lt;br /&gt;
|[[Fichier:Esp32.png|sans_cadre|29x29px]]ESP32&lt;br /&gt;
|[[ESP32 Horloge à LED|Une Horloge à LED]]&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;3&amp;quot; |Photos&lt;br /&gt;
|Matériel&lt;br /&gt;
|D90&lt;br /&gt;
[[Fichier:D90.png|sans_cadre|58x58px]]&lt;br /&gt;
|[[Connectique D90|Connectique]]&lt;br /&gt;
|-&lt;br /&gt;
|[[Fichier:Theorie.png|sans_cadre|67x67px]]Théorie&lt;br /&gt;
|&lt;br /&gt;
|Les [[bases en optique pour la photo]]&lt;br /&gt;
|-&lt;br /&gt;
|Logiciel&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Petits_exemples_de_code_Python&amp;diff=2195</id>
		<title>Petits exemples de code Python</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Petits_exemples_de_code_Python&amp;diff=2195"/>
		<updated>2026-08-24T09:32:08Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Script pour générer automatiquement des mots de passes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script pour générer automatiquement des mots de passes ==&lt;br /&gt;
Dans la section [[Bash random|bash traitant des la génération du hasard]] j&#039;avais mentionné des outils que auraient pu servir a générer des mots de passes.&lt;br /&gt;
&lt;br /&gt;
Ici on fait un programme python pour faire ça mais en gérant les contraintes des systèmes modernes.&lt;br /&gt;
&lt;br /&gt;
Les règles :&lt;br /&gt;
&lt;br /&gt;
      • contenir au moins un caractère de la classe majuscule (A-Z)&lt;br /&gt;
&lt;br /&gt;
     • contenir au moins un caractère de la classe minuscule (a-z)&lt;br /&gt;
&lt;br /&gt;
     • contenir au moins un caractère de la classe chiffre (0-9)&lt;br /&gt;
&lt;br /&gt;
     • contenir au moins un caractère de la classe caractère spécial parmi ! , . / ? &amp;amp; _ * + = - &amp;gt; &amp;lt; @ ^ # £ µ §&lt;br /&gt;
&lt;br /&gt;
     • NE PAS contenir plus de trois caractères de types identiques consécutifs.&lt;br /&gt;
&lt;br /&gt;
Une longueur de mot de passe réglable avec une taille par défaut de 15 et un minimum de 8.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import argparse&lt;br /&gt;
import random&lt;br /&gt;
import string&lt;br /&gt;
&lt;br /&gt;
# Define character classes&lt;br /&gt;
LOWERCASE = string.ascii_lowercase&lt;br /&gt;
UPPERCASE = string.ascii_uppercase&lt;br /&gt;
DIGITS = string.digits&lt;br /&gt;
SPECIALS = &amp;quot;!,.?/&amp;amp;_*+=-&amp;lt;@^#£µ§&amp;quot;&lt;br /&gt;
ALL_CHARS = LOWERCASE + UPPERCASE + DIGITS + SPECIALS&lt;br /&gt;
&lt;br /&gt;
def get_char_type(char):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Identifies the type of a character.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if char in LOWERCASE:&lt;br /&gt;
        return &#039;lower&#039;&lt;br /&gt;
    if char in UPPERCASE:&lt;br /&gt;
        return &#039;upper&#039;&lt;br /&gt;
    if char in DIGITS:&lt;br /&gt;
        return &#039;digit&#039;&lt;br /&gt;
    if char in SPECIALS:&lt;br /&gt;
        return &#039;special&#039;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def has_required_chars(password):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Checks if the password contains at least one of each required character type.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return (any(c in LOWERCASE for c in password) and&lt;br /&gt;
            any(c in UPPERCASE for c in password) and&lt;br /&gt;
            any(c in DIGITS for c in password) and&lt;br /&gt;
            any(c in SPECIALS for c in password))&lt;br /&gt;
&lt;br /&gt;
def no_more_than_three_consecutive(password):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Checks that the password does not contain more than three consecutive&lt;br /&gt;
    characters of the same type.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if len(password) &amp;lt; 4:&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    for i in range(len(password) - 3):&lt;br /&gt;
        char1_type = get_char_type(password[i])&lt;br /&gt;
        char2_type = get_char_type(password[i+1])&lt;br /&gt;
        char3_type = get_char_type(password[i+2])&lt;br /&gt;
        char4_type = get_char_type(password[i+3])&lt;br /&gt;
        if char1_type == char2_type == char3_type == char4_type:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def generate_password(length):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Generates a password that meets all specified criteria.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    while True:&lt;br /&gt;
        # Ensure the password has at least one of each required character type&lt;br /&gt;
        password_chars = [&lt;br /&gt;
            random.choice(LOWERCASE),&lt;br /&gt;
            random.choice(UPPERCASE),&lt;br /&gt;
            random.choice(DIGITS),&lt;br /&gt;
            random.choice(SPECIALS)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        # Fill the rest of the password length with random characters&lt;br /&gt;
        remaining_length = length - len(password_chars)&lt;br /&gt;
        if remaining_length &amp;gt; 0:&lt;br /&gt;
            password_chars.extend(random.choices(ALL_CHARS, k=remaining_length))&lt;br /&gt;
        &lt;br /&gt;
        # Shuffle the characters to avoid predictable patterns&lt;br /&gt;
        random.shuffle(password_chars)&lt;br /&gt;
        password = &amp;quot;&amp;quot;.join(password_chars)&lt;br /&gt;
        &lt;br /&gt;
        # Check if the generated password meets all criteria&lt;br /&gt;
        if has_required_chars(password) and no_more_than_three_consecutive(password):&lt;br /&gt;
            return password&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Main function to parse arguments and generate password.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        description=&amp;quot;Generate a secure password with specific criteria.&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument(&lt;br /&gt;
        &amp;quot;-n&amp;quot;,&lt;br /&gt;
        &amp;quot;--length&amp;quot;,&lt;br /&gt;
        type=int,&lt;br /&gt;
        default=12,&lt;br /&gt;
        help=&amp;quot;The length of the password to generate (default: 12).&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    if args.length &amp;lt; 8:&lt;br /&gt;
        print(&amp;quot;Error: Password length must be at least 8 to meet all criteria.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    password = generate_password(args.length)&lt;br /&gt;
    print(password)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Son usagle est indentique sous windows (power shell) et Linux (bash) :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ python ./password_generator.py &lt;br /&gt;
6C#+q4Tq8d=t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script pour éviter le delog automatique et afficher l&#039;heure ==&lt;br /&gt;
Souvent les connexions à la console ssh ont un time-out d&#039;inactivité très (trop) court.&lt;br /&gt;
&lt;br /&gt;
Voici un petit programme python qui  affiche l&#039;heure au centre de l&#039;écran et attends l&#039;appuy sur une touche.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/python3&lt;br /&gt;
import time &lt;br /&gt;
import sys&lt;br /&gt;
import select&lt;br /&gt;
import termios&lt;br /&gt;
import tty&lt;br /&gt;
import shutil&lt;br /&gt;
import hashlib&lt;br /&gt;
&lt;br /&gt;
hashcode=&amp;quot;dcc07eeab919998abfedd85c8946b83754501d8d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Obtenir la taille du terminal&lt;br /&gt;
size = shutil.get_terminal_size()&lt;br /&gt;
cols = size.columns&lt;br /&gt;
rows = size.lines&lt;br /&gt;
&lt;br /&gt;
# FORMAT &lt;br /&gt;
date_format=&amp;quot; \u25C0\u25C0   %Y-%m-%d    %H:%M:%S   \u25B6\u25B6 &amp;quot;;&lt;br /&gt;
# Calcul de la chaine&lt;br /&gt;
ssize=len(time.strftime(date_format))&lt;br /&gt;
&lt;br /&gt;
# Calculer la position centrale&lt;br /&gt;
center_x = (cols // 2)-(ssize//2)&lt;br /&gt;
center_y = rows // 2&lt;br /&gt;
&lt;br /&gt;
#  sleep_time  to ajuste animation&lt;br /&gt;
sleep_time=0.03&lt;br /&gt;
phase=0&lt;br /&gt;
&lt;br /&gt;
# Sauvegarder les paramÃ¨tres du terminal&lt;br /&gt;
fd = sys.stdin.fileno()&lt;br /&gt;
old_settings = termios.tcgetattr(fd)&lt;br /&gt;
tty.setcbreak(fd)  # Mode caractÃ¨re par caractÃ¨re&lt;br /&gt;
time_start=time.time()&lt;br /&gt;
time_stop=time_start+0.5&lt;br /&gt;
time_slice=time_stop-time_start&lt;br /&gt;
count=0&lt;br /&gt;
increment=1 &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
print (&amp;quot;\033[?25l\033[s&amp;quot;,end=&amp;quot;&amp;quot;)&lt;br /&gt;
try:&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            if select.select([sys.stdin], [], [], 0)[0]:&lt;br /&gt;
                key = sys.stdin.read(1)&lt;br /&gt;
                if key in (&#039;q&#039;, &#039;Q&#039;, &#039;\033&#039;):             &lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0mEnter code:______\033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                    hash_input_code = hashlib.sha1(code.encode()).hexdigest()&lt;br /&gt;
                    if hash_input_code == hashcode:&lt;br /&gt;
                       break&lt;br /&gt;
                if key in (&#039;t&#039;, &#039;T&#039;):               &lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0m time slice:{time_slice:.5f} \033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                if key in (&#039;s&#039;, &#039;S&#039;):&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0m sleep:{sleep_time:.5f} \033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                if key in (&#039;p&#039;, &#039;P&#039;):&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0m phase:{phase:.5f} \033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                    &lt;br /&gt;
                    &lt;br /&gt;
            print(f&amp;quot;\033[{center_y-1};{center_x}H\033[0m Screen lock &#039;q&#039; or &amp;lt;esc&amp;gt; to exit&amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
            print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
            now = time.time()&lt;br /&gt;
            ts=time.localtime(now)&lt;br /&gt;
            f=time.strftime(&amp;quot;\033[103m\033[31m&amp;quot;+date_format+&amp;quot;\033[0m&amp;quot;,ts)&lt;br /&gt;
            print (f,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            &lt;br /&gt;
            print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;,end=&amp;quot;&amp;quot;)&lt;br /&gt;
            ## Ajust frequency&lt;br /&gt;
            if time_slice&amp;gt;0.95 and time_slice&amp;lt;1.05:         # &amp;gt; 95% Green&lt;br /&gt;
                print (&amp;quot;\033[92m&amp;quot;,end=&amp;quot;&amp;quot;)                &lt;br /&gt;
            else:&lt;br /&gt;
                if time_slice&amp;gt;0.75 and time_slice&amp;lt;1.25:     # &amp;gt; 75% Yellow&lt;br /&gt;
                    print (&amp;quot;\033[93m&amp;quot;,end=&amp;quot;&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    print (&amp;quot;\033[31m&amp;quot;,end=&amp;quot;&amp;quot;)               # &amp;lt;75% red&lt;br /&gt;
       &lt;br /&gt;
            ## print time arrow&lt;br /&gt;
  &lt;br /&gt;
            print (&amp;quot; &amp;quot;*count,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            if increment &amp;gt; 0:&lt;br /&gt;
                print (f&amp;quot;-&amp;gt; &amp;quot;,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            else:&lt;br /&gt;
                print (f&amp;quot;&amp;lt;- &amp;quot;,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            time.sleep(sleep_time)&lt;br /&gt;
            count+=increment&lt;br /&gt;
            if count&amp;gt;=ssize-2:&lt;br /&gt;
                time_start=time.time()&lt;br /&gt;
                increment=-1&lt;br /&gt;
            if count&amp;lt;=0:&lt;br /&gt;
                time_stop=time.time()&lt;br /&gt;
                time_slice=abs(time_stop-time_start)&lt;br /&gt;
                if time_slice &amp;lt; 1:&lt;br /&gt;
                    t=time.time()&lt;br /&gt;
                    phase=t-int(t)&lt;br /&gt;
                    sleep_time+=0.001&lt;br /&gt;
                else:   &lt;br /&gt;
                    sleep_time-=0.001&lt;br /&gt;
                    if sleep_time&amp;lt;0:&lt;br /&gt;
                        sleep_time=0                &lt;br /&gt;
                increment=+1&lt;br /&gt;
            te=time.time()&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\007&amp;quot;, end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
finally:&lt;br /&gt;
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)  # Restaurer terminal&lt;br /&gt;
    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\033[u\033[?25h&amp;quot;, end=&amp;quot;&amp;quot;)  # Restaurer position curseur&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le script s&#039;autoexplique. On utilise le module [[Python date et heure#Le module time|time]] el des [[ANSI|codes ansi]].&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image-slock.png|sans_cadre|425x425px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;heure et la date s&#039;affiche au milieu de l&#039;écran avec le carret qui disparait. Si on tape une touche on remplace le texte jaune de la date par des espaces,le carret réapparait et le curseur revient là ou il était.&lt;br /&gt;
&lt;br /&gt;
Si il y avait du texte sous la date comme c&#039;est le cas dans cet exemple il sera perdu et remplacé par des espaces.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Petits_exemples_de_code_Python&amp;diff=2194</id>
		<title>Petits exemples de code Python</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Petits_exemples_de_code_Python&amp;diff=2194"/>
		<updated>2026-08-24T08:13:53Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Script pour éviter le delog automatique et afficher l&amp;#039;heure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Script pour générer automatiquement des mots de passes ==&lt;br /&gt;
Dans la section [[Bash random|bash traitant des la génération du hasard]] j&#039;avais mis un exemple de générateur de lot de passe.&lt;br /&gt;
&lt;br /&gt;
Ici on fait un programme python pour faire ça mais en gérant les contraintes des systèmes modernes.&lt;br /&gt;
&lt;br /&gt;
Les règles :&lt;br /&gt;
&lt;br /&gt;
      • contenir au moins un caractère de la classe majuscule (A-Z)&lt;br /&gt;
&lt;br /&gt;
     • contenir au moins un caractère de la classe minuscule (a-z)&lt;br /&gt;
&lt;br /&gt;
     • contenir au moins un caractère de la classe chiffre (0-9)&lt;br /&gt;
&lt;br /&gt;
     • contenir au moins un caractère de la classe caractère spécial parmi ! , . / ? &amp;amp; _ * + = - &amp;gt; &amp;lt; @ ^ # £ µ §&lt;br /&gt;
&lt;br /&gt;
     • NE PAS contenir plus de trois caractères de types identiques consécutifs.&lt;br /&gt;
&lt;br /&gt;
Une longueur de mot de passe réglable avec une taille par défaut de 15 et un minimum de 8.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
import argparse&lt;br /&gt;
import random&lt;br /&gt;
import string&lt;br /&gt;
&lt;br /&gt;
# Define character classes&lt;br /&gt;
LOWERCASE = string.ascii_lowercase&lt;br /&gt;
UPPERCASE = string.ascii_uppercase&lt;br /&gt;
DIGITS = string.digits&lt;br /&gt;
SPECIALS = &amp;quot;!,.?/&amp;amp;_*+=-&amp;lt;@^#£µ§&amp;quot;&lt;br /&gt;
ALL_CHARS = LOWERCASE + UPPERCASE + DIGITS + SPECIALS&lt;br /&gt;
&lt;br /&gt;
def get_char_type(char):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Identifies the type of a character.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if char in LOWERCASE:&lt;br /&gt;
        return &#039;lower&#039;&lt;br /&gt;
    if char in UPPERCASE:&lt;br /&gt;
        return &#039;upper&#039;&lt;br /&gt;
    if char in DIGITS:&lt;br /&gt;
        return &#039;digit&#039;&lt;br /&gt;
    if char in SPECIALS:&lt;br /&gt;
        return &#039;special&#039;&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def has_required_chars(password):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Checks if the password contains at least one of each required character type.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    return (any(c in LOWERCASE for c in password) and&lt;br /&gt;
            any(c in UPPERCASE for c in password) and&lt;br /&gt;
            any(c in DIGITS for c in password) and&lt;br /&gt;
            any(c in SPECIALS for c in password))&lt;br /&gt;
&lt;br /&gt;
def no_more_than_three_consecutive(password):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Checks that the password does not contain more than three consecutive&lt;br /&gt;
    characters of the same type.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if len(password) &amp;lt; 4:&lt;br /&gt;
        return True&lt;br /&gt;
    &lt;br /&gt;
    for i in range(len(password) - 3):&lt;br /&gt;
        char1_type = get_char_type(password[i])&lt;br /&gt;
        char2_type = get_char_type(password[i+1])&lt;br /&gt;
        char3_type = get_char_type(password[i+2])&lt;br /&gt;
        char4_type = get_char_type(password[i+3])&lt;br /&gt;
        if char1_type == char2_type == char3_type == char4_type:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def generate_password(length):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Generates a password that meets all specified criteria.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    while True:&lt;br /&gt;
        # Ensure the password has at least one of each required character type&lt;br /&gt;
        password_chars = [&lt;br /&gt;
            random.choice(LOWERCASE),&lt;br /&gt;
            random.choice(UPPERCASE),&lt;br /&gt;
            random.choice(DIGITS),&lt;br /&gt;
            random.choice(SPECIALS)&lt;br /&gt;
        ]&lt;br /&gt;
        &lt;br /&gt;
        # Fill the rest of the password length with random characters&lt;br /&gt;
        remaining_length = length - len(password_chars)&lt;br /&gt;
        if remaining_length &amp;gt; 0:&lt;br /&gt;
            password_chars.extend(random.choices(ALL_CHARS, k=remaining_length))&lt;br /&gt;
        &lt;br /&gt;
        # Shuffle the characters to avoid predictable patterns&lt;br /&gt;
        random.shuffle(password_chars)&lt;br /&gt;
        password = &amp;quot;&amp;quot;.join(password_chars)&lt;br /&gt;
        &lt;br /&gt;
        # Check if the generated password meets all criteria&lt;br /&gt;
        if has_required_chars(password) and no_more_than_three_consecutive(password):&lt;br /&gt;
            return password&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Main function to parse arguments and generate password.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    parser = argparse.ArgumentParser(&lt;br /&gt;
        description=&amp;quot;Generate a secure password with specific criteria.&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    parser.add_argument(&lt;br /&gt;
        &amp;quot;-n&amp;quot;,&lt;br /&gt;
        &amp;quot;--length&amp;quot;,&lt;br /&gt;
        type=int,&lt;br /&gt;
        default=12,&lt;br /&gt;
        help=&amp;quot;The length of the password to generate (default: 12).&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
    args = parser.parse_args()&lt;br /&gt;
&lt;br /&gt;
    if args.length &amp;lt; 8:&lt;br /&gt;
        print(&amp;quot;Error: Password length must be at least 8 to meet all criteria.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    password = generate_password(args.length)&lt;br /&gt;
    print(password)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Son usagle est indentique sous windows (power shell) et Linux (bash) :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
$ python ./password_generator.py &lt;br /&gt;
6C#+q4Tq8d=t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Script pour éviter le delog automatique et afficher l&#039;heure ==&lt;br /&gt;
Souvent les connexions à la console ssh ont un time-out d&#039;inactivité très (trop) court.&lt;br /&gt;
&lt;br /&gt;
Voici un petit programme python qui  affiche l&#039;heure au centre de l&#039;écran et attends l&#039;appuy sur une touche.&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/python3&lt;br /&gt;
import time &lt;br /&gt;
import sys&lt;br /&gt;
import select&lt;br /&gt;
import termios&lt;br /&gt;
import tty&lt;br /&gt;
import shutil&lt;br /&gt;
import hashlib&lt;br /&gt;
&lt;br /&gt;
hashcode=&amp;quot;dcc07eeab919998abfedd85c8946b83754501d8d&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Obtenir la taille du terminal&lt;br /&gt;
size = shutil.get_terminal_size()&lt;br /&gt;
cols = size.columns&lt;br /&gt;
rows = size.lines&lt;br /&gt;
&lt;br /&gt;
# FORMAT &lt;br /&gt;
date_format=&amp;quot; \u25C0\u25C0   %Y-%m-%d    %H:%M:%S   \u25B6\u25B6 &amp;quot;;&lt;br /&gt;
# Calcul de la chaine&lt;br /&gt;
ssize=len(time.strftime(date_format))&lt;br /&gt;
&lt;br /&gt;
# Calculer la position centrale&lt;br /&gt;
center_x = (cols // 2)-(ssize//2)&lt;br /&gt;
center_y = rows // 2&lt;br /&gt;
&lt;br /&gt;
#  sleep_time  to ajuste animation&lt;br /&gt;
sleep_time=0.03&lt;br /&gt;
phase=0&lt;br /&gt;
&lt;br /&gt;
# Sauvegarder les paramÃ¨tres du terminal&lt;br /&gt;
fd = sys.stdin.fileno()&lt;br /&gt;
old_settings = termios.tcgetattr(fd)&lt;br /&gt;
tty.setcbreak(fd)  # Mode caractÃ¨re par caractÃ¨re&lt;br /&gt;
time_start=time.time()&lt;br /&gt;
time_stop=time_start+0.5&lt;br /&gt;
time_slice=time_stop-time_start&lt;br /&gt;
count=0&lt;br /&gt;
increment=1 &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
print (&amp;quot;\033[?25l\033[s&amp;quot;,end=&amp;quot;&amp;quot;)&lt;br /&gt;
try:&lt;br /&gt;
    while True:&lt;br /&gt;
        try:&lt;br /&gt;
            if select.select([sys.stdin], [], [], 0)[0]:&lt;br /&gt;
                key = sys.stdin.read(1)&lt;br /&gt;
                if key in (&#039;q&#039;, &#039;Q&#039;, &#039;\033&#039;):             &lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0mEnter code:______\033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                    hash_input_code = hashlib.sha1(code.encode()).hexdigest()&lt;br /&gt;
                    if hash_input_code == hashcode:&lt;br /&gt;
                       break&lt;br /&gt;
                if key in (&#039;t&#039;, &#039;T&#039;):               &lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0m time slice:{time_slice:.5f} \033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                if key in (&#039;s&#039;, &#039;S&#039;):&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0m sleep:{sleep_time:.5f} \033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                if key in (&#039;p&#039;, &#039;P&#039;):&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
                    print(f&amp;quot;\033[{center_y};{center_x}H\033[0m phase:{phase:.5f} \033[6D&amp;quot;,end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
                    code=input()&lt;br /&gt;
                    &lt;br /&gt;
                    &lt;br /&gt;
            print(f&amp;quot;\033[{center_y-1};{center_x}H\033[0m Screen lock &#039;q&#039; or &amp;lt;esc&amp;gt; to exit&amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
            print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;, end=&amp;quot;&amp;quot;)&lt;br /&gt;
            now = time.time()&lt;br /&gt;
            ts=time.localtime(now)&lt;br /&gt;
            f=time.strftime(&amp;quot;\033[103m\033[31m&amp;quot;+date_format+&amp;quot;\033[0m&amp;quot;,ts)&lt;br /&gt;
            print (f,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            &lt;br /&gt;
            print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;,end=&amp;quot;&amp;quot;)&lt;br /&gt;
            ## Ajust frequency&lt;br /&gt;
            if time_slice&amp;gt;0.95 and time_slice&amp;lt;1.05:         # &amp;gt; 95% Green&lt;br /&gt;
                print (&amp;quot;\033[92m&amp;quot;,end=&amp;quot;&amp;quot;)                &lt;br /&gt;
            else:&lt;br /&gt;
                if time_slice&amp;gt;0.75 and time_slice&amp;lt;1.25:     # &amp;gt; 75% Yellow&lt;br /&gt;
                    print (&amp;quot;\033[93m&amp;quot;,end=&amp;quot;&amp;quot;)&lt;br /&gt;
                else:&lt;br /&gt;
                    print (&amp;quot;\033[31m&amp;quot;,end=&amp;quot;&amp;quot;)               # &amp;lt;75% red&lt;br /&gt;
       &lt;br /&gt;
            ## print time arrow&lt;br /&gt;
  &lt;br /&gt;
            print (&amp;quot; &amp;quot;*count,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            if increment &amp;gt; 0:&lt;br /&gt;
                print (f&amp;quot;-&amp;gt; &amp;quot;,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            else:&lt;br /&gt;
                print (f&amp;quot;&amp;lt;- &amp;quot;,end=&amp;quot;&amp;quot;,flush=True)&lt;br /&gt;
            time.sleep(sleep_time)&lt;br /&gt;
            count+=increment&lt;br /&gt;
            if count&amp;gt;=ssize-2:&lt;br /&gt;
                time_start=time.time()&lt;br /&gt;
                increment=-1&lt;br /&gt;
            if count&amp;lt;=0:&lt;br /&gt;
                time_stop=time.time()&lt;br /&gt;
                time_slice=abs(time_stop-time_start)&lt;br /&gt;
                if time_slice &amp;lt; 1:&lt;br /&gt;
                    t=time.time()&lt;br /&gt;
                    phase=t-int(t)&lt;br /&gt;
                    sleep_time+=0.001&lt;br /&gt;
                else:   &lt;br /&gt;
                    sleep_time-=0.001&lt;br /&gt;
                    if sleep_time&amp;lt;0:&lt;br /&gt;
                        sleep_time=0                &lt;br /&gt;
                increment=+1&lt;br /&gt;
            te=time.time()&lt;br /&gt;
        except KeyboardInterrupt:&lt;br /&gt;
            print(&amp;quot;\007&amp;quot;, end=&amp;quot;&amp;quot;, flush=True)&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
finally:&lt;br /&gt;
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)  # Restaurer terminal&lt;br /&gt;
    print(f&amp;quot;\033[{center_y-1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;\033[{center_y};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
    print(f&amp;quot;\033[{center_y+1};{center_x}H&amp;quot;+&amp;quot; &amp;quot;*ssize, end=&amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    print(&amp;quot;\033[u\033[?25h&amp;quot;, end=&amp;quot;&amp;quot;)  # Restaurer position curseur&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le script s&#039;autoexplique. On utilise le module [[Python date et heure#Le module time|time]] el des [[ANSI|codes ansi]].&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Image-slock.png|sans_cadre|425x425px]]&lt;br /&gt;
&lt;br /&gt;
L&#039;heure et la date s&#039;affiche au milieu de l&#039;écran avec le carret qui disparait. Si on tape une touche on remplace le texte jaune de la date par des espaces,le carret réapparait et le curseur revient là ou il était.&lt;br /&gt;
&lt;br /&gt;
Si il y avait du texte sous la date comme c&#039;est le cas dans cet exemple il sera perdu et remplacé par des espaces.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Bash_random&amp;diff=2193</id>
		<title>Bash random</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Bash_random&amp;diff=2193"/>
		<updated>2026-08-24T08:05:10Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les ordinateurs savent faire beaucoup de chose mais ont beaucoup de mal avec le hasard. Leur conception déterministe ne les prédispose pas à ce genre de travail. Deux solutions émergent:&lt;br /&gt;
&lt;br /&gt;
* Se baser sur un phénomène physique aléatoire ou réputé tel mais c&#039;est très difficile et il faut avoir un capteur pour cela.&lt;br /&gt;
* Utiliser un algorithme pseudo aléatoire. La suite de nombre sera réputé aléatoire même su toujours la même. Exemple les chiffres de PI. La suite est aléatoire mais commence toujours par 3.14... l&#039;ordinateur utilise souvent le temps pour prendre &amp;quot;en marche&amp;quot; cette séquence.&lt;br /&gt;
&lt;br /&gt;
== Sulution basée sur des répétitions de uuid ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dans la page de génération de uuid j&#039;avais mentionné la disponibillité d&#039;un outil de génération :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat /proc/sys/kernel/random/uuid&amp;lt;/syntaxhighlight&amp;gt;Qui nous donne des chaines du type :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;45448407-faf9-42af-af54-fbe6194a510c&amp;lt;/syntaxhighlight&amp;gt;Le script suivant :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
do &lt;br /&gt;
  export RND=`cat /proc/sys/kernel/random/uuid  | cut -b 1-8,10-13,15-18,20-23,25-`&lt;br /&gt;
  echo -n $RND&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Va nous donner une suite ininterrompue de digits en hexa.&lt;br /&gt;
&lt;br /&gt;
Si on veut du binaire xxd est notre amis mai, attention, le binaire n&#039;est pas affichable. On redirige vers un fichier.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
while [ 1 ]&lt;br /&gt;
  do &lt;br /&gt;
  export RND=`cat /proc/sys/kernel/random/uuid  | cut -b 1-8,10-13,15-18,20-23,25-`&lt;br /&gt;
  echo -n $RND&lt;br /&gt;
done | xxd -r -p &amp;gt; binary-random.bin&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On fait tourner ce scriot quelques secondes et on l&#039;arrête par &amp;lt;CTRL&amp;gt;+C.&lt;br /&gt;
&lt;br /&gt;
On récupère un fichier binaire aléatoire.&lt;br /&gt;
&lt;br /&gt;
On peut l&#039;afficher avec &amp;lt;code&amp;gt;od -x&amp;lt;/code&amp;gt; ou avec &amp;lt;code&amp;gt;base64&amp;lt;/code&amp;gt; par exemple.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash&amp;diff=2192</id>
		<title>Redirections bash</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash&amp;diff=2192"/>
		<updated>2026-08-07T08:33:11Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a déplacé la page Redirections bash vers Redirections bash (et en bourne shell en géneral)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTION [[Redirections bash (et en bourne shell en géneral)]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2191</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2191"/>
		<updated>2026-08-07T08:33:11Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a déplacé la page Redirections bash vers Redirections bash (et en bourne shell en géneral)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
[[Fichier:Process-bash000.png|centré|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
[[Fichier:Process-bash001.png|centré|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
[[Fichier:Process-bash004.png|centré|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
[[Fichier:Process-bash005.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Process-bash006.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
[[Fichier:Process-bash007.png|centré|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
[[Fichier:Process-bash009..png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
[[Fichier:Process-bash010.png.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
[[Fichier:Swapzoom.png.png|centré|sans_cadre|620x620px]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;br /&gt;
&lt;br /&gt;
Donc la formule magique c&#039;est : &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; !&lt;br /&gt;
&lt;br /&gt;
== Forme simplifiée en bash. ==&lt;br /&gt;
Les commandes ci dessus fonctionnent avec bash mais fonctionnent avec n&#039;importe quel bourne shell. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sh ksh bash.png|sans_cadre|392x392px]]&lt;br /&gt;
&lt;br /&gt;
Mais on l&#039;a vu la syntaxe est &amp;quot;obscure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;&amp;lt;big&amp;gt;bash&amp;lt;/big&amp;gt;&#039;&#039;&#039;&#039;&#039; nous propose une syntaxe plus élégante :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt; &amp;gt;(commande)&amp;lt;/code&amp;gt; envoie la sortie standard à &amp;lt;code&amp;gt;commande&amp;lt;/code&amp;gt; (pour le coup équivalent a un &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Mais on comprends la syntaxe avec :&lt;br /&gt;
&lt;br /&gt;
* 2&amp;gt; &amp;gt;(commande) qui envoie la sortie d&#039;erreur à &amp;lt;code&amp;gt;commande&amp;lt;/code&amp;gt;. Pour le coup c&#039;est plus lisible que &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ca permet, en une ligne de faire une commande dont stdout est traité par un filtre et stdout par un autre:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./stdtest \&lt;br /&gt;
    &amp;gt; &amp;gt;(./filtre-bleu) \&lt;br /&gt;
    2&amp;gt; &amp;gt;(./filtre-rouge &amp;gt;&amp;amp;2)&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Bash-complex-filters.png.png|sans_cadre|482x482px]]&lt;br /&gt;
&lt;br /&gt;
== Avec des pipes nommées ==&lt;br /&gt;
Ce mécanisme fonctionne avec bash, ksh, zsh (j&#039;ai pas testé mais il parait) en sh de base ca ne marche pas. J&#039;ai essayé des combinaisons avec &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; et même avec un flux 4 de plus mais j&#039;y suis pas arrivé.&lt;br /&gt;
&lt;br /&gt;
La seule solution sh que je sois arrivé a faire marcher ce sont les &#039;&#039;pipes nommées&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;mkfifo fifo_out fifo_err&lt;br /&gt;
&lt;br /&gt;
./filtre-bleu &amp;lt; fifo_out &amp;amp;&lt;br /&gt;
./filtre-rouge &amp;lt; fifo_err &amp;gt;&amp;amp;2 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
./stdtest &amp;gt; fifo_out 2&amp;gt; fifo_err&lt;br /&gt;
&lt;br /&gt;
rm fifo_out fifo_err&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On crée deux FIFO des espèces de faux fichiers dans lesquels on ne peut que lire dans l&#039;ordre ce qu&#039;on y à écrit.&amp;lt;code&amp;gt;mkfifo fifo_out fifo_err&amp;lt;/code&amp;gt;&lt;br /&gt;
* On lance deux taches en background qui envoient &lt;br /&gt;
** tout ce qui sort de &amp;lt;code&amp;gt;fifo_out&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;./filtre-bleu&amp;lt;/code&amp;gt;&lt;br /&gt;
** tout ce qui sort de &amp;lt;code&amp;gt;fifo_err&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;./filtre-rouge&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On lance notre commande en redirigeant &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; dans  &amp;lt;code&amp;gt;fifo_out&amp;lt;/code&amp;gt;  et &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;fifo_err&amp;lt;/code&amp;gt; &lt;br /&gt;
* On efface nos pipes nommées (ça termine en même temps les deux tâches qui y étaient attachées)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Namedfifo.png.png|sans_cadre|571x571px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2190</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2190"/>
		<updated>2026-08-07T08:01:55Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Forme simplifiée en bash. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
[[Fichier:Process-bash000.png|centré|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
[[Fichier:Process-bash001.png|centré|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
[[Fichier:Process-bash004.png|centré|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
[[Fichier:Process-bash005.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Process-bash006.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
[[Fichier:Process-bash007.png|centré|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
[[Fichier:Process-bash009..png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
[[Fichier:Process-bash010.png.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
[[Fichier:Swapzoom.png.png|centré|sans_cadre|620x620px]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;br /&gt;
&lt;br /&gt;
Donc la formule magique c&#039;est : &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; !&lt;br /&gt;
&lt;br /&gt;
== Forme simplifiée en bash. ==&lt;br /&gt;
Les commandes ci dessus fonctionnent avec bash mais fonctionnent avec n&#039;importe quel bourne shell. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sh ksh bash.png|sans_cadre|392x392px]]&lt;br /&gt;
&lt;br /&gt;
Mais on l&#039;a vu la syntaxe est &amp;quot;obscure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;&amp;lt;big&amp;gt;bash&amp;lt;/big&amp;gt;&#039;&#039;&#039;&#039;&#039; nous propose une syntaxe plus élégante :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt; &amp;gt;(commande)&amp;lt;/code&amp;gt; envoie la sortie standard à &amp;lt;code&amp;gt;commande&amp;lt;/code&amp;gt; (pour le coup équivalent a un &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Mais on comprends la syntaxe avec :&lt;br /&gt;
&lt;br /&gt;
* 2&amp;gt; &amp;gt;(commande) qui envoie la sortie d&#039;erreur à &amp;lt;code&amp;gt;commande&amp;lt;/code&amp;gt;. Pour le coup c&#039;est plus lisible que &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ca permet, en une ligne de faire une commande dont stdout est traité par un filtre et stdout par un autre:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./stdtest \&lt;br /&gt;
    &amp;gt; &amp;gt;(./filtre-bleu) \&lt;br /&gt;
    2&amp;gt; &amp;gt;(./filtre-rouge &amp;gt;&amp;amp;2)&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Bash-complex-filters.png.png|sans_cadre|482x482px]]&lt;br /&gt;
&lt;br /&gt;
== Avec des pipes nommées ==&lt;br /&gt;
Ce mécanisme fonctionne avec bash, ksh, zsh (j&#039;ai pas testé mais il parait) en sh de base ca ne marche pas. J&#039;ai essayé des combinaisons avec &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; et même avec un flux 4 de plus mais j&#039;y suis pas arrivé.&lt;br /&gt;
&lt;br /&gt;
La seule solution sh que je sois arrivé a faire marcher ce sont les &#039;&#039;pipes nommées&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;mkfifo fifo_out fifo_err&lt;br /&gt;
&lt;br /&gt;
./filtre-bleu &amp;lt; fifo_out &amp;amp;&lt;br /&gt;
./filtre-rouge &amp;lt; fifo_err &amp;gt;&amp;amp;2 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
./stdtest &amp;gt; fifo_out 2&amp;gt; fifo_err&lt;br /&gt;
&lt;br /&gt;
rm fifo_out fifo_err&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On crée deux FIFO des espèces de faux fichiers dans lesquels on ne peut que lire dans l&#039;ordre ce qu&#039;on y à écrit.&amp;lt;code&amp;gt;mkfifo fifo_out fifo_err&amp;lt;/code&amp;gt;&lt;br /&gt;
* On lance deux taches en background qui envoient &lt;br /&gt;
** tout ce qui sort de &amp;lt;code&amp;gt;fifo_out&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;./filtre-bleu&amp;lt;/code&amp;gt;&lt;br /&gt;
** tout ce qui sort de &amp;lt;code&amp;gt;fifo_err&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;./filtre-rouge&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On lance notre commande en redirigeant &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; dans  &amp;lt;code&amp;gt;fifo_out&amp;lt;/code&amp;gt;  et &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;fifo_err&amp;lt;/code&amp;gt; &lt;br /&gt;
* On efface nos pipes nommées (ça termine en même temps les deux tâches qui y étaient attachées)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Namedfifo.png.png|sans_cadre|571x571px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Namedfifo.png.png&amp;diff=2189</id>
		<title>Fichier:Namedfifo.png.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Namedfifo.png.png&amp;diff=2189"/>
		<updated>2026-08-07T07:57:15Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Namedfifo.png.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;pipes nommees&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2188</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2188"/>
		<updated>2026-08-07T07:56:12Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* x&amp;gt;&amp;amp;x généralisation de l&amp;#039;opérateur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
[[Fichier:Process-bash000.png|centré|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
[[Fichier:Process-bash001.png|centré|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
[[Fichier:Process-bash004.png|centré|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
[[Fichier:Process-bash005.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Process-bash006.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
[[Fichier:Process-bash007.png|centré|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
[[Fichier:Process-bash009..png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
[[Fichier:Process-bash010.png.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
[[Fichier:Swapzoom.png.png|centré|sans_cadre|620x620px]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;br /&gt;
&lt;br /&gt;
Donc la formule magique c&#039;est : &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; !&lt;br /&gt;
&lt;br /&gt;
== Forme simplifiée en bash. ==&lt;br /&gt;
Les commandes ci dessus fonctionnent avec bash mais fonctionnent avec n&#039;importe quel bourne shell. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Sh ksh bash.png|sans_cadre|392x392px]]&lt;br /&gt;
&lt;br /&gt;
Mais on l&#039;a vu la syntaxe est &amp;quot;obscure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;&amp;lt;big&amp;gt;bash&amp;lt;/big&amp;gt;&#039;&#039;&#039;&#039;&#039; nous propose une syntaxe plus élégante :&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;gt; &amp;gt;(commande)&amp;lt;/code&amp;gt; envoie la sortie standard à &amp;lt;code&amp;gt;commande&amp;lt;/code&amp;gt; (pour le coup équivalent a un &amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Mais on comprends la syntaxe avec :&lt;br /&gt;
&lt;br /&gt;
* 2&amp;gt; &amp;gt;(commande) qui envoie la sortie d&#039;erreur à &amp;lt;code&amp;gt;commande&amp;lt;/code&amp;gt;. Pour le coup c&#039;est plus lisible que &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ca permet, en une ligne de faire une commande dont stdout est traité par un filtre et stdout par un autre:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./stdtest \&lt;br /&gt;
    &amp;gt; &amp;gt;(./filtre-bleu) \&lt;br /&gt;
    2&amp;gt; &amp;gt;(./filtre-rouge &amp;gt;&amp;amp;2)&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Bash-complex-filters.png.png|sans_cadre|482x482px]]&lt;br /&gt;
&lt;br /&gt;
Ce mécanisme fonctionne avec bash, ksh, zsh (j&#039;ai pas testé mais il parait) en sh de base ca ne marche pas. J&#039;ai essayé des combinaisons avec &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1 1&amp;gt;&amp;amp;2 2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; et même avec un flux 4 de plus mais j&#039;y suis pas arrivé.&lt;br /&gt;
&lt;br /&gt;
La seule solution sh que je sois arrivé a faire marcher ce sont les &#039;&#039;pipes nommées&#039;&#039;:&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;mkfifo fifo_out fifo_err&lt;br /&gt;
&lt;br /&gt;
./filtre-bleu &amp;lt; fifo_out &amp;amp;&lt;br /&gt;
./filtre-rouge &amp;lt; fifo_err &amp;gt;&amp;amp;2 &amp;amp;&lt;br /&gt;
&lt;br /&gt;
./stdtest &amp;gt; fifo_out 2&amp;gt; fifo_err&lt;br /&gt;
&lt;br /&gt;
rm fifo_out fifo_err&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On crée deux FIFO des espèces de faux fichiers dans lesquels on ne peut que lire dans l&#039;ordre ce qu&#039;on y à écrit.&amp;lt;code&amp;gt;mkfifo fifo_out fifo_err&amp;lt;/code&amp;gt;&lt;br /&gt;
* On lance deux taches en background qui envoient &lt;br /&gt;
** tout ce qui sort de &amp;lt;code&amp;gt;fifo_out&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;./filtre-bleu&amp;lt;/code&amp;gt;&lt;br /&gt;
** tout ce qui sort de &amp;lt;code&amp;gt;fifo_err&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;./filtre-rouge&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* On lance notre commande en redirigeant &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; dans  &amp;lt;code&amp;gt;fifo_out&amp;lt;/code&amp;gt;  et &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; dans &amp;lt;code&amp;gt;fifo_err&amp;lt;/code&amp;gt; &lt;br /&gt;
* On efface nos pipes nommées (ça termine en même temps les deux tâches qui y étaient attachées)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Namedfifo.png.png|sans_cadre|571x571px]]&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Namedfifo.png.png&amp;diff=2187</id>
		<title>Fichier:Namedfifo.png.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Namedfifo.png.png&amp;diff=2187"/>
		<updated>2026-08-07T07:55:06Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;pipes nommees&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Bash-complex-filters.png.png&amp;diff=2186</id>
		<title>Fichier:Bash-complex-filters.png.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Bash-complex-filters.png.png&amp;diff=2186"/>
		<updated>2026-08-07T07:37:57Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;les filtres complexes en bash&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Sh_ksh_bash.png&amp;diff=2185</id>
		<title>Fichier:Sh ksh bash.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Sh_ksh_bash.png&amp;diff=2185"/>
		<updated>2026-08-07T07:30:30Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;bourne shell&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2184</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2184"/>
		<updated>2026-08-07T07:11:47Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* x&amp;gt;&amp;amp;x généralisation de l&amp;#039;opérateur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
[[Fichier:Process-bash000.png|centré|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
[[Fichier:Process-bash001.png|centré|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
[[Fichier:Process-bash004.png|centré|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
[[Fichier:Process-bash005.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[[Fichier:Process-bash006.png|centré|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
[[Fichier:Process-bash007.png|centré|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
[[Fichier:Process-bash009..png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
[[Fichier:Process-bash010.png.png|centré|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
[[Fichier:Swapzoom.png.png|centré|sans_cadre|620x620px]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2183</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2183"/>
		<updated>2026-08-07T07:08:31Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* x&amp;gt;&amp;amp;x généralisation de l&amp;#039;opérateur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash007.png|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|sans_cadre|1017x1017px]]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash009..png|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash010.png.png|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Swapzoom.png.png|sans_cadre|620x620px]]&lt;br /&gt;
&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2182</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2182"/>
		<updated>2026-08-06T15:18:47Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash007.png|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|sans_cadre|1017x1017px]]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash009..png|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur ===&lt;br /&gt;
&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
[[Fichier:Process-bash010.png.png|sans_cadre|1017x1017px]]&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
[[Fichier:Swapzoom.png.png|sans_cadre|620x620px]]&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2181</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2181"/>
		<updated>2026-08-06T15:18:15Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Redirection du flux d&amp;#039;erreur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt; redirection vers un fichier. ====&lt;br /&gt;
Pour reprendre l&#039;exemple ci dessus.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -S -o - hello.c 2&amp;gt; error.txt&amp;lt;/syntaxhighlight&amp;gt;ca donne :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash007.png|sans_cadre|1019x1019px]]&lt;br /&gt;
&lt;br /&gt;
le code source est généré (par défaut pour &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;) dans &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;  et la sortie standard est dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2&amp;gt;&amp;gt; redirection (avec ajout) dans un fichier. ====&lt;br /&gt;
De la même façon que pour la sortie standard &amp;lt;code&amp;gt;&amp;gt;&amp;gt;&amp;lt;/code&amp;gt; la sortie erreur est redirigée vers un fichier mais en mode &amp;quot;append&amp;quot;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S -o - hello.c 2&amp;gt;&amp;gt; error.txt &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;les erreurs s&#039;accumulent dans &amp;lt;code&amp;gt;error.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Redirection de la sortie d&#039;erreur dans un pipe. ====&lt;br /&gt;
La c&#039;est le moment complexe de l&#039;affaire! &lt;br /&gt;
&lt;br /&gt;
Il n&#039;y a pas d&#039;opérateur de redirection 2| mais il y a des opérateurs redirige tel flux vers tel autre. Faut jouer avec.&lt;br /&gt;
&lt;br /&gt;
===== 2&amp;gt;&amp;amp;1 Forcer stderr vers stdout =====&lt;br /&gt;
[[Fichier:Process-bash008.png|sans_cadre|1017x1017px]]&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;ls 2&amp;gt;&amp;amp;1&amp;lt;/syntaxhighlight&amp;gt;On les erreurs et la sortie standard dans le même flux, ici ca sert pas a grand chose mais:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h 2&amp;gt;&amp;amp;1 | mail -s &amp;quot;Etat du disque&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est plus utile! On envoie un mail avec l&#039;état des disques. Si il y a une erreur on a l&#039;erreur dans le corps du mail aussi. &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash009..png|sans_cadre|1017x1017px]]&lt;br /&gt;
&lt;br /&gt;
Le problème est que l&#039;on ne peut plus traiter différemment stderr et stdout dans le flux &amp;quot;violet&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===== x&amp;gt;&amp;amp;x généralisation de l&#039;opérateur =====&lt;br /&gt;
Tout d&#039;abord pour tester on va écrire un petit programme en C.&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// Programme stdtest.c&lt;br /&gt;
// On compilera avec cc -o stdtest stdtest.c&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    fprintf(stdout, &amp;quot;Message sur stdout\n&amp;quot;);&lt;br /&gt;
    fprintf(stderr, &amp;quot;Message sur stderr\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Est-ce nécessaire de l&#039;expliquer ? On envoie une ligne sur la sortie standard et une autre sur l&#039;erreur standard.&lt;br /&gt;
&lt;br /&gt;
On compile et on teste:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest&lt;br /&gt;
Message sur stdout&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest &amp;gt; /dev/null&lt;br /&gt;
Message sur stderr&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null&lt;br /&gt;
Message sur stdout&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ici j&#039;introduit le fichier &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;. Quand on y envoie un flux il va.. nulle part.&lt;br /&gt;
&lt;br /&gt;
Si on envoie &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; sur &amp;lt;code&amp;gt;/dev/null&amp;lt;/code&amp;gt;, seul &amp;lt;code&amp;gt;seterr&amp;lt;/code&amp;gt; s&#039;affiche et si on y envoie &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt; seul &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; s&#039;affiche.&lt;br /&gt;
&lt;br /&gt;
Et si on y envoie les deux :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ./stdtest 2&amp;gt; /dev/null &amp;gt; /dev/null&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Il ne se passe rien et c&#039;est bien normal.&lt;br /&gt;
&lt;br /&gt;
Maintenant regardons le fonctionnement de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;. Sur ma machine, &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est en fait un alias vers &amp;lt;code&amp;gt;grep --color=auto&amp;lt;/code&amp;gt;. dans ce mode grep mets en couleur (rouge) la chaine qu&#039;il a trouvé.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep std.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Grep a &amp;quot;touché&amp;quot; stdout et on voit le rouge.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Grep both.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
L&#039;opérateur 2&amp;gt;&amp;amp;1 redirige 2 (stderr vers 1 stdout). le grep lit les deux lignes, les deux sont en rouge.&lt;br /&gt;
&lt;br /&gt;
Logiquement on se dit que 1&amp;gt;&amp;amp;2 devrait rediriger la sortie standard dans la sortie erreur.&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Stderrall.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
Tout est envoyé dans stderr et grep qui est connecté a stdout ne voit rien!&lt;br /&gt;
&lt;br /&gt;
Et le top du top :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Avecflux3.png|sans_cadre]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;gt;&amp;amp;1&amp;lt;/code&amp;gt; : On crée un 3 qui envoie sur 1 (stdout)&lt;br /&gt;
* &amp;lt;code&amp;gt;1&amp;gt;&amp;amp;2&amp;lt;/code&amp;gt; : On a déjà vu ca redirige la sortie standard dans la sortie erreur&lt;br /&gt;
* &amp;lt;code&amp;gt;2&amp;gt;&amp;amp;3&amp;lt;/code&amp;gt; : Redirige la sortie d&#039;erreur vers la sortie &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; qui a été initialisée pour envoyer vers &amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt; avant qu&#039;on la redirige vers &amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
On swappe les flux comme pour swapper le contenu de deux variables, il en faut une troisième.&lt;br /&gt;
&lt;br /&gt;
Selon la représentation habituelle ca ferait:&lt;br /&gt;
[[Fichier:Process-bash010.png.png|sans_cadre|1017x1017px]]&lt;br /&gt;
Où même (vue de près)&lt;br /&gt;
[[Fichier:Swapzoom.png.png|sans_cadre|620x620px]]&lt;br /&gt;
C&#039;est puissant mais est-ce vraiment clair...&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Swapzoom.png.png&amp;diff=2180</id>
		<title>Fichier:Swapzoom.png.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Swapzoom.png.png&amp;diff=2180"/>
		<updated>2026-08-06T15:17:07Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;swapzoom&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash010.png.png&amp;diff=2179</id>
		<title>Fichier:Process-bash010.png.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash010.png.png&amp;diff=2179"/>
		<updated>2026-08-06T15:05:39Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;swap strem&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Avecflux3.png&amp;diff=2178</id>
		<title>Fichier:Avecflux3.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Avecflux3.png&amp;diff=2178"/>
		<updated>2026-08-06T14:51:56Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;flux 3&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Stderrall.png&amp;diff=2177</id>
		<title>Fichier:Stderrall.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Stderrall.png&amp;diff=2177"/>
		<updated>2026-08-06T14:44:35Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;tout&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Grep_both.png&amp;diff=2176</id>
		<title>Fichier:Grep both.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Grep_both.png&amp;diff=2176"/>
		<updated>2026-08-06T14:41:24Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;tout&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Grep_std.png&amp;diff=2175</id>
		<title>Fichier:Grep std.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Grep_std.png&amp;diff=2175"/>
		<updated>2026-08-06T14:39:03Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;grep std&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash009..png&amp;diff=2174</id>
		<title>Fichier:Process-bash009..png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash009..png&amp;diff=2174"/>
		<updated>2026-08-06T14:16:27Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2&amp;gt;&amp;amp;1 | mail&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash008.png&amp;diff=2173</id>
		<title>Fichier:Process-bash008.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash008.png&amp;diff=2173"/>
		<updated>2026-08-06T14:05:01Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2&amp;gt;&amp;amp;1&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash007.png&amp;diff=2172</id>
		<title>Fichier:Process-bash007.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash007.png&amp;diff=2172"/>
		<updated>2026-08-06T12:12:47Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;redirrection stderr vers fichier&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2171</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2171"/>
		<updated>2026-08-06T11:35:06Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Remarque sur l&amp;#039;usage de &amp;quot;-&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
===== = = = = A FAIRE = = = = =====&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2170</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2170"/>
		<updated>2026-08-06T11:34:32Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* redirection entre process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
===== = = = = A FAIRE = = = = =====&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2169</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2169"/>
		<updated>2026-08-05T23:25:25Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : /* Les types de redirections */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== redirection entre process ====&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;SECTION Pour les experts&amp;lt;/big&amp;gt;&#039;&#039;&#039; (qui connaissent [[strace]]). &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Vous êtes débutant passez cette section vous y reviendrez plus tard!&#039;&#039;&#039;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;strace -e openat grep &amp;quot;toto&amp;quot; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Nous donne bien une ligne:&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY|O_NOCTTY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;C&#039;est bien le process &amp;quot;grep&amp;quot; qui ouvre le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Mais si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat toto | strace -e openat grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;pas de lignes d&#039;ouverture de resultat.txt dans grep. C&#039;est cat qui ouvre le ficher!&lt;br /&gt;
&lt;br /&gt;
SI on trace ce que fait cat et pas ce que fait grep:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On récupère bien notre ligne&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
openat(AT_FDCWD, &amp;quot;resultat.txt&amp;quot;, O_RDONLY) = 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
strace -e openat cat &amp;lt; resultat.txt | grep &amp;quot;toto&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On ne voit plus rien car c&#039;est bash qui ouvre le fichier pour l&#039;envoyer a cat (voir plus loin)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;FIN DE SECTION EXPERTS&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
===== = = = = A FAIRE = = = = =====&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2168</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2168"/>
		<updated>2026-08-05T23:10:35Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections des flux standards ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== redirection entre process ===&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;gt;&amp;quot; Pour pas tout casser ====&lt;br /&gt;
La redirection &amp;gt; envoie dans un fichier le contenu de la sortie standard d&#039;un process. Cependant si ce fichier existe il sera écrasé par le contenu en question. Ce n&#039;est pas toujours ce que l&#039;on souhaite!&lt;br /&gt;
&lt;br /&gt;
On veut parfois &amp;quot;ajouter à la fin&amp;quot;. &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
echo &amp;quot;Etat des disques&amp;quot; &amp;gt; status.txt&lt;br /&gt;
df -h &amp;gt;&amp;gt; status.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On crée un fichier contenant la ligne &amp;quot;etat des disques&amp;quot; et on y ajoute le résultat de &amp;lt;code&amp;gt;df -h&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
J&#039;i mon petit script de création de fichier python vide:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# fichier create-py.sh&lt;br /&gt;
echo -n &amp;quot;#!&amp;quot; &amp;gt; $1.py&lt;br /&gt;
which python3 &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo &amp;quot;&amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
echo -n &amp;quot;# &amp;quot; &amp;gt;&amp;gt; $1.py&lt;br /&gt;
date &amp;quot;+created on %Y-%m-%d@%H:%M by $USER&amp;quot; &amp;gt;&amp;gt; test.py&lt;br /&gt;
chmod a+x $1.py&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On l&#039;appelle avec :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;./create-py test&amp;lt;/syntaxhighlight&amp;gt;... et on a un test.py :&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot;&amp;gt;&lt;br /&gt;
#!/usr/bin/python3&lt;br /&gt;
# created on 2026-08-06@01:00 by jpinon&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Correctement configuré pour être lancé directement à la ligne de commande. Il reste plus qu&#039;à....&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;br /&gt;
&lt;br /&gt;
=== Redirection du flux d&#039;erreur ===&lt;br /&gt;
Pour le moment on se traine notre (nos) flux d&#039;erreurs qui vont vers la console. C&#039;est bien car, même quand les sortie standards sont redirigées on peut voir que ça s&#039;est mal passé.&lt;br /&gt;
&lt;br /&gt;
Imaginons que les erreurs suivent le même chemin que la sortie avec:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;imaginons une erreur de compilation (j&#039;ai oublié le int devant le main()):&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cc -S hello.c&lt;br /&gt;
hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int]&lt;br /&gt;
    3 | main(){&lt;br /&gt;
      | ^~~~&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Dans le cas présent ca m&#039;affiche l&#039;erreur et tout s&#039;arrête après &amp;lt;code&amp;gt;cc&amp;lt;/code&amp;gt;. J&#039;aurais mon message et mon ami ne recevra pas de mail.&lt;br /&gt;
&lt;br /&gt;
Si la sortie d&#039;erreur était gérée par le même flux que la sortie standard, je ne m&#039;apercevrais de rien et mon ami recevrait le mail avec le message d&#039;erreur. La loose!&lt;br /&gt;
&lt;br /&gt;
Et bien voila pourquoi la sortie standard est gérée a part.&lt;br /&gt;
&lt;br /&gt;
===== = = = = A FAIRE = = = = =====&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2167</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2167"/>
		<updated>2026-08-05T22:49:08Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;br /&gt;
&lt;br /&gt;
Un exemple typique : un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls rrr&lt;br /&gt;
ls: cannot access &#039;rrr&#039;: No such file or directory&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le premier ls ci dessus envoie sa sortie standard vers l&#039;écran (le flux en bleu sur le schéma). Dans le cas second ls, il s&#039;agit d&#039;une erreur donc vers la sortie d&#039;erreur (flux en rouge).&lt;br /&gt;
&lt;br /&gt;
Il est impossible, pour le moment, de savoir si ce qui est à l&#039;écran a été envoyé vers la sortie standard ou la sortie d&#039;erreur. (sauf le bon sens)&lt;br /&gt;
&lt;br /&gt;
Pour le cas de l&#039;entrée standard l&#039;exemple est plus subtil, on va utiliser grep. grep est un programme assez simple (bon il a plein d&#039;options mais on en parlera pas là) il lit l&#039;entrée standard ligne par ligne et ne l&#039;affiche sur la sortie que si elle comprends un chaine donnée en paramètre.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ grep toto&lt;br /&gt;
Bonjour toi&lt;br /&gt;
Bonjour vous&lt;br /&gt;
Hello toto&lt;br /&gt;
Hello toto&lt;br /&gt;
Ca va toto?&lt;br /&gt;
Ca va toto?&lt;br /&gt;
au revoir toto&lt;br /&gt;
au revoir toto&lt;br /&gt;
salut&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;le shell envoie aussi à l&#039;écran ce que l&#039;on tape au clavier avant de l&#039;envoyer au programme (il appelle ca l&#039;écho).&lt;br /&gt;
&lt;br /&gt;
que se passe t&#039;il dans notre exemple? On entre le ligne &amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;. Le shell l&#039;envoie à l&#039;écran et au process (grep). grep lit la ligne&amp;lt;code&amp;gt;&amp;quot;Bonjour toi&amp;quot;&amp;lt;/code&amp;gt;et vérifie si elle contient la chaine qu&#039;on lui a donné en paramètre &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;. Ce n&#039;est pas le cas, grep ignore la ligne. Il se passe la même chose pour &amp;lt;code&amp;gt;&amp;quot;Bonjour vous&amp;quot;&amp;lt;/code&amp;gt;. En revanche pour &amp;lt;code&amp;gt;&amp;quot;Hello toto&amp;quot;&amp;lt;/code&amp;gt; le shell l&#039;envoie a l&#039;écran (echo) et à grep. Grep voit qu&#039;elle contient bien la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;,&amp;lt;/code&amp;gt; alors elle écrit la ligne sur la sortie standard.&lt;br /&gt;
&lt;br /&gt;
Donc on voit la ligne en double. D&#039;abord l&#039;echo de ce qu&#039;on tape ensuite la sortie de grep.&lt;br /&gt;
&lt;br /&gt;
== Redirections ==&lt;br /&gt;
L&#039;un des concepts les puis puissant du shell unix (linux par la suite) est que ces 3 flux peuvent êtres branchées sur n&#039;importe quoi d&#039;autre (on vient d&#039;effleurer le sujet avec ssh).&lt;br /&gt;
&lt;br /&gt;
=== redirection entre process ===&lt;br /&gt;
c&#039;est la redirection de la sortie d&#039;un process vers l&#039;entrée d&#039;un autre. Ca s&#039;appelle un &#039;pipe&#039; (un tube, un tuyau... ) &lt;br /&gt;
[[Fichier:Process-bash002.png|sans_cadre|916x916px]]&lt;br /&gt;
Pour chainer ainsi deux process on utilise le caractère &amp;quot;pipe&amp;quot; soit &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Il s&#039;agit d&#039;une barre verticale qui semble être un tuyau dans le mauvais sens. Il faut connaitre comment les premières machines affichaient ce caractère : pas &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; mais &amp;lt;code&amp;gt;&amp;quot;¦&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Une barre avec un petit trou pour laisser passer le flux. Ce caractère à été simplifié et maintenant et on ne comprends plus bien.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
$ ls -l | grep toto&lt;br /&gt;
$ ls -l | grep &amp;quot;c&amp;quot;&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La première commande est un bête ls qui donne la liste des fichiers.&lt;br /&gt;
La seconde filtre ces lignes pour n&#039;afficher que les lignes contenant la chaine &amp;lt;code&amp;gt;&amp;quot;toto&amp;quot;&amp;lt;/code&amp;gt;.. c&#039;est à dire aucune.&lt;br /&gt;
La troisième filtre les lignes pour n&#039;afficher que celles contenant &amp;lt;code&amp;gt;&amp;quot;c&amp;quot;&amp;lt;/code&amp;gt; c&#039;est a dire deux d&#039;entres elles.&lt;br /&gt;
&lt;br /&gt;
Attention on parle là de flux de caractères. Les redirections et les process de ces exemples ne &amp;quot;comprennent&amp;quot; pas ce qu&#039;on leur envoie dans les flux.&lt;br /&gt;
si on avait utilisé grep avec &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;:&amp;lt;/code&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l | grep &amp;quot;n&amp;quot;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Aucun fichier ne contient de &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; mais grep traite le flux ligne de texte par ligne de texte. Il trouve des &amp;lt;code&amp;gt;&amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; dans le nom du user et du groupe il affiche la ligne.&lt;br /&gt;
Nous ne sommes pas dans des shell type powershell qui traitent des objets. Ici on traite des flux de caractres est bête et méchants.&lt;br /&gt;
&lt;br /&gt;
=== Les types de redirections ===&lt;br /&gt;
&lt;br /&gt;
==== Fichiers ====&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;gt;&amp;quot; Rediriger la sortie standard vers un fichier ====&lt;br /&gt;
Autant &amp;lt;code&amp;gt;&amp;quot;|&amp;quot;&amp;lt;/code&amp;gt; dirige la sortie d&#039;un processus vers l&#039;entrée d&#039;un autre processus &amp;lt;code&amp;gt;&amp;quot;&amp;gt;&amp;quot;&amp;lt;/code&amp;gt; redirige simplement la sortie standard d&#039;un process vers un fichier disque.&lt;br /&gt;
&lt;br /&gt;
Exemple simple un simple ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ ls -l&lt;br /&gt;
total 44&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;La commande ls envoie la liste des fichier vers la sortie standard. Jusque là on n&#039;a rien fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l &amp;gt; resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Cette commande ne réponds rien et c&#039;est normal. On lui a demandé de rediriger la sortie standard vers un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si on refait un ls.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;$ ls -l&lt;br /&gt;
total 48&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   344 Aug  5 23:21 resultat.txt&amp;lt;/syntaxhighlight&amp;gt;Effectivement on a un nouveau fichier!&lt;br /&gt;
&lt;br /&gt;
SI on regarde ce qu&#039;il i a dedans (cat, vi, nano... chacun sa méthode) mais on y trouve :&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15960 Aug  5 21:48 hello&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    84 Aug  5 21:48 hello.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon   797 Aug  5 21:48 hello.s&lt;br /&gt;
-rwxr-xr-x 1 jpinon jpinon 15968 Aug  5 21:50 helloworld&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon    63 Aug  5 21:50 helloworld.c&lt;br /&gt;
-rw-r--r-- 1 jpinon jpinon     0 Aug  5 23:21 resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;On remarque que &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; est déjà dedans mais avec une taille nulle. Etrange? pas tant que ça et ca nous montre bien comment ça se passe.&lt;br /&gt;
&lt;br /&gt;
Lors de la commande  &amp;lt;code&amp;gt;&amp;quot;ls -l &amp;gt; resultat.txt&amp;quot;&amp;lt;/code&amp;gt;  le shell (bash ici) voit que la sortie de &amp;lt;code&amp;gt;ls&amp;lt;/code&amp;gt; devra aller dans un fichier &amp;lt;code&amp;gt;&amp;quot;resultat.txt&amp;quot;&amp;lt;/code&amp;gt; qu&#039;il s&#039;empresse de créer mais, pour le moment, il est vide. Le shell lance alors le &amp;lt;code&amp;gt;&amp;quot;ls -l&amp;quot;&amp;lt;/code&amp;gt; qui fait la liste des fichiers, dont resultat.txt qui est vide, et l&#039;envoie dans le fichier &amp;quot;resultat.txt&amp;quot; qui se remplis alors. &lt;br /&gt;
&lt;br /&gt;
A la sortie resultat.txt est donc plein mais, quand il a été lut par ls il était vide!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Tout est simple et logique en bash!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;&amp;lt;&amp;quot; rediriger un fichier vers l&#039;entrée standard d&#039;un process. ====&lt;br /&gt;
C&#039;est la partie la moins élégante de la syntaxe je trouve mais bon. On peut utiliser un fichier comme l&#039;entrée d&#039;un process.&lt;br /&gt;
&lt;br /&gt;
C&#039;est assez rarement utilisé parce que&#039;à la fois pas clair et pas très utile. Suivez moi bien:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;affiche le résultat  de l&#039;entrée standard sur la sortie standard. Le truc le plus inutile possible!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ cat&lt;br /&gt;
hello&lt;br /&gt;
hello&lt;br /&gt;
bonjour&lt;br /&gt;
bonjour&lt;br /&gt;
jaquot&lt;br /&gt;
jaquot&lt;br /&gt;
blabla&lt;br /&gt;
blabla&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca répète tout ce qu&#039;on tape jusqu&#039;à la fin du texte (EOF&amp;lt;!-- EOF = End of file (fin du fichier) --&amp;gt; ou &amp;lt;Ctrl&amp;gt; D)&lt;br /&gt;
&lt;br /&gt;
si on voulait lui faire écrire ce qu&#039;il y a dans un fichier on sait qu&#039;il faut faire :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat resultat.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Ca marche mais c&#039;est pas ce que je veux vous montrer. C&#039;est juste le fonctionnement de la commande &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. SI on lui donne un paramètre au lieu de copier l&#039;entrée standard elle prends le paramètre en question, ouvre le fichier disque qui correspond de l&#039;envoie sur la sortie standard. Là c&#039;est le programme &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; qui fait le travail.&lt;br /&gt;
&lt;br /&gt;
Si on fait :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cat &amp;lt; resultat.txt # Attention un &amp;lt; s&#039;est introduit dans cette commande!&amp;lt;/syntaxhighlight&amp;gt;le résultat est exactement le même mais les actions effectuées sont totalement différentes!&lt;br /&gt;
&lt;br /&gt;
Que fait le shell?&lt;br /&gt;
&lt;br /&gt;
* Il ouvre &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; sans paramètres qui va alors lire les lignes une par une sur l&#039;entrée standard et les envoyer sur la sortie standard jusqu&#039;à EOF. Il est bête mais on lui en demande pas plus.&lt;br /&gt;
* Mais le shell vois aussi que l&#039;entrée standard de cat doit être &amp;quot;alimentée&amp;quot;, non pas par le clavier mais par le contenu d&#039;un fichier &amp;quot;resultat.txt&amp;quot;&lt;br /&gt;
* doc cat prends ce qu&#039;il a en entrée (le shell lui envoie le contenu de resultat.txt) et l&#039;envoie sur la sortie standard (ici l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
On pourrait envisager un:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt &amp;gt; resultat1.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;...qui en fait est l&#039;équivalant d&#039;une copie de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat1.txt&amp;lt;/code&amp;gt;.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cp resultat1 resultat2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;aurait fait pareil.&lt;br /&gt;
&lt;br /&gt;
Encore plus pervère&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt; resultat.txt | grep jpinon &amp;gt; resultat2.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Le shell traite comme ça:&lt;br /&gt;
&lt;br /&gt;
* ouverture de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; &amp;quot;tout nu&amp;quot; qui lit sur l&#039;entrée et envoie vers la sortie&lt;br /&gt;
* son entrée est connectée par shell sur le fichier &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt;. Ok, donc cat ne le sait pas mais il lit les lignes de &amp;lt;code&amp;gt;resultat.txt&amp;lt;/code&amp;gt; une par une (c&#039;est le shell qui les lui envoie).&lt;br /&gt;
* &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt; ecrit vers sa sortie standars mais le shell la redirrige vers &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; est presque aussi bête que &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;. Il lit des lignes sur son entrée standard et les sort sur la sur la sortie standard pour peu que la ligne contienne la chaine en paramètre&lt;br /&gt;
* mais le shell est malin, il lui envoie sur son entrée standard la sortie de &amp;lt;code&amp;gt;cat&amp;lt;/code&amp;gt;.&lt;br /&gt;
* a la fin le shell détourne la sortie de &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; vers &amp;lt;code&amp;gt;resultat2.txt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tout ca se résume dans :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash004.png|sans_cadre|914x914px]]&lt;br /&gt;
&lt;br /&gt;
==== Remarque sur l&#039;usage de &amp;quot;-&amp;quot; ====&lt;br /&gt;
Quelquefois il est indispensable de donner un fichier à une commande. dans ce cas là on peut remplacer ne nom du fichier par &amp;lt;code&amp;gt;&amp;quot;-&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Par exemple :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat -&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;est équivalant à:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;bon pas très utile. Mais pensons au compilateur cc. une option est de lui demander de juste s&#039;arreter au code assembleur mais pas d&#039;aller jusqu&#039;au code machine.&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -S hello.c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;va, par défaut nous sortir un fichier hello.s qui contient le code assembleur. Imaginons que l&#039;on veuille avoir ce code assembleur pour l&#039;envoyer à un ami mais on le voudrait &amp;quot;gzippé&amp;quot;. Problème cc sait sortir dans un fichier texte, on peut lui donner le nom du fichier de sortie par l&#039;option &amp;quot;-o fichier.s&amp;quot; mais il ne sait pas zipper.&lt;br /&gt;
&lt;br /&gt;
On porait faire ça en deux commandes :&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o code.s -S hello.c&lt;br /&gt;
gzip code.s&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;en sortie on aura un fichier code.s.gz tres bien mais on a appris a faire des redirections! Alors on en fait!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;cc -o - -S hello.c | gzip &amp;gt; code.s.gz&amp;lt;/syntaxhighlight&amp;gt;C&#039;est pas beau! &lt;br /&gt;
&lt;br /&gt;
Avec un beau dessin :&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash005.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
On pourrait même l&#039;envoyer directement à notre amis. Ce fichier code.s.gz j&#039;en ai pas besoin moi!&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cc -o - -S hello.c | gzip | mail -s &amp;quot;le code assembleur de hello.c&amp;quot; monami@gmail.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[Fichier:Process-bash006.png|sans_cadre|916x916px]]&lt;br /&gt;
&lt;br /&gt;
Bon comme ça ca parait un peu inutile mais imaginez une tâche [[cron]] qui lance, tous les jours à 4h le matin la commande suivante:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
df -h | mail -s &amp;quot;Etat des disques&amp;quot; moi@mondomaine.fr&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;Et oui! tous les matin j&#039;aurais l&#039;état de remplissage des disque de ma machine dans mes mails. On pourrait améliorer avec un &amp;lt;code&amp;gt;grep&amp;lt;/code&amp;gt; entre &amp;lt;code&amp;gt;df&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt; pour ne mentionner que les disques qui posent un problème.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash006.png&amp;diff=2166</id>
		<title>Fichier:Process-bash006.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash006.png&amp;diff=2166"/>
		<updated>2026-08-05T22:43:24Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;send mail&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash005.png&amp;diff=2165</id>
		<title>Fichier:Process-bash005.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash005.png&amp;diff=2165"/>
		<updated>2026-08-05T22:35:13Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;compile en assembleur puis gzippe&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash004.png&amp;diff=2164</id>
		<title>Fichier:Process-bash004.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash004.png&amp;diff=2164"/>
		<updated>2026-08-05T22:13:42Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;file &amp;gt; cat | grep &amp;gt; file&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash002.png&amp;diff=2163</id>
		<title>Fichier:Process-bash002.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash002.png&amp;diff=2163"/>
		<updated>2026-08-05T20:40:40Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;redirection de base&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2162</id>
		<title>Redirections bash (et en bourne shell en géneral)</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Redirections_bash_(et_en_bourne_shell_en_g%C3%A9neral)&amp;diff=2162"/>
		<updated>2026-08-05T20:26:48Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Les redirections c&#039;est la base des batches !&lt;br /&gt;
&lt;br /&gt;
== Echanges standard entre un process et son environnement. ==&lt;br /&gt;
Un process (process ou processus en français j&#039;utiliserais les deux mots indéférament) est une suite d&#039;instructions qui sont exécutées par le système les unes après les autres. Il n&#039;y a pas de notion de parallélisme à ce niveau.&lt;br /&gt;
&lt;br /&gt;
A sa création un process possède trois &amp;quot;flux&amp;quot; standard. &lt;br /&gt;
&lt;br /&gt;
* Une entrée&lt;br /&gt;
* deux sorties (normal et erreurs)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash000.png|sans_cadre|492x492px]]&lt;br /&gt;
&lt;br /&gt;
Si rien n&#039;est précisé l&#039;entrée standard est le clavier et les deux sorties (standard et erreur sont l&#039;écran)&lt;br /&gt;
&lt;br /&gt;
[[Fichier:Process-bash001.png|sans_cadre|750x750px]]&lt;br /&gt;
&lt;br /&gt;
Déjà, de façon, transparente ce clavier et cet écrans sont transformés dans le cas du ssh (ou du telnet). Dans ce cas les entrées sorties sont redirigées vers le réseau lui même ver le client ssh qui... finalement l&#039;envoie à un clavier et un écran même si ce n&#039;est pas celui de ma machine sur laquelle tourne le processus.&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
	<entry>
		<id>https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash000.png&amp;diff=2161</id>
		<title>Fichier:Process-bash000.png</title>
		<link rel="alternate" type="text/html" href="https://knowledge.pinon-hebert.fr/mediawiki/index.php?title=Fichier:Process-bash000.png&amp;diff=2161"/>
		<updated>2026-08-05T20:26:36Z</updated>

		<summary type="html">&lt;p&gt;Jpinon : Jpinon a téléversé une nouvelle version de Fichier:Process-bash000.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;process la base des flux&lt;/div&gt;</summary>
		<author><name>Jpinon</name></author>
	</entry>
</feed>