# En 'bash', comment faire

**URL:** <https://www.debian-fr.org/t/en-bash-comment-faire/52276>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 11:10 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276 "2016-02-21T11:10:40Z")\
**Posts on this page:** 18\
**Page:** 2

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/21 "2016-02-21T11:11:31Z")

</div>

[quote=“MisterFreez”]Tu crée un fifo  
Tu donne ce fifo en entrée d’apt-get  
Tu fais ton read etc  
Tu écris dans le fifo pour piloter apt-get[/quote]  
Heu ! c’est quoi un “fifo” ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/22 "2016-02-21T11:11:32Z")

</div>

Je te renvoie à la doc : [linux-kheops.com/doc/man/man … ifo.3.html](http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/mkfifo.3.html)  
Je serais plus causant demain avec un clavier que je maîtrise mieux 🙂

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/23 "2016-02-21T11:11:32Z")

</div>

OK, prends ton temps car de ce que j’ai lu dans le lien, je ne comprends strictement rien.  
Sois gentil de m’expliquer par un exemple.  
Merci ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/24 "2016-02-21T11:11:34Z")

</div>

```auto
C'est rediriger la sortie standard de "echo" vers l'entrée standard de "mon_programme" mon programme au moyen d'un pipe.
Un pipe d'un point de vu fonctionnel c'est un tampon fifo (first in, first ou), c'est à dire que si tu écris "coucou" puis "hello" dans un pipe, le programme qui le lie va lire "coucou" puis "hello" (il existe des fonctionnement différents).

La commande mkfifo permet de créer comme un pipe mais nommé, il apparaît dans le système de fichier. Tu peut alors remplacer la commande si dessus par :
[code]mkfifo monFIFO
echo "coucou" >> monFIFO
mon_programme < monFIFO[/code]

Dans ton cas tu devrais pouvoir faire ça :
[code]#!/bin/bash
FIFO="monFIFO"
mkfifo "${FIFO}"
sudo apt-get upgrade < "${FIFO}" &
# ici tu va avoir un problème que je te laisse résoudre (pas le temps de regarder plus en détail)
# il faut que sudo exécute bien la commande : « apt-get upgrade < "${FIFO}" & » et pas simplement « apt-get upgrade »
read -n1
if ["${REPLY}" == 'p'] ; then
    echo 'p' >> "${FIFO}"
    echo "c'est bon"
fi[/code]
```

C’est rediriger la sortie standard de “echo” vers l’entrée standard de “mon\_programme” mon programme au moyen d’un pipe.  
Un pipe d’un point de vu fonctionnel c’est un tampon fifo (first in, first ou), c’est à dire que si tu écris “coucou” puis “hello” dans un pipe, le programme qui le lie va lire “coucou” puis “hello” (il existe des fonctionnement différents).

La commande mkfifo permet de créer comme un pipe mais nommé, il apparaît dans le système de fichier. Tu peut alors remplacer la commande si dessus par :

`mkfifo monFIFO
echo "coucou" >> monFIFO
mon_programme < monFIFO`

Dans ton cas tu devrais pouvoir faire ça :

[code]#!/bin/bash  
FIFO="monFIFO"  
mkfifo "${FIFO}"  
sudo apt-get upgrade \< “${FIFO}” &

# ici tu va avoir un problème que je te laisse résoudre (pas le temps de regarder plus en détail)

# il faut que sudo exécute bien la commande : « apt-get upgrade \< “${FIFO}” & » et pas simplement « apt-get upgrade »

read -n1  
if [“${REPLY}” == ‘p’] ; then  
echo ‘p’ \>\> "${FIFO}"  
echo "c’est bon"  
fi[/code]

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/25 "2016-02-21T11:11:35Z")

</div>

Merci, ça c’est de l’explication ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")  
Je ne vais pas trop avoir de temps aujourd’hui car ==\> dentiste ![:005](https://www.debian-fr.org/uploads/default/original/1X/cdd45e7dd754015ac5291329b843a2851a0d4fe8.gif "chaud")  
mais je testerai rapidement et je donnerai le résultat ici.  
 ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/26 "2016-02-21T11:11:45Z")

</div>

J’ai commencé un test ce soir avec ce script d’essai : fifo

[code]#!/bin/bash

# pour vider les anciens ‘epingles’

sudo sed -i~ ‘/^Explanation:/,$d’ /etc/apt/preferences  
sudo tail -30 /etc/apt/preferences  
sleep 2

# pour supprimer le fichier ‘monFIFO’ créé précédemment

sudo rm -f /home/ricardo/monFIFO

