#1 Le 10/07/2013, à 01:35
- fnux
[Résolu] Est-ce possible en bash ?
Bonjour tout le monde,
Je pose ce problème qui va paraître curieux à certains mais dont je ne sais même pas s'il existe une solution.
Voici le contexte :
J'écris un script (bash ou sh) interactif (donc qui pose des questions et... qui attend des réponses).
J'aimerai que ce script enregistre tous les dialogues générés par ce script (les "echo", "read" et les résultats des commandes) dans un fichier .log
Or bien évidemment si je redirige le script vers un fichier, je perds l'interactivité !
Ma question est donc : y a-t-il un moyen d'avoir simultanément l'affichage des dialogues dans le terminal et leurs copies dans un fichier ?
Ca peut paraître simple, mais je ne vois pas comment faire, voir si c'est même possible.
Exemple concret : un petit script d'installation de nodejs.
#!/bin/sh
# name: install_nodejs.sh
#
echo "\nHello $USER\n"
echo -n "Do you want to download nodejs: (Y/n) [Default No]? "; read -p "" GETNODE
case $GETNODE in
'Y'|'y')
echo "\nDownloading nodejs...\n"; wget -O node-v0.8.25.tar.gz http://nodejs.org/dist/v0.8.25/node-v0.8.25.tar.gz;;
*)
echo "\nGoodbye."; exit;;
esac
case $GETNODE in
'Y'|'y')
echo -n "Do you want to install nodejs right now: (Y/n) [Default No]? "; read -p "" INSTALLNODE;;
esac
if [ "$INSTALLNODE" = "Y" ] || [ "$INSTALLNODE" = "y" ]
then
echo "\nPlease be patient since the install can last up to 10 minutes.\n"
sleep 3
tar -xzf node-v0.8.25.tar.gz
cd node-v0.8.25
./configure
make clean
make
echo "\nLet the CPU cool down a little bit...\n"
sleep 45
sudo make install
cd ..
echo "\nThe installation is done.\nGoodbye."
else
echo "\nYou can install nodejs later using the following commands:\n"
echo "tar -xzf node-v0.8.25.tar.gz"
echo "cd nodejs-v0.8.25"
echo "./configure"
echo "make clean"
echo "make"
echo "sudo make install"
echo "cd ..\n"
echo "Goodbye."
fi
Si je lance le script normalement par la commande "./install_node.js", alors j'ai dans la console :
fnux@VM-precise-64 ~ $ ./test-node.sh
Hello fnux
Do you want to download nodejs: (Y/n) [Default No]?
Et là, je peux répondre par Y (ou y) pour lancer le téléchargement et par n'importe quoi d'autre pour sortir du script et idem pour la seconde question si j'ai répondu "Y" (ou "y") à la première question.
Mais si je lance le script en redirigeant la sortie vers nodejs.lg par la commande "./install_node.js > nodejs.log" alors même la première question n'apparait pas (logique).
Comme je sais ce qu'il se passe, si je répond par Y (ou par y) à la première question et non à la seconde (qui elle non plus ne s'affiche pas à la fin du téléchargement - normal), alors j'ai dans la console :
fnux@VM-precise-64 ~ $ ./test-node.sh > node.log
Y
--2013-07-09 19:45:01-- http://nodejs.org/dist/v0.8.25/node-v0.8.25.tar.gz
Resolving nodejs.org (nodejs.org)... 165.225.133.150
Connecting to nodejs.org (nodejs.org)|165.225.133.150|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12850173 (12M) [application/octet-stream]
Saving to: `node-v0.8.25.tar.gz'
100%[======================================>] 12,850,173 86.4K/s in 1m 57s
2013-07-09 19:46:59 (108 KB/s) - `node-v0.8.25.tar.gz' saved [12850173/12850173]
N
fnux@VM-precise-64 ~ $
Et le fichier nodejs.log est celui ci :
Hello fnux
Do you want to download nodejs: (Y/n) [Default No]?
Downloading nodejs...
Do you want to install nodejs right now: (Y/n) [Default No]?
You can install nodejs later using the following commands:
tar -xzf node-v0.8.25.tar.gz
cd nodejs-v0.8.25
./configure
make clean
make
sudo make install
cd ..
Goodbye.
Mais la réponse "Y" à la première question, la partie qui s'est affichée dans la console (le téléchargement), et la réponse à la deuxième question ne sont pas dans ce fichier log.
Et c'est encore pire (pour moi) si je réponds "Y" (ou y) aux deux questions.
Dans la console, après le téléchargement, je n'ai alors que les "warning" de l'installation de nodejs dont voici un extrait
fnux@VM-precise-64 ~ $ ./test-node.sh > node.log
y
--2013-07-09 19:56:26-- http://nodejs.org/dist/v0.8.25/node-v0.8.25.tar.gz
Resolving nodejs.org (nodejs.org)... 165.225.133.150
Connecting to nodejs.org (nodejs.org)|165.225.133.150|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12850173 (12M) [application/octet-stream]
Saving to: `node-v0.8.25.tar.gz'
100%[======================================>] 12,850,173 251K/s in 53s
2013-07-09 19:57:20 (238 KB/s) - `node-v0.8.25.tar.gz' saved [12850173/12850173]
y
../deps/openssl/openssl/crypto/x509/x509_vfy.c: In function ‘X509_verify_cert’:
../deps/openssl/openssl/crypto/x509/x509_vfy.c:156:13: warning: variable ‘xn’ set but not used [-Wunused-but-set-variable]
../deps/uv/src/ares/ares_options.c: In function ‘ares_set_servers_csv’:
../deps/uv/src/ares/ares_options.c:187:9: warning: ignoring return value of ‘strtol’, declared with attribute warn_unused_result [-Wunused-result]
bla bla bla
../deps/uv/src/unix/ev/ev.c:1358:12: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
../deps/uv/src/unix/ev/ev.c:1365:12: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
../deps/uv/src/unix/linux/linux-core.c: In function ‘read_cpufreq’:
../deps/uv/src/unix/linux/linux-core.c:487:9: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result]
../deps/zlib/contrib/minizip/zip.c:196:12: warning: ‘free_linkedlist’ defined but not used [-Wunused-function]
fnux@VM-precise-64 ~ $
Ce qui ne sert pas à grand chose, et je vous passe le détail du fichier log qui fait plus de 2.000 lignes mais qui commence et se termine comme ça :.
Hello fnux
Do you want to download nodejs: (Y/n) [Default No]?
Downloading nodejs...
Do you want to install nodejs right now: (Y/n) [Default No]?
Please be patient since the install can last up to 10 minutes.
{ 'target_defaults': { 'cflags': [],
'default_configuration': 'Release',
'defines': [],
'include_dirs': [],
'libraries': []},
make[1]: Leaving directory `/home/fnux/node-v0.8.25/out'
ln -fs out/Release/node node
bla bla bla
Let the CPU cool down a little bit...
make -C out BUILDTYPE=Release V=1
make[1]: Entering directory `/home/fnux/node-v0.8.25/out'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/fnux/node-v0.8.25/out'
ln -fs out/Release/node node
python tools/install.py install
installing /usr/local/include/node/ares.h
bla bla bla
installing /usr/local/lib/node_modules/npm/bin/node-gyp-bin/node-gyp.cmd
symlinking ../lib/node_modules/npm/bin/npm-cli.js -> /usr/local/bin/npm
updating shebang of /usr/local/bin/npm to /usr/local/bin/node
The installation is done.
Goodbye.
Ce qui ne me sert à rien.
Alors, suis-je devant un cas insoluble ou y a-t-il une solution ?
J'ai recherché longtemps sur différents forum mais je n'ai rien trouvé.
Merci d'avance de toute aide.
Dernière modification par fnux (Le 11/07/2013, à 01:36)
N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.
Hors ligne
#2 Le 10/07/2013, à 02:29
- nesthib
Re : [Résolu] Est-ce possible en bash ?
Je n'ai pas lu passé le premier paragraphe, mais je te suggère plusieurs pistes :
1- utilise la commande tee qui permet de copier la sortie standard vers un fichier
2- regarde du côté de la commande script qui permet d'enregistrer toute une session interactive vers un fichier
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#3 Le 11/07/2013, à 01:36
- fnux
Re : [Résolu] Est-ce possible en bash ?
Salut nesthib,
Je n'ai pas lu passé le premier paragraphe, mais je te suggère plusieurs pistes :
1- utilise la commande tee qui permet de copier la sortie standard vers un fichier
2- regarde du côté de la commande script qui permet d'enregistrer toute une session interactive vers un fichier
La seconde solution semble bien répondre à mon besoin, mais ça m'oblige à faire un premier script qui utilise la commande "script" et qui lance le script dont je cherche à créer un log. L'idéal serait une commande similaire placée juste après la première ligne : "#!/bin/sh", mais là je rêve un peu.
Merci.
Dernière modification par fnux (Le 11/07/2013, à 01:40)
N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.
Hors ligne
#4 Le 11/07/2013, à 02:47
- nesthib
Re : [Résolu] Est-ce possible en bash ?
c'est possible :
#!/bin/sh
script log.txt <<EOF
commande1
commande2
…
EOF
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#5 Le 11/07/2013, à 13:08
- fnux
Re : [Résolu] Est-ce possible en bash ?
Salut nesthib,
c'est possible :
#!/bin/sh script log.txt <<EOF commande1 commande2 … EOF
Désolé mais à moins que je ne sache pas comment m'y prendre, ton astuce ne fonctionne pas avec un script interactif comme celui que j'ai proposé précédemment en exemple et que j'ai modifié ci-dessous avec tes recommandations.
STP, essayes donc ça (tu peux y aller franco car il n'y a pas de risque puisque le script n'exécute même pas le download - LoL ) :
#!/bin/sh
# name: install_nodejs.sh
#
script install-node.log <<EOF
#
echo "\nHello $USER\n"
echo -n "Do you want to download nodejs: (Y/n) [Default No]? "; read -p "" GETNODE
case $GETNODE in
'Y'|'y')
echo "\nDownloading nodejs...\n"; wget -O node-v0.8.25.tar.gz http://nodejs.org/dist/v0.8.25/node-v0.8.25.tar.gz;;
*)
echo "\nGoodbye."; exit;;
esac
case $GETNODE in
'Y'|'y')
echo -n "Do you want to install nodejs right now: (Y/n) [Default No]? "; read -p "" INSTALLNODE;;
esac
if [ "$INSTALLNODE" = "Y" ] || [ "$INSTALLNODE" = "y" ]
then
echo "\nPlease be patient since the install can last up to 10 minutes.\n"
sleep 3
tar -xzf node-v0.8.25.tar.gz
cd node-v0.8.25
./configure
make clean
make
echo "\nLet the CPU cool down a little bit...\n"
sleep 45
sudo make install
cd ..
echo "\nThe installation is done.\nGoodbye."
else
echo "\nYou can install nodejs later using the following commands:\n"
echo "tar -xzf node-v0.8.25.tar.gz"
echo "cd nodejs-v0.8.25"
echo "./configure"
echo "make clean"
echo "make"
echo "sudo make install"
echo "cd ..\n"
echo "Goodbye."
fi
EOF
La ligne "script install-node.log <<EOF" te fait perdre l'interactivité et le script s'exécute sans s'arrêter à la première question : (echo -n "Do you want to download nodejs: (Y/n) [Default No]? "; read -p "" GETNODE), ce qui n'est pas le but recherché.
Par contre, ça va si tu enlèves la 4ème et la dernière ligne de cet exemple, et si tu lances successivement les 3 commandes :
script install-nodejs.log
./install-nodejs.sh
exit
Donc, mon rêve reste un rêve.
Et c'est bien fait pour moi. Je n'ai qu'à me mettre vraiment au C plutôt que d'essayer de faire des trucs tordus en sh.
Merci quand même.
Dernière modification par fnux (Le 11/07/2013, à 14:04)
N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.
Hors ligne
#6 Le 11/07/2013, à 14:10
- credenhill
Re : [Résolu] Est-ce possible en bash ?
hello
et avec script -c install_nodejs.sh
Hors ligne
#7 Le 31/08/2020, à 23:19
- fnux
Re : [Résolu] Est-ce possible en bash ?
Salut,
hello
et avec script -c install_nodejs.sh
Je suis archi désolé de ne pas t'avoir répondu ni remercié car je n'avais pas vu ta réponse et ta commande répond à mon besoin.
Donc, avec 7 ans de retard... MERCI.
N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.
Hors ligne
#8 Le 01/09/2020, à 08:05
- FrancisFDZ
Re : [Résolu] Est-ce possible en bash ?
Bonjour,
Je reviens au conseil donné en #3 ; tee me semble être la réponse adaptée. Cette commande permet de rediriger une réponse vers deux sorties différentes, mais perso je ne la maitrise pas (=> à creuser)
[Edit] quelques précisions là
On y voit
tee - Lire depuis l’entrée standard et écrire sur la sortie standard et dans des fichiers
Ce qui me semble la réponse à la question initiale.[/Edit]
Dernière modification par FrancisFDZ (Le 01/09/2020, à 08:10)
-- On peut avoir des raisons de se plaindre et n'avoir pas raison de se plaindre --
[Victor Hugo]
Hors ligne
#9 Le 05/09/2020, à 21:31
- fnux
Re : [Résolu] Est-ce possible en bash ?
Bonjour,
Bonjour,
Je reviens au conseil donné en #3 ; tee me semble être la réponse adaptée. Cette commande permet de rediriger une réponse vers deux sorties différentes, mais perso je ne la maitrise pas (=> à creuser)[Edit] quelques précisions là
On y voitman tee a écrit :tee - Lire depuis l’entrée standard et écrire sur la sortie standard et dans des fichiers
Ce qui me semble la réponse à la question initiale.[/Edit]
Merci, mais le moins qu'on puisse dire est que le man de tee est "succinct" !
J'ai essayé cette commande, mais impossible de lancer un script (ce qui est tapé est effectivement redirigé vers la console et vers un fichier mais rien n s'exécute !)
Exemple:
tee test.txt
sudo ./mon-script.sh
sudo ./mon-script.sh
...
Donc pour l'instant à moins que quelqu'un puisse me montrer comment se servir de tee dans ce cas précis, je reste avec script -c ....
Merci quand même.
N'engage pas un débat lors d'un dîner car celui qui n'a pas faim aura le dernier mot. - R. Whately
FWPBLA - The Froggies West Palm Beach Linux Association.
Hors ligne