Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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,

nesthib a écrit :

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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde 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,

nesthib a écrit :

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. wink

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

En ligne

#7 Le 31/08/2020, à 23:19

fnux

Re : [Résolu] Est-ce possible en bash ?

Salut,

credenhill a écrit :

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. wink


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
On y voit

man 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]

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,

FrancisFDZ a écrit :

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
On y voit

man 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