sudo apt-get update

FIFO="monFIFO"  
mkfifo "${FIFO}"  
echo  
echo "TEST mkfifo est passe"  
echo  
sleep 2  
sudo apt-get upgrade \< “${FIFO}” &

# ici tu va avoir un problème que je te laisse résoudre (pas le temps de regarder plus en détail)

# il faut que sudo exécute bien la commande : « apt-get upgrade \< “${FIFO}” & » et pas simplement « apt-get upgrade »

read -n1  
if [“${REPLY}” == ‘p’] ; then  
echo ‘p’ \>\> "${FIFO}"  
echo "c’est bon"  
fi[/code]  
Ça bloque après  
echo "TEST mkfifo est passe"  
echo  
sleep 2

même upgrade seul ne se fait pas.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/27 "2016-02-21T11:11:47Z")

</div>

C’est normal. Sudo te demande un mot de passe mais comme tu l’a lancé en arrière plan il n’a pas la main.  
Je préfère utiliser su dans ces cas là.

```auto

```

Mais du coup il faut entrer le mot de passe root.

Avec sudo je ne sais pas trop comment faire il faut faire des tests. 🙂

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/28 "2016-02-21T11:11:52Z")

</div>

`bash: : Aucun fichier ou dossier de ce type
`  
Il arrive au même endroit mais ne trouve pas ‘quel fichier’ ?  
Je suppose que c’est 'monFIFO’  
Si oui, je le vois (0 oct) dans ~/  
Il y a une histoire de chemin ?  
il faudrait ptet que je lance la commande directement en tant que root au départ ?

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/29 "2016-02-21T11:11:53Z")

</div>

Dès que j’ai du temps, je met tout ça un peu en forme dans une preuve de concept.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/30 "2016-02-21T11:11:54Z")

</div>

Ce n’est pas pressé, merci ![:006](https://www.debian-fr.org/uploads/default/original/1X/924eb3db8bedad6a0d333b02031d3c6a9af9d9c5.gif "salut")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/31 "2016-02-21T11:11:59Z")

</div>

[code]#!/bin/bash

TMPDIR=$(mktemp -d)  
FIFO="${TMPDIR}/monFIFO"

mkfifo “${FIFO}”

cat -n \< “${FIFO}” &  
echo 'On va attendre 1s’  
sleep 1  
echo 'Puis on écris dans le fifo’  
echo -n 'écrivez quelque chose : '  
read  
echo “${REPLY}” \> “${FIFO}”

rm -rf “${TMPDIR}”[/code]  
Mon premier exemple (il ne gère pas sudo c’est juste pour illustrer l’utilisation du fifo).  
[ul]  
[li]On crée le fifo[/li]  
[li]on lance cat en lui donnant le fifo à manger (l’option -n permet de numéroter le lignes ce qui permet de bien différencier qui écris quoi sur le terminal)[/li]  
[li]On attend un peu pour le style[/li]  
[li]On lit une entrée au clavier, on envoie ce qu’on viens de lire dans le fifo[/li]  
[li]Ça ressort de l’autre coté et cat nous affiche ce que l’on viens d’écrire[/li][/ul]

Du coup pour ton cas à toi, il suffit de remplacer la commande :

```auto

```

par l’upgrade qui va bien (et qui se lance en arrière plan) et de faire un peu de vérification avant d’écrire dans le FIFO (mais il faut toujours y écrire 🙂.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/32 "2016-02-21T11:11:59Z")

</div>

Le man de sudo donne cet exemple (pas idiot) :

```auto

```

Donc tu devrais pouvoir faire ça :

```auto

```

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:11 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/33 "2016-02-21T11:11:59Z")

</div>

Du coup pour ton script de tout en haut :

[code]#!/bin/bash

# pour vider les anciens ‘epingles’

sudo sed -i~ ‘/^Explanation:/,$d’ /etc/apt/preferences  
sudo tail -30 /etc/apt/preferences  
sleep 2

# Je met ma gestion des FIFO parce que je l’aime bien

TMPDIR="$(mktemp -d)“  
FIFO=”${TMPDIR}/monFIFO"

mkfifo "${FIFO}"  
echo  
echo "TEST mkfifo est passe"  
echo  
sleep 2  
sudo sh -c “apt-get upgrade \< ${FIFO} &”

read -n1  
if [“${REPLY}” == ‘p’] ; then  
echo ‘p’ \> "${FIFO}"  
echo "c’est bon"  
else  
echo \> "${FIFO}"  
fi

rm -rf “${TMPDIR}”[/code]

