Erst das Bash-Skript reparieren
Bevor du migrierst, bring das Skript auf einen Stand, an dem sich sein Verhalten überhaupt beurteilen lässt. Oft stellt sich dabei heraus, dass die Aufgabe für Bash völlig in Ordnung war und nur die Umsetzung nicht.
#!/usr/bin/env bash
set -euo pipefail
log() { printf '%s %s\n' "$(date -Is)" "$*" >&2; }
tmp="$(mktemp -d)"
trap 'rm -rf "$tmp"' EXIT # räumt auch bei Abbruch auf
# Nur ein Lauf gleichzeitig, sonst zerlegen sich zwei Cron-Jobs gegenseitig
exec 9>/var/lock/deploy.lock
if ! flock -n 9; then
log "läuft bereits, breche ab"
exit 0
fiset -e greift nicht in if-Bedingungen, nicht in &&-Ketten und nicht bei Funktionen, deren Rückgabewert geprüft wird. Verlass dich also nicht blind darauf. Die Sperre über flock ist der billigste Schutz gegen den Klassiker, dass ein langer Lauf noch aktiv ist, wenn der nächste startet.
bash -n deploy.sh # reine Syntaxprüfung ohne Ausführung
shellcheck -S style deploy.sh # findet Quoting-Fehler und set -e-Fallen
shfmt -d -i 2 deploy.sh # zeigt Formatabweichungen als Diffshellcheck gehört in die Pipeline, nicht in den guten Vorsatz. Es findet genau die Stellen, an denen set -e nicht greift, und es findet unquotierte Variablen, die bei Leerzeichen im Pfad zuschlagen.