[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: mais ou est passee la place manquante ?



hamster, au 2019-04-04 :
> #!/bin/bash
>
> homeUUID=$(grep "/home" /etc/fstab | grep -v "#" | cut -d"=" -f2 | cut
> -d" " -f1);
> homedevice=$(ls -l /dev/disk/by-uuid/ | grep $homeUUID | cut -d"/" -f3);
> tune2fs -m 0 /dev/$homedevice;
>
> Vu que je suis assez débutant en scripts, je veux bien le regard de
> votre sagacité dessus.

Bonjour,

Vous l'avez demandé ; vous l'aurez.  :)

Avant toute chose, il est préférable, quand une commande renvoie
un code d'erreur, d'arrêter le script aussitôt, ce que ne fait
pas bash par défaut, à moins de lui passer l'option `-e`.  Il
suffit d'ajouter la commande suivant pour corriger cela :

	set -e

Ensuite, j'aurais un peu ventilé pour éclaircir le propos, par
exemple comme suit :

	homeUUID=$(
		grep "/home" /etc/fstab \
		| grep -v "#" \
		| cut -d"=" -f2 \
		| cut -d" " -f1
	);

Cette manière de présenter le script est très aérée, et me
semble très lisible.  La substitution de commande et le
pipelining ressortent assez bien.  Mais comme il s'agit de
questions de style, peut-être que vous aurez des goûts
différents.

Ce n'est pas grand chose en soi, mais le saut de ligne permet de
séparer les commandes.  Le ';' n'est alors pas nécessaire, à
moins que vous préfériez ne pas perdre d'habitudes issue du C :

	homeUUID=$(
		grep "/home" /etc/fstab \
		| grep -v "#" \
		| cut -d"=" -f2 \
		| cut -d" " -f1
	)

Dans ce genre d'affectation de variable, ça ne changera pas
grand chose ; mais d'ordinaire, je protège mes toutes mes
évaluations (symbole '$') avec des doubles quotes '"' comme
suit, quel que soit le contexte :

	homeUUID="$(
		grep "/home" /etc/fstab \
		| grep -v "#" \
		| cut -d"=" -f2 \
		| cut -d" " -f1
	)"

L'utilisation de l'opérateur d'évaluation '$()', à la place des
historiques backtick '`', est un bon réflexe : il a un ouvrant
et un fermant, et dispose de sont propre contexte pour les '"',
qui ne vont donc pas fermer les doubles quotes se trouvant en
dehors de l'évaluation, contrairement aux backticks :

	echo "`grep \"\\\`du texte\\\`\" fichier`"

(Honnêtement, je ne suis même pas certain que la commande
ci-dessus fasse ce que je veux.)  À comparer avec la commande
suivante franchement moins fouillis en caractères
d'échappement :

	echo "$(grep "\`du texte\`" fichier)"

Pour l'évaluation du `homedevice`, en terme général, analyser la
sortie de la commande `ls` est dangereux, l'exemple typique
étant le traitement des fichiers avec des sauts de lignes
dedans.  Dans le répertoire /dev/disk/by-uuid, ça ne devrait pas
poser problème, mais l'usage de `ls` dans un script est un
mauvais réflexe très (trop) courant.  Une approche un peu plus
propre, à mon sens, pour résoudre le lien symbolique serait
d'utiliser `readlink` :

	homedevice="$(
		readlink -f "/dev/disk/by-uuid/$homeUUID"
	)"
	tune2fs -m 0 "$homedevice"

Ceci étant, quand on a des liens symboliques, c'est un peu
dommage de ne pas s'en servir, il est tout à fait possible
d'appliquer le `tune2fs` directement sur le disque par UUID.  Le
système se charge de résoudre le lien symbolique vers le fichier
bloc correspondant pour l'opération :

	homedevice="/dev/disk/by-uuid/$homeUUID"

À ce stade de la réflexion, le script ressemblerait donc à :

	#!/bin/bash
	set -e
	homeUUID="$(
		grep "/home" /etc/fstab \
		| grep -v "#" \
		| cut -d"=" -f2 \
		| cut -d" " -f1
	)"
	homedevice="/dev/disk/by-uuid/$homeUUID"
	tune2fs -m 0 "$homedevice"

Mais finalement, peut-être qu'on pourrait directement utiliser
le fichier bloc stockant /home tel que rapporté par la commande
`df`, plutôt que d'aller voir dans le fichier fstab, si
d'aventure il devait ne pas être à jour ?  (À moins bien sûr que
ce ne soit à dessein.)

	#!/bin/bash
	set -e
	homedevice="$(
		df /home \
		| grep -v '^Filesystem' \
		| cut -f1 -d' '
	)"
	tune2fs -m 0 "$homedevice"

Attention, si le /home n'est pas sur une partition séparée,
alors c'est la partition de / qui va se voir supprimer les blocs
réservés à root.  Avec le premier script, si le /home n'est pas
dans le fstab, et que `set -e` est présent, alors le script
s'arrête.

Pour aller plus loin, l'Advanced Bash Scripting guide est pour
moi un incontournable :

	http://www.tldp.org/LDP/abs/html/index.html

Il est également disponible en Français, même si j'ai quelque
difficultés avec la traduction :

	https://abs.traduc.org/abs-5.0-fr/

Voilà, prenez ce qui vous semble intéressant.  :)

Amicalement,
-- 
Étienne Mollier <etienne.mollier@mailoo.org>

Ligne de commande épique :
# tune2fs -m0 "$(df /home|sed -n '2s/^\([^ \t]\+\).*/\1/p')"



Reply to: