web-dev-qa-db-fra.com

Variable non liée avec le script bash

Je deviens désespéré lors du débogage de mon script, j'ai utilisé certaines constructions recommandées par mon collègue et je ne sais pas comment le faire fonctionner correctement.

 #!/bin/bash -x
set -ueo pipefail
exec &>/tmp/dq.log
source ${BASH_SOURCE%/*}/env-prd.sh

times=${2:-1}
sleep=${3:-1}

name="all-dq_hourly"


fs_lock_file="/tmp/mwa/jobs/prd-${name}.lock"

( flock -n 200
    log="/var/log/mwa/prd/$(date +%Y-%m-%d)__${name}.log"
    for i in $(seq 1 $times); do
        if [[ ! -f /tmp/stop ]]; then
        couple commands

      fi
        sleep $sleep
    done

) 200>"$fs_lock_file" | tee -a $log

rm $fs_lock_file

D'après les execs, je peux voir qu'il y a un problème avec la variable non liée pour le tee -a $log partie, couple commands s'exécute correctement. J'ai essayé d'utiliser des backtics dans le chemin du journal, mais sans aucun avantage. Je soupçonne le même problème avec fs_lock_file, mais je n'ai pas encore corrigé la journalisation.
Quelqu'un peut-il ouvrir les yeux et me dire ce que je manque? Je ne suis pas en mesure de rendre la journalisation du script vers le chemin spécifié.

8
k_mishap

Vous affectez la variable log à l'intérieur d'un sous-shell( [...] ). Cette variable n'est pas liée en dehors de cette sous-couche.

Dans ce cas, il est probablement préférable de simplement définir log en dehors du sous-shell, c'est-à-dire de déplacer l'affectation de variable avant le bloc du sous-shell.

Généralement, dans des cas similaires, vous pouvez essayer de remplacer les parenthèses du sous-shell par des accolades (syntaxe de commande de groupe) { [...] }.

Les commandes de groupe sont exécutées dans le shell actuel. Notez que contrairement à la syntaxe de sous-shell, les listes doivent être terminées par un saut de ligne ou un point-virgule, voir Commandes composées dans la section Listes de la page de manuel bash (1).

Et en tant que meilleure pratique générale, définir des noms de variables, en particulier des constantes au début d'un script ou d'une fonction, permet d'éviter ce type de bogue.

5
Michael Jaros