# 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:** 20\
**Page:** 1

<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:10 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/1 "2016-02-21T11:10:40Z")

</div>

## Je ne sais pas expliciter les questions que je veux poser 😕 Je voudrais compléter mon script sur les sauvegardes par les commandes que je fais systématiquement par la suite : «&nbsp;updater&nbsp;», «&nbsp;upgrader&nbsp;», puis mettre à jour ‹&nbsp;surveillance&nbsp;› et ‹&nbsp;rkhunter&nbsp;›.

## Pour sudo apt-get updade pas de problème, facile à ajouter Pour les mises à jour de surveillance et de rkhunter une fois l’«&nbsp;upgradation&nbsp;» faite, pas de problèmes non plus : sudo dpkg-reconfigure surveillance && sudo rkhunter --propupd Avec les éventuelles acceptation o/\*

Le PROBLÈME se situe au milieu :  
sudo apt-get upgrade  
J’emploi apt-listbugs et j’épingle systématiquement les paquets qui sont reconnus ‹&nbsp;bogués&nbsp;›.  
Quand il n’y en a aucun, pas de problème, l’«&nbsp;upgradation&nbsp;» se fait tranquillement et le script continue une fois accepté le choix classique :  
«&nbsp;Etes-vous certains de vouloir installer les paquets ci-dessus ? [Y/n/?—]&nbsp;»  
Je tape sur ‹&nbsp;entrée&nbsp;› et ça continue.  
Il en va tout autrement quand il y a des bogues car mon choix : ‹&nbsp;p&nbsp;› pour les épingler, conduit à une demande de confirmation puis à un second choix par défaut : ‹&nbsp;N&nbsp;›, logique puisqu’on ne veut pas continuer.  
Là, il y a sortie brutale du script.

Ma question (on y vient) :  
Bash gère-t-il les appuis sur une touche, en l’occurrence la touche ‹&nbsp;p&nbsp;› et la touche ‹&nbsp;Entrée&nbsp;› ?  
Si oui, je pourrais faire une condition simple à chaque appui et j’aimerais un exemple.  
Sinon, voyez-vous une autre façon de contourner ce problème?  
Merci d’avoir pris la patience de déchiffrer mon blabla ![: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:10 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/2 "2016-02-21T11:10:56Z")

</div>

39 membres qui ont lu et aucune réponse, j’en déduis que ce que je demande est impossible 😮

---

<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:10 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/3 "2016-02-21T11:10:57Z")

</div>

Tu fais bien de « uper ». Si c’est possible.

Le programme lis ta réponse sur son entrée standard donc :

```auto

```

pour lui donner un « p » et

```auto

```

pour entrée.

---

<div class="post-metadata">

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

</div>

hello  
je suggère de mettre dans truc et astuce et le wiki 🙂 sa peux aider pas mal de débutant (comme moi 😃 )

---

<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:10 UTC](https://www.debian-fr.org/t/en-bash-comment-faire/52276/5 "2016-02-21T11:10:59Z")

</div>

[quote=“MisterFreez”]Tu fais bien de « uper ». Si c’est possible.

Le programme lis ta réponse sur son entrée standard donc :

```auto

```

pour lui donner un « p » et

```auto

```

pour entrée.[/quote]  
Super !  
Je vais essayer de coder ça demain et je présenterai mon travail au Prof 😃  
Edit :  
J’ai quand même besoin d’un exemple simple car je ne pige pas ‘prg’ ?  
Je ne suis pas sûr que tu aies compris ma requête :  
Quand je fais “apt-get upgrade”, à plusieurs moments, il me demande confirmation et c’est moi qui tape sur “entrée”.  
Ce n’est plus dans le script proprement dit mais dans la commande "apt-get upgrade"  
Ce que je voudrais faire, c’est :  
si je tape sur “entree”, continue  
si je tape sur “p”, obéis à cette commande (donc continue)  
si je tape sur “entree” sort proprement

Je dis 'tape sur “entree” mais en fait, c’est la réponse par défaut et la dernière est [N/?/…]

---

<div class="post-metadata">

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

</div>

Salut,  
Ton problème, avec apt-listbugs c’est que de toute façon, le script va s’arrêter brutalement par sortie de apt-get.

Quant tu marques un paquet:  
p + entrée \> oui j’épingle  
y (+ entrée ?) \> êtes-vous sur… ?  
n (+ entrée ?) \> voulez-vous installer le paquet (non) et sortie sur une erreur de apt-get

Il faut alors relancer l’upgrade.  
Il faudrait donc prévoir de reprendre le script à l’endroit ou apt-get upgrade s’exécute.

Pour rkhunter, tu peux le faire automatiquement à chaque upgrade avec une commande placée dans /etc/apt/apt.conf.d  
Edit: Idem pour surveillance.

Edit: En marquant systématiquement avec apt-listbugs tu bloques des paquets qui ne sont plus bogués ou bogués pour des architectures qui ne sont pas la tienne, c’est dommage! ![:083](https://www.debian-fr.org/uploads/default/original/1X/d14bbab5e0eb9167fe7ed1d009c5a9b723425957.gif "yeux-ciel")

---

<div class="post-metadata">

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

</div>

Bonjour,

Ce ne serait pas plus simple avec un utilitaire comme expect?

`Description : Automates interactive applications
 Expect is a tool for automating interactive applications according to a script. Following the
 script, Expect knows what can be expected from a program and what the correct response should be.
 Expect is also useful for testing these same applications. And by adding Tk, you can also wrap
 interactive applications in X11 GUIs. An interpreted language provides branching and high-level
 control structures to direct the dialogue. In addition, the user can take control and interact
 directly when desired, afterward returning control to the script.
Site : http://sourceforge.net/projects/expect/
`

---

<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/8 "2016-02-21T11:11:02Z")

</div>

Ça dépend de ce qu’on veut faire, (je n’utilise pas apt-listbug), ça dépend du niveau de complexité des interactions (expect gère aussi les terminaux virtuels ce qui permet par exemple de rentrer son mot de passe ssh automatiquement).

---

<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/9 "2016-02-21T11:11:03Z")

</div>

> [@MisterFreez](#):
>
> Ça dépend de ce qu’on veut faire, (je n’utilise pas apt-listbug), ça dépend du niveau de complexité des interactions (expect gère aussi les terminaux virtuels ce qui permet par exemple de rentrer son mot de passe ssh automatiquement).

Michel, le mieux est que tu me donnes une ligne de commande qui puisse faire ce qui suit et ensuite, je ferai les essai en fonction de la réponse :  
soit un programme bash :  
#!/bin/bash  
sudo apt-get upgrade  
if [je tape sur la touche p]  
then  
echo ‹&nbsp;la réponse est bonne&nbsp;›  
fi  
Je veux seulement que tu me rédige la ligne en bleu.

---

<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/10 "2016-02-21T11:11:05Z")

</div>

`read
if ["$REPLY" == 'p'] ; then`

---

<div class="post-metadata">

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

</div>

C’est plus compliqué, il te faut une routine qui

1. Impose le traitement d’une ligne sans attendre le retour chariot

2. Un truc qui te renvoit le caractère tapé.

3. se fait par  
stty -icanon

4. se fait par un petit programme C genre celui là (que j’appele getc.c

[code]#include \<stdio.h\>

main ()  
{  
printf("%c",getchar());  
}

[/code]  
gcc -o getc getc.c

Ton code devient

`stty -icanon
if [`getc` = "Y"] ; then
echo "Y mec"
else
echo "ah ben non"
fi`

---

<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/12 "2016-02-21T11:11:06Z")

</div>

À le problème c’est de ne pas bufferiser la lecture de l’entrée standard ?

`read -n1
if ["${REPLY}" == 'p'] ; then
`  
devrait faire l’affaire 🙂

---

<div class="post-metadata">

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

</div>

Tiens je n’avais jamais pensé à voir si read avait des options… Ça règle le pbm définitivement ça.

---

<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/14 "2016-02-21T11:11:07Z")

</div>

Dans ce cas, que veux dire le ‘-n1’ de read ?

---

<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/15 "2016-02-21T11:11:07Z")

</div>

Lire un caractère (-n2 lire 2 caractères).  
Pour avoir plus d’infos sur les commandes biltin, il faut utiliser la commande help :

```auto

```

@fran.b \> Moi non plus j’ai découvert cette option tout à l’heure. Je trouvais dommage d’avoir à utiliser du c (ou tout autre langage) pour quelque chose d’aussi simple. 🙂

---

<div class="post-metadata">

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

</div>

Bof, ça prend trois secondes, moins en tout cas que de chercher l’optionquivabien

---

<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/17 "2016-02-21T11:11:18Z")

</div>

Bon, ça ne fonctionne pas à l’intérieur de la commande apt-get upgrade.  
Les tests sont fait après.  
Pas grave, j’ai fait un petit script complémentaire pour upgrade et le reste des petits contrôle que j’effectue à la suite et ce n’est pas beaucoup plus long.  
Merci à tous.

---

<div class="post-metadata">

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

</div>

Qu’est ce que tu veux dire par ça ne marche pas avec apt-get upgrade?

---

<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/19 "2016-02-21T11:11:25Z")

</div>

> [@fran.b](#):
>
> Qu’est ce que tu veux dire par ça ne marche pas avec apt-get upgrade?

La commande sur un script seul, sans «&nbsp;upgrade&nbsp;» fonctionne et c’est normal mais en l’occurrence, le test d’appui sur une touche doit être effectué ni avant, ni après mais au milieu de la commande «&nbsp;apt-get upgrade&nbsp;».  
Alors, je ne sais pas si c’est possible mais avec le script d’essai suivant, ça ne fonctionne pas, que je place le ‹&nbsp;read -n1&nbsp;› avant ou comme dessous, après upgrade..

`#!/bin/bash
sudo apt-get upgrade
read -n1
if ["${REPLY}" == 'p'] ; then
echo "c'est bon"
fi
`  
Quand je lance ce script, tout se passe normalement au niveau de ‹&nbsp;upgrade&nbsp;›  
Arrivé à ‹&nbsp;listbugs&nbsp;› (auquel je tiens), il énumère les bogues puis demande le choix.  
Je tape ‹&nbsp;p&nbsp;› pour l’épinglage, ensuite les demandes de confirmation classique dont la dernière où je réponds ‹&nbsp;N&nbsp;›  
Là apt-get upgrade sort avec erreur 10.

Si la commande read -n1 avait été prise en compte, sitôt tapé le ‹&nbsp;p&nbsp;›, j’aurais dû avoir une réponse «&nbsp;c’est bon&nbsp;» … ce qui n’est pas le cas.

Si tu as une idée ?

---

<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/20 "2016-02-21T11:11:31Z")

</div>

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

[Page suivante](https://www.debian-fr.org/t/en-bash-comment-faire/52276.md?page=2)
