Critique script shell : optimisation taille pdf sous linux

tantal_fr

Grand Maître
Bonjour,
Version final :

Je m'essaye , actuellement, à la programmation bash afin de réaliser des scripts pour me faciliter la vie.

J'aurais aimé avoir des critiques sur mon code pour que je puisse m'améliorer. Par la même occasion, en cas de perte de mon script : une petite recherche google et je retomberais sur ce post. ;)
Peut-être que quelqu'un pourra être intéressé par ce script.

Mon besoin initial est d'optimisé la taille des pdf générés par mon scanner ; ils sont, par défaut, trop volumineux pour être envoyé par mail.

Donc voici le code :

C:
#!/bin/bash

DPI=150
OUTPUT=""
INPUT=""
OVERWRITE=0
ULTRA=0
ULTRA_THRESHOLD="55%"

MANQUE_IMAGEMAGICK=69
MANQUE_GHOSTSCRIPT=68
MANQUE_POPPLER=67
ERR_INPUT=66
ERR_OUTPUT=65
FILE_EXIST=64
USAGE=63

PDFTOPS_BIN="/usr/bin/pdftops"
PS2PDF_BIN="/usr/bin/ps2pdf14"
CONVERT_BIN="/usr/bin/convert"
PDF_INFO="/usr/bin/pdfinfo"
TIFF2PDF_BIN="/usr/bin/tiff2pdf"	#libtiff est une dépendance de ghostscript
TIFFCP="/usr/bin/tiffcp"		#libtiff est une dépendance de ghostscript
  
help() { 
 echo "Utilisation : $(basename $0) [options] <PDF-file(input)> [<PDF-file(output)]" 
 echo "-h : aide ci présente" 
 echo "-d : résolution du pdf final en point par pouce, par defaut : 150ppp"
 echo "-U : mode Ultra /!\\ perte conséquente d'information + conversion en N&B : vérifier le résultat"
 echo "-o : écraser la cible si elle existe"
 exit $USAGE
}

if [ ! -x "$PDFTOPS_BIN" ]; then # existence de pdftops
    echo "pdfopts inexistant, il fait partit du paquet poppler"   
    exit $MANQUE_POPPLER
fi

if [ ! -x "$PS2PDF_BIN" ]; then # existence de ps2pdf14
    echo "ps2pdf inexistant, il fait partit du paquet ghostscript"   
    exit $MANQUE_GHOSTSCRIPT
fi

echo

while getopts ":hd:oU" Option
do
  case $Option in
    h	) help;;
    d   ) 
      if [ "$OPTARG" -eq "$OPTARG" ] 2>/dev/null; then
	DPI=$OPTARG 
      else 
	echo "Veuillez donner une valeur numerique a votre DPI" 
	echo
	exit 
      fi;;
    o 	) OVERWRITE=1;;
    U	) 
	echo "Mode Ultra /!\\ perte conséquente d'information + conversion en N&B: vérifier le résultat"	
	ULTRA=1;;
    *   ) echo "Option non implémentée."
      echo
      help;;   # DEFAULT
  esac
done

shift $(($OPTIND - 1))  # On décrémente le nombre d'arguments du nombre d'options

if [ ! -n "$1" ]	# $1 => fichier source
then    
  echo "Merci d'indiquer un fichier source"
  echo
  help
else  
  INPUT=$1
  if [ ! -r "$INPUT" ]	# $1 peut-on lire le fichier source ?
  then 
    echo "Fichier \"$(basename "$INPUT")\" introuvable ou permissions insuffisantes"
    exit $ERR_INPUT
  fi
  if [ ! -n "$2" ]	# $2 => Si pas de fichier résultat => génération d'un nom de fichier 
  then 
    echo "$INPUT"
    OUTPUT="$(dirname "$INPUT")/out_$(basename "$INPUT")"
  else 
    OUTPUT="$2"
  fi
fi  

if [ $OVERWRITE == 0 ] && [ -e "$OUTPUT" ] # Si option overwrite non précisé et fichier existant => Exit
then
   echo "Le fichier \"$OUTPUT\" existe déjà, utiliser l'option -o pour écraser"
   exit $FILE_EXIST
else
  if [ ! -w "$(dirname "$OUTPUT")" ]
  then 
    echo "Impossible d'écrire le fichier \"$OUTPUT\""
    exit $ERR_OUTPUT
  fi
