Lock
ou comment créer un fichier de lock en bash
LOCK_FILE=/var/run/$(basename $0).lock
kill -0 $(cat $LOCK_FILE 2>/dev/null) 2> /dev/null
if [ $? -eq 1 ]
then
echo $$ > $LOCK_FILE
else
echo "process en cours"
exit 1
fi
Version courte :
LOCK_FILE=/var/run/$(basename $0).lock
kill -0 $(cat $LOCK_FILE 2>/dev/null) 2> /dev/null && exit 1 || echo $$ > $LOCK_FILE
Substitution
ou comment éviter d’appeler sed. L’inconvénient c’est que ça ne fonctionne que sur une variable et pas sur l’entrée standard. Si l’on a :
FOO="titi.toto"
La ligne
FOO=$(echo $FOO| sed -e 's/toto/txt/g')
peut s’écrire
FOO=${FOO/toto/txt}
Ce qui, il faut l’avouer, est beaucoup plus court.
Progression
Comment afficher la progression d’un script bash en supposant que nous ayons dans $TOTAL le nombre total d’itérations :
COUNT=0;
for i in $(seq 1 $TOTAL)
do
#Process
# ...
COUNT=$(($COUNT + 1))
DIV=$(echo "$COUNT % ($TOTAL / 100)" | bc )
[ $DIV -eq 0 ] && echo -e -n "\r$COUNT / $TOTAL"
done
echo -e "\r$TOTAL / $TOTAL"
Ligne à ligne
IFS_OLD=$IFS
IFS=$'\n'
for line in $(cat file)
do
....
done
IFS=$IFS_OLD