Page 1 sur 1

[bash] mon script est lent

Publié : mar. 10 mars 2015, 21:48
par Maximilien LIX
Hello world !
Depuis quelques jours, histoire de tuer le temps, j'ai créé une nouvelle commande (qui est en fait un script bash) dont le but est de permettre d'administrer ma archlinux de manière plus simple. Avec quelques arguments, il est possible de configurer mkinitcpio.conf, le fichier pour grub et pacman.conf par exemple. (il aussi possible de défragmenter firefox ect.)

Pour cela j'utilise plusieurs case, méthode assez...bon ce n'est peut-être pas du grand art mais ça marche :)

Code : Tout sélectionner

#!/bin/bash

# admin is a simple bash script created by Maximilien Di Dio, email address: mrgamerlix@gmail.com
# This program is under licence GPLv3 http://www.gnu.org/licenses/gpl.txt

RESETC="$(tput sgr0)"
YELLOW="$(tput bold ; tput setaf 3)"
RED="$(tput bold ; tput setaf 1)"

USER_DIR="$HOME"
FIREFOX_DEFRAG="$(for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done)"
FIREFOX_PROFILE="firefox -p"
KERNEL="linux"
ROOT_COMMAND="sudo"
TEXT_EDITOR="$EDITOR"
PACKAGE_MANAGER_EDIT="/etc/pacman.conf"
PACKAGE_MANAGER_UPDATE="pacman -Syu"
GRUB_EDIT="/etc/default/grub" 
GRUB_UPDATE="grub-mkconfig -o  /boot/grub/grub.cfg"
KERNEL_EDIT="/etc/mkinitcpio.conf"
KERNEL_UPDATE="mkinitcpio -p"
UPMSG="Make an update of the program."
EDMSG="Edit the config file of the program."
FFDEF="Only for Firefox ! To make it faster !"
FFPRO="Only for Firefox ! To manage the profiles."

case $1 in
        "-pacman")
        case $2 in
                "-edit")
                $ROOT_COMMAND $TEXT_EDITOR $PACKAGE_MANAGER_EDIT
                ;;
                "-update")
                $ROOT_COMMAND $PACKAGE_MANAGER_UPDATE
                ;; 
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac
        ;;
        "-kernel")
        case $2 in
                "-edit")
                $ROOT_COMMAND $TEXT_EDITOR $KERNEL_EDIT
                ;;
                "-update")
                $ROOT_COMMAND $KERNEL_UPDATE $KERNEL
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac
        ;;
        "-grub")
        case $2 in
                "-edit")
                $ROOT_COMMAND $TEXT_EDITOR $GRUB_EDIT
                ;;
                "-update")
                $ROOT_COMMAND $GRUB_UPDATE
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac
        ;;
        "-firefox")
        case $2 in
                "-defrag")
                $FIREFOX_DEFRAG
                ;;
                "-profile")
                $FIREFOX_PROFILE
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
                ;;
        esac   
        ;;
        "-help")
        echo -e "\n${YELLOW}admin is a program which must be used like that:${RESETC}\n\nadmin [program] [option]\n\n${YELLOW}programs availables:${RESETC}\n\n-pacman\n-kernel\n-grub\n-firefox\n\n${YELLOW}options availables:${RESETC}\n\n-edit       $EDMSG\n-update     $UPMSG\n-defrag     $FFDEF\n-profile    $FFPRO\n\n"
        ;;
        *)
        echo -e "${RED}ERROR${RESETC} Invalid command !\nExecute admin -help for more information !"
        ;;
esac

exit
Le problème est qu'à présent lorsque j'exécute la commande, cette dernière met du temps à répondre. :/ Je crois que le fait que bash vérifie toutes les conditions fait que l'exécution est lente.

Du coup comment puis-je m'y prendre pour accélérer la chose ? :) Cordialement.

Re: [bash] mon script est lent

Publié : mar. 10 mars 2015, 22:37
par benjarobin
Si je ne dit pas de bêtise FIREFOX_DEFRAG est exécuté tout au début...

Re: [bash] mon script est lent

Publié : mar. 10 mars 2015, 23:57
par Moviuro
benjarobin a écrit :Si je ne dit pas de bêtise FIREFOX_DEFRAG est exécuté tout au début...
Effectivement. Ce qui est entre $(...) est exécuté et c'est la sortie stdout de ladite commande qui est retournée dans la variable.

Aussi, il y a plein de remarques de forme à faire sur ton script, je t'incite donc à aller sur http://www.shellcheck.net/ pour tester ton script et appliquer les différentes remarques proposées pour apprendre les bonnes méthodes de codage en bash ;)

(j'ajouterais aussi le shebang, il vaut mieux utiliser /usr/bin/env bash pour des soucis de portabilité ; il faut bannir les variables allcaps qui sont réservées aux variables d'environnement : bash sait utiliser des variables avec des noms en minuscules ; pour l'usage, utilise plutôt ceci qui est plus lisible :

Code : Tout sélectionner

cat << __EOH__
Coucou, ceci est un texte d'aide
il est lisible (mais j'ignore s'il supporte les changements de couleur)
__EOH__
)

