it-swarm.com.de

Ungebundene Variable mit Bash-Skript

Beim Debuggen meines Skripts werde ich verzweifelt. Ich habe einige Konstruktionen verwendet, die mir von meinem älteren Kollegen empfohlen wurden, und ich weiß nicht, wie ich es richtig machen soll.

 #!/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

An den execs kann ich sehen, dass es ein Problem mit der ungebundenen Variablen für den Teil tee -a $log Gibt, couple commands Wird in Ordnung ausgeführt. Ich habe versucht, Backtics im Protokollpfad zu verwenden, aber das hat keinen Nutzen gebracht. Ich vermute dasselbe Problem mit fs_lock_file, aber ich habe die Protokollierung noch nicht zuerst behoben.
Kann jemand meine Augen öffnen und mir sagen, was ich vermisse? Ich bin nicht in der Lage, die Skriptprotokollierung auf den angegebenen Pfad durchzuführen.

8
k_mishap

Sie weisen die Variable log in einer Subshell( [...] ) Zu. Diese Variable ist nicht außerhalb dieser Unterschale gebunden.

In diesem Fall ist es am besten, log außerhalb der Unterschale zu setzen, d. H. Die Variablenzuweisung vor den Unterschalenblock zu verschieben.

Im Allgemeinen können Sie in ähnlichen Fällen versuchen, die Klammern in der Unterschale durch geschweifte Klammern zu ersetzen (Gruppenbefehlssyntax) { [...] }.

Gruppenbefehle werden in der aktuellen Shell ausgeführt. Beachten Sie, dass im Gegensatz zur Subshell-Syntax Listen mit einem Zeilenumbruch oder einem Semikolon abgeschlossen werden müssen (siehe Zusammengesetzte Befehle im Abschnitt Listen auf der Hilfeseite bash (1)).

Und als allgemeine Best Practice hilft das Festlegen von Variablennamen, insbesondere von Konstanten am Anfang eines Skripts oder einer Funktion, diese Art von Fehler zu vermeiden.

5
Michael Jaros