fi

echo "Récapitulatif :"
echo "DPI = $DPI"
echo "Input = $INPUT"
echo "Output = $OUTPUT"
echo "-------------------"


if [ $ULTRA == 1 ] 
then    			# Mode Ultra
  if [ ! -x "$CONVERT_BIN" ]; then # existence de pdftops
    echo "Le mode Ultra nécessite le paquet imagemagick"   
    echo
    exit $MANQUE_IMAGEMAGICK
  fi
  TIFF_MULTI=`mktemp`
  TIFF="`mktemp`.tif"
  pages=$($PDF_INFO "$INPUT" | grep Pages: | sed -E 's/(.*) (\d*)/\2/g')  
  for i in `seq 1 $pages`;		# conversion en tiff de chaque page du pdf source
    do        
        echo "Page $i sur $pages"
        eval "$CONVERT_BIN -define pdf:use-trimbox=true -type Grayscale -blur 0 -density 600 -quality 95 -threshold $ULTRA_THRESHOLD \"$INPUT\"\[$(($i - 1 ))\] $TIFF"
	eval "$TIFFCP -a $TIFF $TIFF_MULTI" # ajout de la page en cours dans un tiff multipage temporaire.
    done
  eval "$TIFF2PDF_BIN -p a4 -F -j -q 75 -t "$(basename \"${INPUT}\")" $TIFF_MULTI -o \"$OUTPUT\""  #libtiff est une dépendance de ghostscript   
  rm "$TIFF"
  rm "$TIFF_MULTI"
  
else	  # Optimisation Normal
   FICHIER_TEMP_PS=`mktemp`
   CONFIG_IN=`mktemp`

  # Création fichier de configuration pour la conversion en PDF    
   echo "-dUseFlateCompression=true \
    -sPAPERSIZE=a4
    -dOptimize=true \
    -dProcessColorModel=/DeviceRGB \
    -dUseCIEColor=true\
    -r$DPI \
    -dDownsampleGrayImages=true \
    -dGrayImageResolution=$DPI \
    -dAutoFilterGrayImages=false \
    -dGrayImageDownsampleType=/Bicubic \
    -dDownsampleMonoImages=true \
    -dMonoImageResolution=$DPI \
    -dMonoImageDownsampleType=/Bicubic \
    -dDownsampleColorImages=true \
    -dColorImageResolution=$DPI \
    -dAutoFilterColorImages=false \
    -dColorImageDownsampleType=/Bicubic \
    -dPDFSETTINGS=/prepress \
    -sDEVICE=pdfwrite \
    $FICHIER_TEMP_PS" > $CONFIG_IN    

  echo "Étape 1 : Conversion en PostScript"
  eval "$PDFTOPS_BIN -paper match -nocrop -noshrink -nocenter -level3 -q \"$INPUT\" $FICHIER_TEMP_PS"

  echo "Étape 2 : Re-conversion en PDF"
  eval "$PS2PDF_BIN @$CONFIG_IN \"$OUTPUT\"" 
  rm $FICHIER_TEMP_PS
  rm $CONFIG_IN
fi

exit 0

Merci
 

zeb

Modérateur
Quelques critiques, plus ou moins objectives, si tu veux bien.

Tu utilises toute une gamme de codes de retour.
Est-ce bien utile ?

Par principe, le code de retour est un niveau d'erreur :
0) - niveau nul : pas d'erreur, tout va bien.
1) - alerte !
2) - gros problème.
...

Typiquement, la demande d'aide (--help) ne devrait pas renvoyer autre chose que 0.
Toujours par principe, on classe les erreurs en deux gros types : les demandes farfelues venant de l'utilisateur, les problèmes venant du système.
Si le fichier d'entrée n'existe pas, ou que le fichier de sortie existe déjà, on s'arrête avec un niveau d'erreur 1. C'est bien l'utilisateur qui demande un truc pas faisable.
En revanche, si le disque est plein, si le programme explose la mémoire, etc., c'est d'un autre niveau.

Encore par principe, tous les messages d'erreur doivent être envoyés vers STDERR (fichier de descripteur 2).
Voici comment faire :
C:
echo "Veuillez donner une valeur numerique a votre DPI" >&2

