Tests en bash et $?

bash
Tags: #<Tag:0x00007f092b0a6708>

#1

Bonjour à tous,
J’ai un petit souci de compréhension. Ce n’est pas vital (quoi que) mais j’aimerai au moins comprendre.
Le contexte: je fais un petit script pour synchroniser quelques répertoire sur un disque externe. Avant de lancer rsync, je teste si /mnt est utilisé et le démonte si besoin. C’est le début, ça coince la (le reste fonctionne):

#!/bin/bash
set -x 
POINT_MONTAGE="/mnt"
EXCLUDE="/root/Excludes-Rsync.txt"
RSYNC="/usr/bin/rsync"

mount | grep -q $POINT_MONTAGE
if [ $? = 0 ]
then
    echo " point de montage $POINT_MONTAGE en cours d'utilisation. De-mountage en cours..."
    sync
    umount $POINT_MONTAGE > /dev/null 2>&1
    if [ $? != 0 ]
    then
            echo " erreur sur de-mountage ... EXIT!"
            exit 1
    fi
fi

echo "pas d'erreur"

J’ai pas du tout comprendre,: si j’ai /mnt d’utilisé, ca marche, si /mnt est libre, je n’arrive pas à “pas d’erreur” , le script s’arrête au premier “mount | grep $POINT_MONTAGE”
Et je n’ai aucun message d’erreur!

# ./Sauvegarde_test_0.sh
+ POINT_MONTAGE=/mnt
+ EXCLUDE=/etc/Excludes-Rsync.txt
+ RSYNC=/usr/bin/rsync
+ grep -q /mnt
+ mount

Si vous pouviez me donner votre avis, s’il vous plaît.
Merci.
Rémi.


#2

Bonjour rsuinux

Je te propose d’utiliser le script suivant :

#!/bin/bash
set -x 
POINT_MONTAGE="/mnt"
EXCLUDE="/root/Excludes-Rsync.txt"
RSYNC="/usr/bin/rsync"

if [ "$(stat --format='%m' $POINT_MONTAGE)" = "$POINT_MONTAGE" ]
then
    echo " point de montage $POINT_MONTAGE en cours d'utilisation. De-mountage en cours..."
    sync
    umount $POINT_MONTAGE > /dev/null 2>&1
    if [ $? != 0 ]
    then
            echo " erreur sur de-mountage ... EXIT!"
            exit 1
    fi
fi

echo "pas d'erreur"

Si /mnt n’est pas utilisé comme un point de montage,
c’est que /mnt est un sous-répertoire de la racine du système de fichiers
et dans ce cas, la commande

stat --format='%m' /mnt

retournera le nom du point de montage utilisé par
la racine du système de fichiers dans lequel se trouve le sous-répertoire /mnt => /

=======
Mais si /mnt est utilisé comme un point de montage,
cette même ligne de commande
retournera le nom du point de montage utilisé par
la racine du système de fichiers qui est monté sur le point de montage /mnt => /mnt


#3

@MicP
Merci pour ta réponse rapide.
Je viens de tester. L’idée est très bonne, et ça marche (quand je me gourre pas dans le script).
Ca c’est fait et je te remercie beaucoup.
Mais ce qui est marrant, c’est que j’ai mis le test, avec stat, mais la première fois, j’ai oublié d’enlever “mount | grep $POINT_MONTAGE” Et mon script c’est arreté net.
Je ne comprend pas pourquoi.

C’est pas grave. Ca marche, je vais pouvoir avancer.

Rémi.