Re: [bash] mon script est lent

Publié : mer. 11 mars 2015, 14:57
par Maximilien LIX
Shellcheck !? Je ne connaissais pas du tout merci ! :D
Oh oui grossière erreur pour FIREFOX_DEFRAG d'ailleurs mes variables seront en minuscules maintenant promis :)

Par contre, lorsque je teste mon script avec shellcheck celui-ci me renvoie pour erreur ceci https://github.com/koalaman/shellcheck/wiki/Sc2086 soit Double quote to prevent globbing and word splitting. pour l'utilisation des variables $TEXT_EDITOR $PACKAGE_MANAGER_UPDATE $KERNEL_UPDATE ect.

Ma question est la suivante, à quoi cela sert de mettre "" alors que visisblement bash sait comment interpréter ces variables ? :/

Re: [bash] mon script est lent

Publié : mer. 11 mars 2015, 17:17
par Moviuro
Maximilien LIX a écrit :Ma question est la suivante, à quoi cela sert de mettre "" alors que visisblement bash sait comment interpréter ces variables ? :/
Toi, tu mets des commandes complètes dans des variables, donc ce n'est pas attendu que tu utilises les ".

Par contre

Code : Tout sélectionner

#!/usr/bin/env bash
variable="vim pacman"
pacman -S $variable # OK, car splitté
pacman -S "$variable" # "vim pacman" not found

Re: [bash] mon script est lent

Publié : jeu. 12 mars 2015, 13:58
par Maximilien LIX
Ah ok je vois ! Merci :)

UP! L'un de vous aurait-il une archlinux avec syslinux dessus ? (En fait la vrai question est plutôt, qui veut jouer au bétatesteur ?)

J'ai ajouté à mon script deux fonctionnalités permettant d'éditer le fichier de configurartion de syslinux et de le mettre à jour.

Code : Tout sélectionner

#!/usr/bin/env bash

# admin 0.1 is a simple bash script created by Maximilien Di Dio, email address: mrgamerlix@gmail.com
# This program is under licence GPLv3 http://www.gnu.org/licenses/gpl.txt

RESETC="$(tput sgr0)"
YELLOW="$(tput bold ; tput setaf 3)"
RED="$(tput bold ; tput setaf 1)"

user_dir="$HOME"
firefox_profile="firefox -p"
kernel="linux"
root_command="sudo"
text_editor="$EDITOR"
package_manager_edit="/etc/pacman.conf"
package_manager_update="pacman -Syu"
grub_edit="/etc/default/grub" 
grub_update="grub-mkconfig -o  /boot/grub/grub.cfg"
syslinux_edit="/boot/syslinux/syslinux.cfg"
syslinux_update="syslinux-install_update -iam"
kernel_edit="/etc/mkinitcpio.conf"
kernel_update="mkinitcpio -p"
upmsg="Make an update of the program."
edmsg="Edit the config file of the program."
ffdef="Only for Firefox ! To make it faster !"
ffpro="Only for Firefox ! To manage the profiles."
bashrc_dir="~/.bashrc"
manual="man admin"
case $1 in
        "-pacman")
        case $2 in
                "-edit")
                $root_command $text_editor $package_manager_edit
                ;;
                "-update")
                $root_command $package_manager_update
                ;; 
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-kernel")
        case $2 in
                "-edit")
                $root_command $text_editor $kernel_edit
                ;;
                "-update")
                $root_command $kernel_update $kernel
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-grub")
        case $2 in
                "-edit")
                $root_command $text_editor $grub_edit
                ;;
                "-update")
                $root_command $grub_update
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-syslinux")
        case $2 in
                "-edit")
                $root_command $text_editor $syslinux_edit
                ;;
                "-update")
                $root_command $syslinux_update
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac 
        ;;
        "-bash")
        case $2 in
                "-edit")
                $text_editor $bashrc_dir
                ;;
                "-update")
                exec bash 
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac
        ;;
        "-firefox")
        case $2 in
                "-defrag")
                for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done
                ;;
                "-profile")
                $firefox_profile 
                ;;
                *)
                echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
                ;;
        esac   
        ;;
        "-help")
        $manual
        ;;
        *)
        echo -e "${RED}ERROR${RESETC} Invalid command !\nRun admin -help for more information !"
        ;;
esac

exit
Et il y a aussi un manuel, au cas où. :)

Code : Tout sélectionner