Un message d'erreur canonique doit en outre préciser quelle commande plante. Donc :
C:
echo "$(basename $0): Veuillez donner une valeur numerique a votre DPI" >&2

L'utilisation de la commande getopts et du shift est une très bonne chose.
Mais tu en fais trop. C'est la commande qui vérifie si un argument est fourni ou pas.
Donc ton code de vérification de l'option -d ne sera pas exécuté.
(En plus, il est très mal écrit : pas de nom de commande, pas de redirection vers STDERR, pas de code de retour supérieur à zéro).
Pas plus que tes options non implémentées.

[fichier source]
Je n'aime pas voir un else après un code qui a exécuté un exit.

Je te propose de sortir le exit de la fonction help().
Si l'utilisateur demande de l'aide (-h), affiche-la et quitte explicitement avec un exit 0.
Si l'utilisateur se plante, affiche l'aide puis quitte explicitement avec un exit 1.

Et tu ne seras pas obligé de garder l'indentation dans un else devenu inutile.

[Si option overwrite non précisé et fichier existant => Exit]
Décidement, je doit ne pas aimer les elses.
Tu as là un beau else if à transformer en elif !

Tu utilises les backquotes (`). Rien de mal à ça.
Mais tu précises quand même dans le hashbang que le shell est bash.
Alors certes, il est rétroactivement compatible avec le bsh originel, mais tu peux utiliser la syntaxe $(..). (ce que tu fais ligne 119 !)

N'hésite pas à utiliser rm avec ses options -f et -r.

M'enfin, à quoi sert donc ce exit 0, tout à la fin ?
Le code de retour du script est le code retour de la dernière commande. Il est impératif que si une erreur est générée, ton script la transmette.
Vire-moi ça !

Et si tu veux vraiment des critiques pas gentilles, je trouve que tu parles trop.
"Le silence est d'or" (http://fr.wikipedia.org/wiki/Philosophie_d%27Unix)
Alors supprime tous les echo qui ne seraient pas redirigés vers STDERR.
Quitte à ajouter l'option -v (volubile/verbeux) pour les remettre, mais à la demande expresse de l'utilisateur !

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Enfin, je t'invite à consulter ce petit topic :
 

tantal_fr

Grand Maître
Merci Zeb, j'espère que tu as bien profité de tes congés.

Merci beaucoup pour tes commentaires, je regarde ça en détail ce week-end :bounce:
Je me suis servi de ce .

Le que tu me donne est une mine d'or, je vais m'en inspirer (faut que j'étudie la commande trap.



 

zeb

Modérateur
J'ai jeté un coup d’œil au site de l'IUT de Rodez. Ça m'a l'air très pédagogique. Je devrais tout lire, j'y apprendrais sans doute des trucs. ;)

Le lien est disponible depuis longtemps dans la (pauvre) liste des tutos. Je suis déçu que tu ne l'aies pas trouvé par toi-même. C'est sans doute que notre forum manque de clarté. Ce topic des trucs sur le shell est aussi le tien. Tu peux le compléter si tu veux. Et moi, je veux bien y ajouter des astuces dont on aurait discuter dans un autre fil, par exemple.

Quant à la commande trap, elle est juste géniale. Sauf que je ne la vois que trop peu. Et pourtant, je relis des scripts écrits par des plus malins que moi (IBM, ORACLE, ...)

Tu utilises pleins de fichiers temporaires. Regarde un peu la grosse astuce du répertoire temporaire. ;)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Tiens, j'ai réfléchi à ton programme, et j'aurai d'autres trucs à dire :

Utilisation : $(basename $0) [options] <PDF-file(input)> [<PDF-file(output)]"

A priori, rien à redire à ça. Sauf que si tu fais un script, c'est que tu as plein de fichiers à traiter.
Alors je te propose plutôt ça :

Utilisation : $(basename $0) [-hfU] [-d DPI] [-o output_ref] input_ref.. "

? :gne:

Alors, voilà : j'ai remplacé le "o" de overwrite par le "f" de force.
Et je me réserve ainsi le "o" de ouptput pour donner un nom au fichier de sortie.
Mais surtout, je permet au script de prendre plusieurs fichiers à traiter en entrée.
Dans le cas où plusieurs fichiers sont donnés en entrée, il ne faudra pas prétendre utiliser l'option -o, bien sûr.

Et tu te retrouves avec un script qui accepte des options et des paramètres, à la façon de beaucoup d'autres commandes UNIX.
:)
 

zeb

Modérateur
Concernant getopts, tout ce que je t'ai dit est vrai, puisque tu commences ta chaîne d'options par ":". Sinon, eh, relis ce fichu manuel ;)
 

tantal_fr

Grand Maître

My bad, je n'y ai même pas pensé :pfff:

J'y comptais, :love:


Bien vu. Je me demandais aussi comment gerer les wilcards * et ?
 

zeb

Modérateur
Bof... C'est du archi-classique ! Et du "best practice".
Las, plus personne ne s'intéresse à ça.
Et Linux avec X et Gnome/KDE transforment le monde UNIX en clic-o-drome :(


Je me demandais aussi comment gerer les wilcards
Ah non !
Relis ton cours de Rodez, ton programme ne verra jamais les wilcards !

C'est le shell qui fait la complétion avant de lancer ton programme.

Ainsi, si tu as trois fichiers PDF (un.pdf, deux.pdf et trois.pdf) dans ton répertoire et que tu tapes la commande mon_script *.pdf, le shell exécute la commande mon_script un.pdf deux.pdf trois.pdf. Et dans ton script, tu ne sais pas qu'il y a eut utilisation de wildcards.

D'où l'intérêt de traiter des fichiers d'entrée, et non pas un fichier.

Aller, un petit devoir à la maison :

C:
#!/usr/bin/ksh

USAGE="Syntaxe : $(basename $0) [-options] [-option param ..] ref.."
VERSION="version 0.1 - Licence: fais-en bon usage, c'est tout !"

# ======================================================================
# options longues (type GNU) une bonne fois pour ne pas y revenir.
# exit 0 à chaque option

if [ "$1" = "--help" ] ; then
	print -- "$USAGE"
	print -- "explication sur les options"
	exit 0
fi

if [ "$1" = "--version" ] ; then
	[ -t 1 ] && print -n "\033[1m"
	print -n -- "$(basename)"
	[ -t 1 ] && print -n "\033[0m"
	print -- " - $VERSION"
	exit 0
fi

# ======================================================================
# options courtes traitées de manière classique (UNIX)
# remarquons la manière subtile de mettre dans la variable l'option 
# telle qu'elle serait présente sur une ligne de commande au cas où on 
# aurait à la réutiliser

OPT_V=''
OPT_F=''
OPT_R=''
OPT_L=''
OPT_O=''

while getopts ":vfrlo:" OPTION ; do
	case $OPTION in
		'v')	OPT_V='-v' ;; # volubile
		'f')	OPT_F='-f' ;; # force
		'r')	OPT_R='-r' ;; # récursif
		'l')	OPT_L='-l' ;; # long
		'o')	OPT_O='-o' ; OUTFILE="$OPTARG" ;; # fichier de sortie
		'?')	echo "$(basename $0): mauvais paramètre" >&2
				exit 2 ;;
	esac
done
shift $(( $OPTIND-1 ))

# ======================================================================
# Si pas de fichier donné, on prend les données sur l'entrée standard
[ $# -eq 0 ] && {

	# /!\ soit l'un, soit l'autre /!\

	# artillerie lourde - réutilisation des options !
	exec "$0" "$OPT_V" "$OPT_F" "$OPT_R" "$OPT_L" "$OPT_O$OUTFILE" "-"
	# le programme s'arrête ici. Le EXEC a écrasé le processus courant

	# infanterie légère
	set - "-"
	# le programme continue
	# par convention, "-" représente l'entrée standard. cf. man 1 cat
}

# ======================================================================
# vérification des éventuelles commandes externes. Observons que ces 
# dépendances peuvent être fonction des options. C'est pourquoi le
# traitement des options a été fait avant.

PDFTOPS_BIN="/usr/bin/pdftops"                                                       
PS2PDF_BIN="/usr/bin/ps2pdf14"                                                       
CONVERT_BIN="/usr/bin/convert"                                                       
PDF_INFO="/usr/bin/pdfinfo"                                                          
TIFF2PDF_BIN="/usr/bin/tiff2pdf"
TIFFCP="/usr/bin/tiffcp"

for EXTCMD in "$PDFTOPS_BIN" "$PS2PDF_BIN" "$CONVERT_BIN" "$PDF_INFO" "$TIFF2PDF_BIN" "$TIFFCP" ; do
	[ -x "$EXTCMD" ] || {
		echo "$(basename $0): commande externe '$(basename "$EXTCMD")' absente." >&2
		exit 2
	}
done
[ "$OPT_V" ] && print "jusqu'ici, tout va bien, les commandes externes sont toutes disponibles."

# ======================================================================

RC=0
for REF ; do
	# Oh, mais, il n'y a rien derrière le "for REF" ?!


	[ "$OPT_V" ] && print "On va traiter le fichier '$REF'..."

	# technique n°1 dite "je maîtrise tout !"
	# ---------------------------------------------------
	if [ "$REF" = "-" ] ; then
		# traitons l'entrée standard
		{ commandes_de_traitement ; }
	elif [ -e "$REF" -a -f "$REF" -a -r "$REF" ] ; then
		# traitons le fichier puisqu'il existe, qu'il en est un et qu'il est lisible
		{ commandes_de_traitement ; }
	else
		# sinon, un petit message
		echo "$(basename $0): il y a un truc qui ne fonctionne pas. Zut!." >&2
		RC=1
	fi

	# technique n°2 
	# les meilleurs scripts sont des filtres !
	# ---------------------------------------------------
	cat "$REF" | { commandes_de_traitement ; } || RC=1
	# en cas de problème sur l'entrée (fichier inexistant, illisible) c'est "cat" qui se débrouille (message d'erreur)


	[ "$OPT_V" ] && print "Fichier '$REF' traité."
done

exit $RC
 

tantal_fr

Grand Maître
Salut zeb, j'ai pas trop eu le temps de m'y mettre ce week-end ; j'ai regardé vite-fait, ton script, il y a pas mal de truc intéressants (genre le for REF ; do). je vais surement partir de ça et adapter pour mon usage. Merci.

Par contre, il manque un then après le elif.
 

zeb

Modérateur
Plus maintenant :o ... ;)

M'enfin, tu fais bien ce que tu veux de tes w.-e.
Moi, ce w.-e., c'était Braderie de Lille !
 

tantal_fr

Grand Maître
Salut ;)
Me revoilà. J'ai un peu bossé sur le sujet et.. tadam !

C:
#!/bin/ksh

DPI=150
ULTRA_THRESHOLD="55%"

PDFTOPS_BIN="/usr/bin/pdftops"		#poppler
PS2PDF_BIN="/usr/bin/ps2pdf14"		#gostscript
CONVERT_BIN="/usr/bin/convert"		#imagemagick
TIFF2PS_BIN="/usr/bin/tiff2ps"		#libtiff est une dépendance de ghostscript

USAGE="Syntaxe : $(basename $0) [-options] [-option param ..] ref.."
VERSION="version 0.1 - Licence: fais-en bon usage, c'est tout !"
 
# ======================================================================
# options longues (type GNU) une bonne fois pour ne pas y revenir.
# exit 0 à chaque option
 
if [ "$1" = "--help" ] ; then
	print -- "$USAGE"
	print -- "explication sur les options"
	exit 0
fi
 
if [ "$1" = "--version" ] ; then
	[ -t 1 ] && print -n "\033[1m"
	print -n -- "$(basename)"
	[ -t 1 ] && print -n "\033[0m"
	print -- " - $VERSION"
	exit 0
fi

# ======================================================================
# options courtes traitées de manière classique (UNIX)
# remarquons la manière subtile de mettre dans la variable l'option 
# telle qu'elle serait présente sur une ligne de commande au cas où on 
# aurait à la réutiliser
 
OPT_V=''
OPT_F=''
OPT_U=''
OPT_L=''
OPT_O=''
OPT_K=''
 
while getopts ":vfUlko:" OPTION ; do
	case $OPTION in
		'v')	OPT_V='-v' ;; # volubile
		'f')	OPT_F='-f' ;; # force
		'U')	OPT_U='-U' ;; # mode ultra
		'l')	OPT_L='-l' ;; # long
		'k')	OPT_K='-k' ;;
		'o')	OPT_O='-o' ; OUTFILE="$OPTARG" ;; # fichier de sortie
		'?')	echo "$(basename $0): mauvais paramètre" >&2
				exit 2 ;;
	esac
done
shift $(( $OPTIND-1 ))

# ======================================================================
# Si pas de fichier donné, on prend les données sur l'entrée standard
[ $# -eq 0 ] &&  set - "-"
	# le programme continue
	# par convention, "-" représente l'entrée standard. cf. man 1 cat

 
# ======================================================================
# vérification des éventuelles commandes externes. Observons que ces 
# dépendances peuvent être fonction des options. C'est pourquoi le
# traitement des options a été fait avant.

for EXTCMD in "$PDFTOPS_BIN" "$PS2PDF_BIN" "$CONVERT_BIN" "$TIFF2PS_BIN"  ; do
	[ -x "$EXTCMD" ] || {
		echo "$(basename $0): commande externe '$(basename "$EXTCMD")' absente." >&2
		exit 2
	}
done
[ "$OPT_V" ] && print "jusqu'ici, tout va bien, les commandes externes sont toutes disponibles."
	
# ======================================================================	
# Création dossier temporaire 

while true ; do
   TMPDIR="/tmp/$(basename $0).$$.$RANDOM" 
   [ ! -e "$TMPDIR" ] && mkdir -m 700 -p "$TMPDIR" && break || exit 2
done


RC=0
for REF ; do # On traite chaque fichier en argument

	# Fichiers temporaires	
 	TMP_CONF="$TMPDIR/config_$(basename "$REF").in"
	TMP_PS="$TMPDIR/tmp_$(basename "$REF").ps"
	TMP_TIFF="$TMPDIR/tmp_$(basename "$REF").tiff"
	
	[ "$OPT_V" ] && print "On va traiter le fichier '$REF'..."
	
	# Fichier de configuration pour la conversion en PDF 
	echo "-dUseFlateCompression=true \
		  -sPAPERSIZE=a4
		  -dOptimize=true \
		  -dProcessColorModel=/DeviceRGB \
		  -dUseCIEColor=true\
		  -r$DPI \
		  -dDownsampleGrayImages=true \
		  -dGrayImageResolution=$DPI \
		  -dAutoFilterGrayImages=false \
		  -dGrayImageDownsampleType=/Bicubic \
		  -dDownsampleMonoImages=true \
		  -dMonoImageResolution=$DPI \
		  -dMonoImageDownsampleType=/Bicubic \
		  -dDownsampleColorImages=true \
		  -dColorImageResolution=$DPI \
		  -dAutoFilterColorImages=false \
		  -dColorImageDownsampleType=/Bicubic \
		  -dPDFSETTINGS=/prepress \
		  -sDEVICE=pdfwrite \
		  "$TMP_PS"" > "$TMP_CONF"   
	


	[ ! "$OPT_O" ] && OUTFILE="$(dirname "$REF")/out_$(basename "$REF")"
	[ "$OPT_V" ] && print "Fichier de sortie : $OUTFILE"
	if [ -e "$OUTFILE" -a ! "$OPT_F" ]; then
	  echo "$OUTFILE existe déja" >&2
	  echo "Utilisez l'option \"-f\" pour passer outre">&2
		exit 2
	fi
	
	if [ "$OPT_U" ]; then   # Mode Ultra
	   
	    # les meilleurs scripts sont des filtres !
	    # ---------------------------------------------------
	    cat "$REF" | { 
	      eval "$CONVERT_BIN -define pdf:use-trimbox=true -type Grayscale -density 600 -quality 95 -threshold $ULTRA_THRESHOLD - "$TMP_TIFF"" ; 
	    } || RC=1 
	    [ $RC -eq 0 ] && eval "$TIFF2PS_BIN -a -p "$TMP_TIFF" > "$TMP_PS""  || RC=1
	     # en cas de problème sur l'entrée (fichier inexistant, illisible) c'est "cat" qui se débrouille (message d'erreur)
	 else   # Mode normal
	    
	    # les meilleurs scripts sont des filtres !
	    # ---------------------------------------------------
	    cat "$REF" | {
	      eval "$PDFTOPS_BIN -paper match -nocrop -noshrink -nocenter -level3 -q - "$TMP_PS"" ;	    
	    } || RC=1 
	 fi
	 [ $RC -eq 0 ] && eval "$PS2PDF_BIN  @"$TMP_CONF" "$OUTFILE"" || RC=1
	 [ "$OPT_V" ] && print "Fichier '$REF' traité."
done
 
if [ $RC -ne 0 ]; then
    echo "$(basename $0): Il y a eu une erreur quelque part ; le dossier $TMPDIR n'est pas effacé" >&2
    exit $RC
fi
rm -rf $TMPDIR
# That's all Folks!


Edit : mise à jour suivant commentaires du poste suivant ; merci zeb ;)
 

zeb

Modérateur
Pas mal. Mais puisque le sujet s'appelle critique, allons-y gaiment !

Attention, les commentaires ne correspondent pas tous.
Un coup, tu écris tes tests avec un signe égal (=), l'autre coup avec deux (==).
On teste les égalités et inégalités numériques avec -lt -le -eq -ne -ge et -gt.
Je t'invite lors du dernier test, à ne pas comparer ta variable avec 1, mais avec 0 :

C:
if [ $RC -ne 0 ]; then
    echo "$(basename $0): Il y a eu une erreur quelque part ; le dossier $TMPDIR n'est pas effacé" >&2
    exit $RC
fi
rm -rf $TMPDIR
# That's all Folks!

Observe encore que je ne quitte pas explicitement avec un exit. En effet, la dernière commande (rm), pour une raison ou l'autre, pourrait ne pas fonctionner. Il ne faut donc jamais forcer une sortie correcte (0).

Sinon, je ne trouve pas autre chose à redire :/ ... ;) :p
 

zeb

Modérateur
8) Trop bien ce script. Peut-on en rajouter ?
Bof, le mieux est l'ennemi du bien.

Allons-y quand même.

D'abord, je n'aime pas beaucoup le principe de laisser trainer des trucs dans le répertoire temporaire.
C'est d'ailleurs un bon point de départ pour s'intéresser à la commande trap.

Ensuite, les paramètres dans un fichier, c'est discutable. Donc on peut en discuter.
Pourquoi ne pas les mettre dans une variable ?

C:
PARAMS="-dUseFlateCompression=true \
    -sPAPERSIZE=a4
    -dOptimize=true \
    ...
    "

Enfin, ... c'est sans fin ! :D
 

tantal_fr

Grand Maître
Salut zeb :hello:

On peux ajouter pas mal de chose en effet, j'avais penser à rajouter une partie qui fait un OCR et réinjecte le texte dans le PDF, ça permet l'indexation et la recherche. J'ai préféré en faire un script à part, il y a pas mal de dépendances. Si ça intéresse, je peux aussi le poster ici.
Le script est publié sous license , tout est possible :fille:

Je regarderais la commande trap sur laquelle j'avais déjà jeté un œil. Par contre le fait d'avoir la possibilité de garder les fichiers temporaires est plutôt intéressant d'un point de vue débogage ; c'est la même raison pour laquelle j'utilise un fichier plutôt qu'une variable pour le passage des paramètres.

Une fois le script dépourvu de bug on pourra passer par une variable :o

D'ailleurs, il me reste un ou deux petit bugs (i.e. : rajouter "-3 " à tifftops permet de résoudre un problème de marge coupé mais augmente la taille du pdf final)

J'ai une autre question, au niveau de la première ligne : si je met #!/bin/bash j'ai des avertissement au niveau des print sur ma debian, et #!/bin/ksh j'ai /bin/ksh not found sous archlinux (mais pas de warning avec #!/bin/bash .
 

zeb

Modérateur
Ben, /bin/bash c'est le Bourne again shell.
Et /bin/ksh c'est le kornshell.
Et le tout premier, /bin/sh, c'est le bourne shell.

Il y a rétro compatibilité : sh <- ksh <- bash

Sur beaucoup d'UNIX, le shell reste ksh, Et sur Linux, c'est surtout bash.

print est une commande ksh shell builtin qui fonctionne très bien.
On lui préfèrera peut-être la commande echo sous bash.

-----------------------

Non, non, non. Les fichiers temporaires, justement parce qu'ils sont temporaires, ne méritent que de disparaître à la fin ! :o
Je t'invite donc à ajouter une option, disons -d, avec un D comme debug, qui interdira la suppression du répertoire temporaire en cas de dysfonctionnement. 8)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 126
Messages
6 717 809
Membres
1 586 365
Dernier membre
matiOs1
Partager cette page
Haut