#1 Le 28/05/2018, à 18:16
- Ivanovich
[Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
bonjour,
Fatigué de refaire à la mimine des installations à droite et à gauche j'ai écrit un petit script qui me permet d'installer en masse les principaux logiciels.
Le principe est un shell qui lit dans son en-tête (ou dans un fichier de config spécifique) les logiciels à installer (supprimer).
3 modes de fonctionnement:
- traitement de tout le fichier
- traitement d'appli passées en paramètres
- vérification de ce qui est installé
A distinguer, les logiciels que je qualifie de "simples" installé via un "apt install" et les logiciels "complexes" nécessitant un wget etc...
Le problème que je rencontre est le suivant:
- si je lance lance en mode "tout":
BASH_Multi_Installation_Origine.sh
j'ai des erreurs qui abortent toutes les installations "simples"
- si je lance en mode applications spécifiées
BASH_Multi_Installation_Origine.sh partclone audacity banshee
ça marche.
Quand je suis le processus de traitement je ne vois pas la différence entre les 2 traitements:
- dans les 2 cas les lignes de définitions sont stockées dans un fichier temporaire
- dans le 1er cas on traite toutes les lignes de ce fichier ( while read -r ligne)
- dans le 2ème cas on traite une ligne greppée (awk en fait) et après on part sur les même fonctions.
Je ne pige pas.
Log quand c'est KO:
---> installation (désinstallation) de: partclone - install
sudo apt install -y partclone
stty: 'entrée standard': Ioctl() inapproprié pour un périphérique
Traceback (most recent call last):
File "/usr/local/bin/apt", line 71, in <module>
rows, columns = os.popen('stty size', 'r').read().split()
ValueError: not enough values to unpack (expected 2, got 0)
!!!!!! Paquet absent !!!!!!!!
Log quand c'est OK:
---> installation (désinstallation) de: partclone - install
sudo apt install -y partclone
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Lecture des listes de paquets…
Construction de l'arbre des dépendances…
Lecture des informations d'état…
Les paquets supplémentaires suivants vont être installés :
nilfs-tools
Les NOUVEAUX paquets suivants seront installés :
nilfs-tools partclone
0 mis à jour, 2 nouvellement installés, 0 à enlever et 327 non mis à jour.
Il est nécessaire de prendre 448 ko dans les archives.
Après cette opération, 2 033 ko d'espace disque supplémentaires seront utilisés.
Réception de:1 http://archive.ubuntu.com/ubuntu xenial/universe amd64 nilfs-tools amd64 2.2.3-2 [117 kB]
Réception de:2 http://archive.ubuntu.com/ubuntu xenial/universe amd64 partclone amd64 0.2.86-1 [330 kB]
448 ko réceptionnés en 1s (412 ko/s)
Sélection du paquet nilfs-tools précédemment désélectionné.
(Lecture de la base de données...
(Lecture de la base de données... 5%
(Lecture de la base de données... 10%
(Lecture de la base de données... 15%
(Lecture de la base de données... 20%
(Lecture de la base de données... 25%
(Lecture de la base de données... 30%
(Lecture de la base de données... 35%
(Lecture de la base de données... 40%
(Lecture de la base de données... 45%
(Lecture de la base de données... 50%
(Lecture de la base de données... 55%
(Lecture de la base de données... 60%
(Lecture de la base de données... 65%
(Lecture de la base de données... 70%
(Lecture de la base de données... 75%
(Lecture de la base de données... 80%
(Lecture de la base de données... 85%
(Lecture de la base de données... 90%
(Lecture de la base de données... 95%
(Lecture de la base de données... 100%
(Lecture de la base de données... 205943 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../nilfs-tools_2.2.3-2_amd64.deb ...
Dépaquetage de nilfs-tools (2.2.3-2) ...
Sélection du paquet partclone précédemment désélectionné.
Préparation du dépaquetage de .../partclone_0.2.86-1_amd64.deb ...
Dépaquetage de partclone (0.2.86-1) ...
Traitement des actions différées (« triggers ») pour man-db (2.7.5-1) ...
Paramétrage de nilfs-tools (2.2.3-2) ...
Paramétrage de partclone (0.2.86-1) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.23-0ubuntu9) ...
--------------installation (désinstallation) partclone OK ---------------\n
Le shell:
#!/bin/bash
# Script d'installation automatique de programmes
# destiné à une première installation
########################################################################
#
# ZONE de DECLARATION des PAQUETS a installer
#
# Une ligne de déclaration DOIT avoir le format suivant:
# - Flag début de ligne: #%
# Séparateur 1 ou + espaces
# - Nom du logiciel: nom du logiciel sans espace
# Séparateur 1 ou + espaces
# - Type d'installation: 'simple' ou 'complexe'
# - Action: 'install' ou 'remove' ou 'no-install'
# - Flag de vérification "V" ou non "N" d'installation du logiciel
#
#
# TYPIQUEMENT IL NE FAUT MODIFIER QUE LE CHAMP 3 : "install" ou "remove" ou "no-install"
#
# exemple: #% pingus simple install
# #% pidgin simple remove
# #% konquest simple no-install
# #% etcher complexe install
#
# pingus sera installé
# pidgin sera désinstallé
# konquest ne sera ni installé ni supprimé
# etcher sera installé
#
# syntaxe 1 : BASH_Multi_Installation_Origine.sh
# Installation de tout ce qui est déclaré à installer ou supprimer dans ce shell
# ou bien en enregistrant toutes les lignes entre:
# # DEBUT des déclarations des logiciels
# et
# # FIN des déclarations des logiciels
# dans un fichier de config: Multi_installation.cfg (par exemple)
# et de modifier la ligne de déclaration du fichier de config.
#
# syntaxe 2 : BASH_Multi_Installation_Origine.sh appli_1 [ applis_2 .... appli_n ]
# Installation(dés-inst) applications passées en paramètre qui doivent figurer dans le shell
# ou le fichier de config déclaré avec l'action souhaitée.
#
# syntaxe 3 : BASH_Multi_Installation_Origine.sh verification
# Vérification des programmes installés des applis ayant le flag "V" dans le fichier de config.
#
#
# Version: 1.0 25/02/2017
# 2.0 14/02/2018
# Contrôle plus sérieux des paramètres
# 2.1 16/02/2018
# Ajout Etcher (créateur liveusb UEFI)
# 3.0 21/02/2018
# Abandon du lancement en mode sudo.
# Possibilité d'installer des applications passées en paramètre
# 3.1 Mise à jour de MkvToolnixGUI
# 3.2 23/02/2018
# Ajout bannière avertissement début de programme
# 3.3 Ajout mode verification
# 3.4 Correction erreur dans Etcher
# 3.5 Revision de la fonction verification
# Ajout du flag de vérification
# 3.6 Modification des commentaires pour utiliser ou non
# un fichier propre de configuration.
# 3.7 Correction de bug et autres petites améliorations
# 3.8 Correction de bug et évolution des déclarations
# Le champ action devient obligatoire : instal / no-install / remove
# Bug en mode sans paramètre le fichier de config était forcement le shell.
# Auteur: Ivanovich - JC
########################################################################
# DEBUT des déclarations des logiciels
########################################################################
# Etat des paquets du : 14/02/2018
########################################################################
# # REC=recommandé
# # DEF=installé par défaut par le système
# # OPT=selon les choix de chacun
#% partclone simple install V # REC Outil de sauvegarde de partition (vivement recommandé)
#% transmission simple install V # DEF client BitTorrent installé par défaut sur Ubuntu
#% audacious simple no-install V # OPT lecteur audio
#% banshee simple install V # OPT lecteur audio
#% pavucontrol simple no-install V # DEF PulseAudio VolUme Control) est un outil graphique de contrôle simplifié
#% alsa-utils simple no-install V # DEF contrôleur de volume très complet (version graphique terminal)
#% sysinfo simple no-install V # DEF utilitaire donnant des informations sur le système
#% localepurge simple install V # REC est un outil simple qui permet de supprimer automatiquement les langues inutiles d'un paquet installé
#% alacarte simple install V # OPT éditeur de menu
#% dconf-editor simple no-install V # OPT éditeur des variables de configuration
#% etcher complexe install N # REC utilitaire de création d'une live USB boot UEFI
#% multisystem complexe install V # REC créateur de liveusb (censé booter en UEFI)
#% teamviewer complexe install V # REC outil de prise de contrôle à distance
#--------- Outils de maintenance --------------
#% testdisk simple install V # OPT outil de récupération de partition et de fichiers effacés par erreur dont photorec
#% gparted simple install V # REC outil de partitionnement des disques
#--------- Communication ----------------------
#% pidgin simple remove V # DEF est un client de messagerie instantanée multi-protocoles
#% skype simple no-install V # OPT logiciel propriétaire de téléphonie, de vidéophonie et de clavardage par Internet.
#--------- Bureautique ------------------------
#% geany simple install V # REC petit éditeur de texte polyvalent mais orienté programmation
#% gedit simple no-install V # DEF petit éditeur alternatif (moins bien que geany)
#% xsane simple no-install V # DEF conçu pour l'acquisition d'images avec votre scanner
#% pdfshuffler simple no-install V # OPT petit logiciel permettant d'effectuer diverses modifications de PDF
#% ttf-mscorefonts-installer complexe install V # OPT polices compatibles microsoft office
#% fontes_interessantes complexe install N # OPT un lot de fontes intéressantes notamment pour les BD
#--------- Video ------------------------------
#% mkvtoolnix-gui complexe install V # REC ensemble de logiciels GUI pour la création et la modification de fichiers mkv
# # comprend: mkvinfo mkvpropedit mkvextract mkvmerge
#% mediainfo simple install V # REC logiciel permettant de recueillir des informations techniques et des tags sur les fichiers vidéo et audio
#% libav-tools simple install V # REC fournit des outils et des bibliothèques multiplate-formes pour convertir, manipuler et diffuser
# # un large éventail de formats et de protocoles multimédias
# # avconv fait partie du paquet libav-tools
#% ffmpeg simple no-install V # application de lecture et encodage de vidéo
#% x264 simple no-install V # DEF codec pour le h264
#% kdenlive simple install V # REC logiciel de montage vidéo pour l'environnement de bureau KDE
#% qarte complexe install V # OPT application graphique permettant de télécharger des vidéos sur ARTE
#--------- Photo ------------------------------
#% gimp-plugin-registry simple install V # REC contient un certains nombre de scripts pour Gimp
#% digikam complexe install V # REC gestionnaire de photos libre très complet pour l'environnement de bureau KDE
#% hugin simple no-install V # OPT logiciel d'aide à la conception de panoramas à partir de plusieurs photos
#--------- Audio ------------------------------
#% audacity simple install V # REC application libre multiplate-forme d'enregistrement et d'édition audio très complète
# # changer ds les préférences le répertoire de travail /var/tmp par def
# # car il y peut y avoir un risque de saturation de "/" ex: /media/s2_videos/.audacity_temp/
#--------- Multimedia -------------------------
#% smplayer simple install V # REC media player
#% vlc simple install V # REC media player
#
#% plex complexe install V # OPT serveur multimedia compatible chromecast
#% verification complexe install N # doit être mis en install pour etre effectuée
#% appli_test complexe no-install N # fonction servant aux tests du shell (enlever install si pas en période de test)
########################################################################
# FIN des déclarations des logiciels
########################################################################
#--constantes---
NO_ARGS=0
ERREUR_OPTION=65
# 1 - Utilisation du shell comme fichier de config
# ou
# 2 - d'un fichier créé
#
# 1 - Décommenter ci-dessous pour utiliser le shell comme fichier de config
#FIC_CONFIG=$0
# 2 - Décommenter ci-dessous pour déclarer un fichier de config commun (exemple ci-dessous)
#FIC_CONFIG=$HOME/Multi_installation.cfg
# 2 - Décommenter ci-dessous pour déclarer un fichier propre à cette installation (exemple)
FIC_CONFIG=$HOME/home_commun/scripts/Multi_Installation_mint18.3.cfg
#FIC_CONFIG=$HOME/home_commun/scripts/Multi_Installation_Debian.cfg
F_TEMP=/tmp/Multi_Installation_Origine.tmp
FIC_INST_KO=/tmp/Multi_Installation_Origine_Non_Installe.txt
sudo chown $USER.$USER ${F_TEMP}
sudo chown $USER.$USER ${FIC_INST_KO}
echo > ${FIC_INST_KO}
F_LOG=/var/log/Multi_Installation_Origine.log
if ! [[ -e ${F_LOG} ]]
then
sudo touch ${F_LOG}
fi
sudo chown $USER.$USER ${F_LOG}
R_DL=/tmp/
#
# installations Simples ----------------------------------------------
#
install_remove_simple() {
if [ ${ACTION} = "install" -o ${ACTION} = "remove" ]
then
echo ""
echo "---> installation (désinstallation) de: ${PAQUET} - ${ACTION}"
echo "---> installation (désinstallation) de: ${PAQUET} - ${ACTION}" 1>>${F_LOG} 2>>${F_LOG}
echo "sudo apt ${ACTION} -y ${PAQUET}" 1>>${F_LOG} 2>>${F_LOG}
sudo apt ${ACTION} -y ${PAQUET} 1>>${F_LOG} 2>>${F_LOG}
if (( $? != 0 ))
then
echo "!!!!!! Paquet absent !!!!!!!!" 1>>${F_LOG} 2>>${F_LOG}
else
echo "--------------installation (désinstallation) ${PAQUET} OK ---------------\n"
echo "--------------installation (désinstallation) ${PAQUET} OK ---------------\n" 1>>${F_LOG} 2>>${F_LOG}
fi
fi
}
#
# Installations complexes --------------------------------------------
#
qarte() {
# - Arte
sudo add-apt-repository -y ppa:vincent-vandevyvre/vvv 1>>${F_LOG} 2>>${F_LOG}
sudo apt update 1>>${F_LOG} 2>>${F_LOG}
sudo apt install -y qarte 1>>${F_LOG} 2>>${F_LOG}
}
multisystem(){
# - Multisystem (alias Multiboot)
sudo apt-add-repository -y 'deb http://liveusb.info/multisystem/depot all main' 1>>${F_LOG} 2>>${F_LOG}
wget -q http://liveusb.info/multisystem/depot/multisystem.asc -O- | sudo apt-key add - 1>>${F_LOG} 2>>${F_LOG}
sudo apt-get update 1>>${F_LOG} 2>>${F_LOG}
sudo apt install -y multisystem 1>>${F_LOG} 2>>${F_LOG}
}
mkvtoolnix-gui(){
# - MKVtoolnix-gui
wget -q -O - https://www.bunkus.org/gpg-pub-moritzbunkus.txt | sudo apt-key add - 1>>${F_LOG} 2>>${F_LOG}
sudo sh -c 'echo "deb http://www.bunkus.org/ubuntu/xenial/ ./" >> /etc/apt/sources.list' 1>>${F_LOG} 2>>${F_LOG}
sudo apt-get update 1>>${F_LOG} 2>>${F_LOG}
sudo apt-get install mkvtoolnix mkvtoolnix-gui 1>>${F_LOG} 2>>${F_LOG}
}
digikam(){
# - DigiKam 5
sudo add-apt-repository -y ppa:philip5/extra 1>>${F_LOG} 2>>${F_LOG}
sudo apt-get update 1>>${F_LOG} 2>>${F_LOG}
sudo apt install -y digikam5 1>>${F_LOG} 2>>${F_LOG}
}
ttf-mscorefonts-installer(){
# - ttf-mscorefonts-installer
# Erreur en fin mais semble bon - erreur sur arial32
echo "\n---> Installation de: ttf-mscorefonts-installer" 1>>${F_LOG} 2>>${F_LOG}
sudo apt install -y ttf-mscorefonts-installer 1>>${F_LOG} 2>>${F_LOG}
}
fontes_interessantes(){
# - fontes_interessantes
# fonte pour les bulles BD: http://www.dafont.com
# Mad Midnight Marker
# Awesome as fuck
# Black Kids
# Dk the cats whiskers
# edson comics
# Gilles comics handwriting
# I Hate Comic Sans
# Komika Display
echo " Installer les fontes suivantes:
font pour les bulles BD: http://www.dafont.com
Mad Midnight Marker
Awesome as fuck
Black Kids
Dk the cats whiskers
edson comics
Gilles comics handwriting
I Hate Comic Sans
Komika Display"
}
teamviewer(){
# - TeamViewer
cd $HOME/Téléchargements 1>>${F_LOG} 2>>${F_LOG}
if [[ -e teamviewer_amd64.deb ]]
then
# Fichier déjà téléchargé (?)
echo "Fichier teamviewer_amd64.deb déjà présent dans $HOME/Téléchargements" 1>>${F_LOG} 2>>${F_LOG}
echo "Utilisation de ce fichier"
else
wget http://download.teamviewer.com/download/teamviewer_amd64.deb 1>>${F_LOG} 2>>${F_LOG}
fi
CR=$?
if (( $CR == 0 ))
then
sudo /usr/bin/gdebi $HOME/Téléchargements/teamviewer_amd64.deb 1>>${F_LOG} 2>>${F_LOG}
else
erreur $CR "Teamviewer"
fi
}
plex(){
# - Serveur Multimedia Plex
cd $HOME/Téléchargements 1>>${F_LOG} 2>>${F_LOG}
if [[ -e plexmediaserver_1.10.1.4602-f54242b6b_amd64.deb ]]
then
# Fichier déjà téléchargé (?)
echo "Fichier plexmediaserver_1.10.1.4602-f54242b6b_amd64.deb déjà présent dans $HOME/Téléchargements" 1>>${F_LOG} 2>>${F_LOG}
echo "Utilisation de ce fichier" 1>>${F_LOG} 2>>${F_LOG}
else
wget https://downloads.plex.tv/plex-media-server/1.10.1.4602-f54242b6b/plexmediaserver_1.10.1.4602-f54242b6b_amd64.deb 1>>${F_LOG} 2>>${F_LOG}
fi
CR=$?
if (( $CR == 0 ))
then
sudo /usr/bin/gdebi $HOME/Téléchargements/plexmediaserver_1.10.1.4602-f54242b6b_amd64.deb 1>>${F_LOG} 2>>${F_LOG}
else
erreur $CR "Plex MediaServeur"
fi
}
etcher(){
# - Etcher
echo "L'application Etcher va se lancer en fin d'installation pour installer une icône de démarrage" 1>>${F_LOG} 2>>${F_LOG}
echo "Message: Should a desktop file for /opt/etcher-1.3.1-x86_64.AppImage be installed?" 1>>${F_LOG} 2>>${F_LOG}
echo "Il suffira de quitter l'application à ce stade après avoir accepté." 1>>${F_LOG} 2>>${F_LOG}
echo "L'application Etcher va se lancer en fin s'installation pour installer une icône de lancement" >> ${F_LOG}
echo "Il suffira de quitter l'application à ce stade après avoir accepté." >> ${F_LOG}
echo
cd $HOME/Téléchargements 1>>${F_LOG} 2>>${F_LOG}
if [[ -e etcher-1.3.1-linux-x86_64.zip ]]
then
# Fichier déjà téléchargé (?)
echo "Fichier etcher-1.3.1-linux-x86_64.zip déjà présent dans $HOME/Téléchargements" 1>>${F_LOG} 2>>${F_LOG}
echo "Utilisation de ce fichier" 1>>${F_LOG} 2>>${F_LOG}
else
wget https://github.com/resin-io/etcher/releases/download/v1.3.1/etcher-1.3.1-linux-x86_64.zip
fi
CR=$?
if (( $? == 0 ))
then
sudo unzip -d /opt -o ./etcher-1.3.1-linux-x86_64.zip 1>>${F_LOG} 2>>${F_LOG}
sudo rm /opt/etcher-1.3.1-linux-x86_64.zip 1>>${F_LOG} 2>>${F_LOG}
sudo chown $USER.$USER /opt/etcher-1.3.1-x86_64.AppImage 1>>${F_LOG} 2>>${F_LOG}
echo "Lancement de Etcher pour la 1ère fois" 1>>${F_LOG} 2>>${F_LOG}
/opt/etcher-1.3.1-x86_64.AppImage
else
erreur $CR "Etcher" 1>>${F_LOG} 2>>${F_LOG}
fi
}
#
# erreur -------------------------------------------------------------
#
erreur(){
echo "!!!"
case $1 in
8)
echo "!!! Le paquet $2 n'a pas été touvé ou erreur dans l'adresse !!!"
echo "!!! Le paquet $2 n'a pas été touvé ou erreur dans l'adresse !!!" 1>>${F_LOG} 2>>${F_LOG}
;;
*)
echo "!!! Erreur: "$ERREUR
echo "!!! Erreur: "$ERREUR 1>>${F_LOG} 2>>${F_LOG}
esac
echo "!!!"
}
#
# test ---------------------------------------------------------------
#
appli_test(){
echo "HOME: " $HOME
cd $HOME/Téléchargements
pwd
sudo apt remove -y pidgin
}
#
# verification--------------------------------------------------------
#
verification(){
##% smplayer simple install # REC media player
echo "====================================================================="
echo "| ATTENTION: Certaines applications ne sont pas vérifiées parce-que |"
echo "| le flag de vérification a été mis à NON parce-que leur nom |"
echo "| d'installation n'est pas leur nom de paquet ou leur nom global |"
echo "| d'installation inclus un ensemble de paquets non vérifiable. |"
echo "====================================================================="
Liste_a_installer=$( awk ' /^#%/ { if ($4 == "install" && $5 == "V") { liste = liste " " $2}}
END{ print liste}' $FIC_CONFIG )
Liste_a_installer_non_verifie=$( awk ' /^#%/ { if ($4 == "install" && $5 == "N") { liste = liste " " $2}}
END{ print liste}' $FIC_CONFIG )
echo "Liste des applications à installer ----> " ${Liste_a_installer} 1>>${F_LOG} 2>>${F_LOG}
echo "Liste des applications à installer mais non vérifiées ----> " ${Liste_a_installer_non_verifie} 1>>${F_LOG} 2>>${F_LOG}
for appli in ${Liste_a_installer}
do
dpkg --get-selections | grep ^$appli 1>>NULL 2>>NULL
if (( $? != 0 ))
then
etat="non-installée"
echo $appli >> ${FIC_INST_KO}
else
etat="installée"
fi
echo $appli $etat | awk '{ chaine = $1 "----------------------------"
printf "%-30.30s-----------------> %-15s\n" , chaine ,$2 }'
done
}
#
# traiter une ligne --------------------------------------------------
#
traiter_une_ligne(){
echo "DECLARATION: " ${DECLARATION}
PAQUET=$(echo ${DECLARATION} | awk '{ print $2 }')
TYPE=$(echo ${DECLARATION} | awk '{ print $3 }')
ACTION=$(echo ${DECLARATION} | awk '{ print $4 }')
echo "Logiciel: ${PAQUET} - TYPE: ${TYPE} - ACTION: ${ACTION}"
if [ ${TYPE} = "simple" ]
then
# installation simple
if [ x${ACTION} = "xinstall" -o x${ACTION} = "xremove" -o x${ACTION} = "xno-install" ]
then
if [ x${ACTION} = "xno-install" ]
then
echo "---> Installation simple - Pas d'installation demandée pour ${PAQUET} !!!"
echo "---> Installation simple - Pas d'installation demandée pour ${PAQUET} !!!" 1>>${F_LOG} 2>>${F_LOG}
else
install_remove_simple
fi
else
echo "--------------Action non conforme pour le paquet: ${PAQUET} --> ${ACTION} ---------------\n"
echo "--------------Action non conforme pour le paquet: ${PAQUET} --> ${ACTION} ---------------\n" 1>>${F_LOG} 2>>${F_LOG}
fi
else
if [ ${TYPE} = "complexe" ]
then
if [ x${ACTION} = "xinstall" ]
then
# installation complexe
echo "---> Installation complexe: ${PAQUET}"
echo "---> Installation complexe: ${PAQUET}" 1>>${F_LOG} 2>>${F_LOG}
${PAQUET}
else
if [ x${ACTION} = "xno-install" ]
then
echo "---> Installation complexe - Pas d'installation demandée pour ${PAQUET} !!!"
echo "---> Installation complexe - Pas d'installation demandée pour ${PAQUET} !!!" 1>>${F_LOG} 2>>${F_LOG}
else
echo "---> Installation complexe - Pas d'action ou action non implémentée: ${ACTION} !!!"
echo "---> Installation complexe - Pas d'action ou action non implémentée: ${ACTION} !!!" 1>>${F_LOG} 2>>${F_LOG}
fi
fi
else
echo "---> Type d'installation : " ${TYPE} " inconnu ou non implémentée pour ${PAQUET}!!!"
echo "---> Type d'installation : " ${TYPE} " inconnu ou non implémentée pour ${PAQUET}!!!" 1>>${F_LOG} 2>>${F_LOG}
fi
fi
}
#
# main ----------------------------------------------------------------
#
echo "--------Lancement de $0 ----------------------" 1>>${F_LOG} 2>>${F_LOG}
date 1>>${F_LOG} 2>>${F_LOG}
id | grep '(root)' 1>>${F_LOG}
if (( $? == 0 ))
then
echo "!!!"
echo "!!! Vous ne devez pas lancer le shell en mode root "
echo "!!!"
exit 1
fi
grep '^#%' ${FIC_CONFIG} > ${F_TEMP}
# ouverture d'un terminal pour lire en tail le log
echo "" 1>>${F_LOG} 2>>${F_LOG}
echo "======================= Nouveau lancement du shell ===========================" 1>>${F_LOG} 2>>${F_LOG}
echo " $0" 1>>${F_LOG} 2>>${F_LOG}
echo "======================= Nouveau lancement du shell ===========================" 1>>${F_LOG} 2>>${F_LOG}
echo "" 1>>${F_LOG} 2>>${F_LOG}
gnome-terminal --geometry=120x50 -x tail -f ${F_LOG} &
echo " ======================================================================" 1>>${F_LOG} 2>>${F_LOG}
echo " | ATTENTION TOUTES LES SORTIES DES EXECUTIONS DES COMMANDES SE FERONT|" 1>>${F_LOG} 2>>${F_LOG}
echo " | DANS CE TERMINAL. IL EST CONSEILLE D'ARRANGER VOS FENETRES POUR QUE|" 1>>${F_LOG} 2>>${F_LOG}
echo " | CETTE FENETRE NE RECOUVRE PAS LA FENETRE DE LANCEMENT. |" 1>>${F_LOG} 2>>${F_LOG}
echo " | |" 1>>${F_LOG} 2>>${F_LOG}
echo " | EN EFFET SI DES QUESTIONS ATTENDANT UNE SAISIE SONT POSEES VOUS |" 1>>${F_LOG} 2>>${F_LOG}
echo " | DEVREZ FAIRE CETTE SAISIE DANS LA FENETRE DE LANCEMENT. |" 1>>${F_LOG} 2>>${F_LOG}
echo " | |" 1>>${F_LOG} 2>>${F_LOG}
echo " | AVEZ-VOUS COMPRIS? ENTREZ OUI (O|o) |" 1>>${F_LOG} 2>>${F_LOG}
echo " ======================================================================" 1>>${F_LOG} 2>>${F_LOG}
echo "" 1>>${F_LOG} 2>>${F_LOG}
read reponse
if [ x$reponse != "xo" ] && [ x$reponse != "xO" ]
then
echo " Pas de confirmation au message d'entrée !!! " 1>>${F_LOG} 2>>${F_LOG}
exit 1
fi
echo "A SAVOIR: Utilisation comme fichier de configuration de: "${FIC_CONFIG} 1>>${F_LOG} 2>>${F_LOG}
if [ $# -eq "$NO_ARGS" ] # Pas d'arguments = mode toutes les applications
then
while read -r ligne
do
DECLARATION=$ligne
traiter_une_ligne
done < ${F_TEMP}
else
# au moins 1 argument soit au moins une appli à traiter
# on est en mode appli par appli
Nb_arg=$#
# echo "Nb_arg: " $Nb_arg
while (( $Nb_arg >= 1 ))
do
appli=$1
echo "appli: " $appli
awk '/^#%/ {print $2}' ${F_TEMP} | grep $appli
if (( $? == 0 ))
then
DECLARATION=$(awk -v application=$1 '/^#%/ { if( $2 == application ){ print $0 } }' ${F_TEMP})
traiter_une_ligne
else
echo "!!!"
echo "!!! Application non trouvée: ${appli} !!!"
echo "!!! Application non trouvée: ${appli} !!!" 2>>${F_LOG}
echo "!!!"
fi
shift
(( Nb_arg -= 1 ))
done
fi
#rm ${F_TEMP}
exit 0
Merci aux courageux qui se pencheront sur mon petit problème.
Dernière modification par Ivanovich (Le 29/05/2018, à 19:54)
Mint 20.3 Cinnamon
Dell Optiplex 3020 - Intel(R) i5-4590 // DIMM DDR 2 x 4Go - Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Samsung SSD 750 EVO 120GB / Samsung SSD 960 EVO 250GB / ATA Disk WD10EARS (1,0TB)
Hors ligne
#2 Le 28/05/2018, à 19:13
- Watael
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
salut,
mais pourquoi n'utilises-tu pas une boucle for pour parcourir la liste des arguments du script ?
et puis pourquoi ne pas simplement tester l'existence d'un argument ?
if test -n "$1"
then
for i do : ce que tu veux avec "$i"; done
else
while read -r pkg; do : ce que tu veux avec "$pkg"; done < fichier
fi
d'une manière générale, tout est trop tortueux.
allez, encore un : quand un script appelle plusieurs fois sudo, il devrait n'être exécutable que par root, donc via sudo (un seul, extérieur au script).
Dernière modification par Watael (Le 28/05/2018, à 20:16)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 28/05/2018, à 19:38
- Ivanovich
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
Au delà de l'écriture (tortueuse s'il en est), ça ne répond pas à la question de fond pourquoi entre 2 modes d'appel très semblables ça ne passe pas.
Quand au mode root, de toute façon le shell requiert une fois le mdp root pour exécuter ce qui doit l'être en root.
Mint 20.3 Cinnamon
Dell Optiplex 3020 - Intel(R) i5-4590 // DIMM DDR 2 x 4Go - Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Samsung SSD 750 EVO 120GB / Samsung SSD 960 EVO 250GB / ATA Disk WD10EARS (1,0TB)
Hors ligne
#4 Le 28/05/2018, à 20:18
- Watael
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
ah, tu croyais que j'allais arpenter les méandres de ton script pour y trouver une raison de ne pas faire comme ça doit être fait, et que ça échoue ?
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#5 Le 29/05/2018, à 11:00
- pingouinux
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
Bonjour,
Tu devrais imprimer le contenu de la variable DECLARATION, juste avant l'appel de traiter_une_ligne, dans chacun des cas.
Hors ligne
#6 Le 29/05/2018, à 14:36
- Ivanovich
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
bonjour Pingouinux,
Merci de te pencher sur mon problème.
J'ai fait cette impression de la variable DECLARATION (qui l'était déjà en fait) avec des "--" de délimitation en plus et je ne vois rien qui justifie cette différence de traitement d'autant que l'erreur est dans la fonction install_remove_simple() appelée par traiter_une_ligne()
Test1: Lancement sans paramètre. (KO)
Terminal de lancement:
jacques@ivanovich-ASUS-P5B /media/data/home_commun/scripts $ BASH_Multi_Installation_Origine.sh
o
DECLARATION:--#% partclone simple install V # REC Outil de sauvegarde de partition (vivement recommandé)--
DECLARATION: #% partclone simple install V # REC Outil de sauvegarde de partition (vivement recommandé)
Logiciel: partclone - TYPE: simple - ACTION: install
---> installation (désinstallation) de: partclone - install
Terminal d'édition du log
A SAVOIR: Utilisation comme fichier de configuration de: /home/jacques/home_commun/scripts/Multi_Installation_mint18.3.cfg
---> installation (désinstallation) de: partclone - install
sudo apt install -y partclone
stty: 'entrée standard': Ioctl() inapproprié pour un périphérique
Traceback (most recent call last):
File "/usr/local/bin/apt", line 71, in <module>
rows, columns = os.popen('stty size', 'r').read().split()
ValueError: not enough values to unpack (expected 2, got 0)
!!!!!! Paquet absent !!!!!!!!
Test1: Lancement avec paramètre. (OK)
Terminal de lancement:
jacques@ivanovich-ASUS-P5B /media/data/home_commun/scripts $ BASH_Multi_Installation_Origine.sh partclone
o
appli: partclone
partclone
DECLARATION:--#% partclone simple install V # REC Outil de sauvegarde de partition (vivement recommandé)--
DECLARATION: #% partclone simple install V # REC Outil de sauvegarde de partition (vivement recommandé)
Logiciel: partclone - TYPE: simple - ACTION: install
---> installation (désinstallation) de: partclone - install
--------------installation (désinstallation) partclone OK ---------------\n
Terminal d'édition du log
A SAVOIR: Utilisation comme fichier de configuration de: /home/jacques/home_commun/scripts/Multi_Installation_mint18.3.cfg
---> installation (désinstallation) de: partclone - install
sudo apt install -y partclone
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Lecture des listes de paquets…
Construction de l'arbre des dépendances…
Lecture des informations d'état…
partclone est déjà la version la plus récente (0.2.86-1).
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
--------------installation (désinstallation) partclone OK ---------------\n
Incompréhensible et pourtant il y a une explication.
Mint 20.3 Cinnamon
Dell Optiplex 3020 - Intel(R) i5-4590 // DIMM DDR 2 x 4Go - Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Samsung SSD 750 EVO 120GB / Samsung SSD 960 EVO 250GB / ATA Disk WD10EARS (1,0TB)
Hors ligne
#7 Le 29/05/2018, à 17:14
- pingouinux
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
Édité : Ne tenir compte de ce message que si le remède du message suivant (#8) est inefficace
Es-tu sûr de regarder au bon endroit dans ${F_LOG}, car il ne semble pas effacé d'un passage à l'autre ?
À tout hasard, tu peux insérer pwd et type apt dans install_remove_simple, pour voir s'il y a une différence :
echo "sudo apt ${ACTION} -y ${PAQUET}" 1>>${F_LOG} 2>>${F_LOG}
pwd &>>${F_LOG}
type apt &>>${F_LOG}
sudo apt ${ACTION} -y ${PAQUET} 1>>${F_LOG} 2>>${F_LOG}
Dernière modification par pingouinux (Le 29/05/2018, à 18:58)
Hors ligne
#8 Le 29/05/2018, à 17:50
- pingouinux
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
Une piste :
Quand tu veux tout lire, l'entée standard est le fichier ${F_TEMP} lors de l'appel à traiter_une_ligne, ce qui pourrait peut-être expliquer ce message d'erreur :
stty: 'entrée standard': Ioctl() inapproprié pour un périphérique
Édité :
Essaye ceci :
if [ $# -eq "$NO_ARGS" ] # Pas d'arguments = mode toutes les applications
then
while read -r -u 4 ligne
do
DECLARATION=$ligne
traiter_une_ligne
done 4< "${F_TEMP}"
else
................
Dernière modification par pingouinux (Le 29/05/2018, à 18:54)
Hors ligne
#9 Le 29/05/2018, à 19:34
- Ivanovich
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
Désolé pour le délai mais je fais aussi de la menuiserie.
Ceci dit BINGO !!!! Un pédagogue compétent!
Effectivement ton analyse:
Quand tu veux tout lire, l'entée standard est le fichier ${F_TEMP} lors de l'appel à traiter_une_ligne, ce qui pourrait peut-être expliquer ce message d'erreur :
stty: 'entrée standard': Ioctl() inapproprié pour un périphérique
...m'a semblé intéressante et le test le confirme.
Je vois de plus près demain la syntaxe du read pour comprendre l'astuce.
Merci à toi et bonne soirée.
Mint 20.3 Cinnamon
Dell Optiplex 3020 - Intel(R) i5-4590 // DIMM DDR 2 x 4Go - Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Samsung SSD 750 EVO 120GB / Samsung SSD 960 EVO 250GB / ATA Disk WD10EARS (1,0TB)
Hors ligne
#10 Le 30/05/2018, à 01:24
- Watael
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
cela se serait-il produit si le code avait été écrit dans les règles de l'art (les fonctions utilisent les paramètres positionnels qui leur sont fournis comme arguments et non des variables globales) ?
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#11 Le 30/05/2018, à 19:23
- Ivanovich
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
bonsoir
Bon je suis allé voir de plus prêt la commande read.
Est-ce qu'on peut donc dire qu'en déclarant un descripteur de fichier on a ainsi libéré l'entrée standard?
Et pourquoi le numéro 4 pour le FD? ( +1 de sécurité?)
Chaque fichier ouvert se voit affecté un descripteur de fichier. [75] Les descripteurs de fichier pour stdin, stdout et stderr sont, respectivement, 0, 1 et 2. Pour ouvrir d'autres fichiers, il reste les descripteurs 3 à 9.
Au passage, très bon doc sur le sujet ici.
Mint 20.3 Cinnamon
Dell Optiplex 3020 - Intel(R) i5-4590 // DIMM DDR 2 x 4Go - Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Samsung SSD 750 EVO 120GB / Samsung SSD 960 EVO 250GB / ATA Disk WD10EARS (1,0TB)
Hors ligne
#12 Le 30/05/2018, à 19:29
- pingouinux
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
Pour voir les descripteurs déjà utilisés :
ls /dev/fd
Hors ligne
#13 Le 30/05/2018, à 19:37
- Watael
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
mais c'est quoi qui pose problème ? c'est sudo ou apt ?
si c'est sudo, voir ma dernière remarque au #2.
pour le numéro de descripteur de fichier, on peut laisser bash choisir :
while read -u $foo; do echo "$REPLY"; done {foo}<fichier
EDIT : suppression d'accolades inutiles pour le Développement de variables.
Dernière modification par Watael (Le 26/12/2020, à 08:50)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#14 Le 30/05/2018, à 19:43
- Ivanovich
Re : [Résolu] Bash - PB ds un Script de 1ère install par lot des applis.
OK, le 3 est donc occupé par le process lui-même.
Merci.
Mint 20.3 Cinnamon
Dell Optiplex 3020 - Intel(R) i5-4590 // DIMM DDR 2 x 4Go - Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller
Samsung SSD 750 EVO 120GB / Samsung SSD 960 EVO 250GB / ATA Disk WD10EARS (1,0TB)
Hors ligne