.\" Manpage for admin.
.\" Contact mrgamerlix@gmail.com to correct errors or typos.
.TH man 1 "11 March 2015" "1.0" "admin 0.1 man page"
.SH NAME
admin \- A simple bash script for an Arch Linux administrator.
.SH SYNOPSIS
admin [PROGRAM] [OPTION]
.SH DESCRIPTION
admin is a simple command write in bash which allow a more easiest administration of Arch Linux.
.SH PROGRAMS
The programs availables are:
.br 
.B -pacman  
.I  The package manager by default.
.br
.B -kernel  
.I  The kernel which can be linux or linux-lts.
.br
.B -grub    
.I  The multiboot loader of GNU/Linux.
.br
.B -syslinux
.I  An another multiboot loader for GNU/Linux.
.br
.B -bash
.I  The default shell used by Arch Linux.
.br
.B -firefox  
.I  The most popular free web browser. 
.SH OPTIONS
The option can be different according the program selected !
.br
.B -edit    
.I Edit the config file of the program selected. Not for firefox !
.br
.B -update 
.I Make an update of the program. Not for firefox !
.br
.B -defrag 
.I Only for Firefox ! To make it faster.
.br
.B -profile
.I Only for Firefox ! To manage the profiles.
.SH SEE ALSO
The project is hosted on github, for more information: https://github.com/MaximilienLIX/admin
.SH BUGS
If you find a bug you can send me an email at: mrgamerlix@gmail.com
.SH AUTHOR
Maximilien Di Dio (mrgamerlix@gmail.com)
Manuel à placer dans /usr/local/man/man1/ puis ensuite

Code : Tout sélectionner

sudo gzip /usr/local/man/man1/admin.1 
(admin.1 soit le nom du manuel en fait :P )
D'ailleurs pour ce dernier, /usr/local/man/man1 est-il un bon emplacement ? (pour un manuel d'un commande ? Euh oui faut placer le script dans /usr/bin c'est plus pratique )

Re: [bash] mon script est lent

Publié : dim. 15 mars 2015, 00:39
par Xorg
Maximilien LIX a écrit :J'ai ajouté à mon script deux fonctionnalités permettant d'éditer le fichier de configurartion de syslinux et de le mettre à jour.
Tu sais, Syslinux, ce n'est pas comme Grub. Quand tu modifies le fichier de configuration de Syslinux, il n'y a pas besoin de faire une étape supplémentaire, le changement est directement effectif. Par contre s'il y a une erreur dans le fichier, c'est une autre histoire.
Maximilien LIX a écrit :D'ailleurs pour ce dernier, /usr/local/man/man1 est-il un bon emplacement ? (pour un manuel d'un commande ? Euh oui faut placer le script dans /usr/bin c'est plus pratique )
Oulah, je rebonds là dessus... Dans le FHS, il est dit à peu près ceci :
- /{bin,sbin}, c'est la hiérarchie primaire, réservée aux commandes de base
- /usr/{bin,sbin}, c'est la hiérarchie secondaire, c'est censé ne pas être indispensables à un système minimaliste
- /usr/local/{bin,sbin}, c'est la hiérarchie tertiaire, pour les données locales, comme par exemple des applications compilées à la main

Sous Arch, tous les paquets utilisent le répertoire /usr/bin (ou bien on peut aussi trouver des binaires dans le /opt). Moi j'aime bien ne pas toucher au /usr, tout ce que j'installe à la main, je le mets dans le /usr/local.
Donc oui, /usr/local/man est un bon emplacement, tout comme /usr/local/bin en serait un bon pour ton script.

La hiérarchie tertiaire est dans le PATH, ça ne pose pas de problème. Par l'expérience, il y a bien le PATH de ld qui, par défaut, ne charge pas les bibliothèques qui se trouvent là-bas. :)
Mais si tu comptes faire un paquet, celui-ci devra installer les fichiers dans le /usr.

Re: [bash] mon script est lent

Publié : lun. 16 mars 2015, 21:35
par Maximilien LIX
Ok merci pour ces précieuses informations :D

J'adapterai mon script en conséquence !

Re: [bash] mon script est lent

Publié : mer. 18 mars 2015, 22:51
par Xorg
D'ailleurs oui j'y pense, je rejoins ce que disait Benjarobin :

Code : Tout sélectionner

FIREFOX_DEFRAG="$(for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done)"
Dans tous les cas, ça va être interprété de la façon suivante : la viariable FIREFOX_DEFRAG va recevoir l'exécution de la ligne $(for i in ~/.mozilla/firefox/*/*.sqlite; do sqlite3 $i 'VACUUM;'; done). Donc dans tous les cas, c'est traité même si l'utilisateur ne le demande pas.

J'utiliserais plutôt une fonction à la place, telle :

Code : Tout sélectionner

firefox_defrag() {
	for i in ~/.mozilla/firefox/*/*.sqlite; do
		sqlite3 $i 'VACUUM;'
	done
}
Et du coup :

Code : Tout sélectionner

       ...
        "-firefox")
        case $2 in
                "-defrag")
                firefox_defrag
                ;;
                "-profile")
                ...
Mais après comme tu as fait dans ton message du 12 Mars ça va très bien aussi, c'est juste l'histoire d'avoir du bagage. :wink: