Tiens je n’avais jamais pensé à voir si read avait des options… Ça règle le pbm définitivement ça.
Dans ce cas, que veux dire le ‘-n1’ de read ?
Lire un caractère (-n2 lire 2 caractères).
Pour avoir plus d’infos sur les commandes biltin, il faut utiliser la commande help :
@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.
Bof, ça prend trois secondes, moins en tout cas que de chercher l’optionquivabien
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.
Qu’est ce que tu veux dire par ça ne marche pas avec apt-get upgrade?
La commande sur un script seul, sans “upgrade” 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 “apt-get upgrade”.
Alors, je ne sais pas si c’est possible mais avec le script d’essai suivant, ça ne fonctionne pas, que je place le ‘read -n1’ 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 'upgrade’
Arrivé à ‘listbugs’ (auquel je tiens), il énumère les bogues puis demande le choix.
Je tape ‘p’ pour l’épinglage, ensuite les demandes de confirmation classique dont la dernière où je réponds 'N’
Là apt-get upgrade sort avec erreur 10.
Si la commande read -n1 avait été prise en compte, sitôt tapé le ‘p’, j’aurais dû avoir une réponse “c’est bon” … ce qui n’est pas le cas.
Si tu as une idée ?
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=“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” ?
Je te renvoie à la doc : linux-kheops.com/doc/man/man … ifo.3.html
Je serais plus causant demain avec un clavier que je maîtrise mieux
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
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]
Merci, ça c’est de l’explication
Je ne vais pas trop avoir de temps aujourd’hui car ==> dentiste
mais je testerai rapidement et je donnerai le résultat ici.
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.
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à.
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.
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 ?
Dès que j’ai du temps, je met tout ça un peu en forme dans une preuve de concept.
Ce n’est pas pressé, merci
[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 :
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 .
Le man de sudo donne cet exemple (pas idiot) :
Donc tu devrais pouvoir faire ça :