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

Hors 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 ? roll


Connected \o/
Welcome to sHell. · eval is evil.

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

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

Hors 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