Ça par contre je ne l’ai pas testé, je te laisse le soin de le faire 🙂

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:12 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/34 "2016-02-21T11:12:00Z")

</div>

Test :  
J’ai fait un copié/collé de ta proposition mais la réaction attendue ne vient pas.  
J’arrive à  
TEST mkfifo est passe  
et là : ça bloque  
au bout de 10 sec , pour tester, je tape ‹&nbsp;p&nbsp;›  
il repart pour arriver à  
pc’est bon (le ‹&nbsp;p&nbsp;› que j’ai entré suivi de ‹&nbsp;c’est bon&nbsp;›)  
puis, dans la foulée  
Lecture des listes de paquets… Fait  
Construction de l’arbre des dépendances  
…  
pour arriver à :  
Les paquets suivants seront mis à jour :  
blabla  
Souhaitez-vous continuer [O/n] ?  
je tape sur «&nbsp;entree&nbsp;»  
Annulation.  
retour à l’invite  
ricardo@sid-sda8:~$  
Le Oui n’a pas été pris en compte pour continuer upgrade ![:017](https://www.debian-fr.org/uploads/default/original/1X/7bbea83f89515ab7c7a738dddb86c4d4f140bd13.gif "reflechit")

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:12 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/35 "2016-02-21T11:12:04Z")

</div>

En fait, il attend une réponse après 'sudo sh -c "apt-get upgrade \< ${FIFO} &“  
J’ai refait le test et j’ai tapé sur 'entree”. Là, upgrade a été jusqu’à la fin car il n’y avait pas de paquets à épingler.  
Donc, à mon avis, il faut impérativement taper “entree” pour que upgrade commence. Reste à savoir si, arrivé à une demande de listbugs où il faudra taper ‘p’, il le prendra en compte.  
Pour le tester, je peux faire un dist-upgrade à la place car là, il y a toujours des ‘pinnages’ à faire. Seulement, je ne tiens pas à ce que ça aboutisse. Comment je peux faire pour stopper la chose au cas où le ‘p’ de répondrait pas ???

[quote]#!/bin/bash

# pour vider les anciens ‘epingles’

sudo sed -i~ ‘/^Explanation:/,$d’ /etc/apt/preferences  
sudo tail -30 /etc/apt/preferences  
sleep 2

# Je met ma gestion des FIFO parce que je l’aime bien

TMPDIR="$(mktemp -d)“  
FIFO=”${TMPDIR}/monFIFO"

mkfifo "${FIFO}"  
echo  
echo "TEST mkfifo est passe"  
echo  
sleep 2  
sudo sh -c “apt-get upgrade \< ${FIFO} &”  
# C’EST ICI QU’IL ATTEND UNE ENTREE  
read -n1  
if [“${REPLY}” == ‘p’] ; then  
echo ‘p’ \> "${FIFO}"  
echo "c’est bon"  
else  
echo \> "${FIFO}"  
fi[/quote]

---

<div class="post-metadata">

**Author:** ![tukuyomi](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/73ab20/32.png) [@tukuyomi](https://www.debian-fr.org/u/tukuyomi)\
**Post date:** [Février 21, 2016, 11:12 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/36 "2016-02-21T11:12:15Z")

</div>

(N’utilisant pas listbugs, je peux avoir loupé quelque chose, auquel cas, ne pas trop tenir compte de ce post ^^")

Je comprends pas trop l’usage de mkfifo dans ce script; pourquoi ne pas utiliser un here-document?  
Exemple de code:

[code]#!/bin/sh

[…]

apt-get upgrade \<\< EOF  
\r  
EOF

[…]

[/code]

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 11:12 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/37 "2016-02-21T11:12:17Z")

</div>

Que je sache, mais je ne suis pas un spécialiste, tu ne peux pas écrire de code dans ce type de document. Si j’ai bien compris ce que cherche à faire ricardo, il veut exécuter apt-get et vérifier ce que l’utilisateur entre au clavier avant de laisser apte finir son boulot.

---

<div class="post-metadata">

**Author:** ![ricardo](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ricardo/32/3864_2.png) [@ricardo](https://www.debian-fr.org/u/ricardo)\
**Post date:** [Février 21, 2016, 11:12 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/38 "2016-02-21T11:12:19Z")

</div>

Oui, je laisse tomber car j’ai tenté toutes les possibilités et ça ne colle pas, il faudrait rentrer dans le script de apt-litbugs (en ruby ?)mais ça ne vaut pas le coup.

[Page précédente](https://www.debian-fr.org/t/en-bash-comment-faire/52276.md?page=1)
