Probleme mit Leerzeichen in Umgebungsvariablen im Rsync-Skript unter MacOS

Probleme mit Leerzeichen in Umgebungsvariablen im Rsync-Skript unter MacOS

Ich habe ein Bash-Skript, das ich für tägliche Backups ausführen möchte (mein HOME ist /Volumes/Norman Data/me):

#!/bin/bash

# Halt the script on any errors.
set -e

# Remote server where
remote_server="example.com"

# Destination Folder on Remote Server
target_path="backup/"

# User (with sshy key) on remote server
usr="me"


# ${HOME} evaluates to '/Volumes/Norman Data/me'
# A list of absolute paths to backup. 
include_paths=(
  # "~/.ssh"
  # "~/.bash_history"
  "${HOME}/.bash_profile"
  # "~/.vimrc"
  # "~/.gitconfig"
  # "~/.gitignore"
  # "~/.zshrc"
  # "~/Artifacts"
  "${HOME}/Documents" 
  "--exclude=remote"
  # "~/Downloads"
  # "~/Desktop"
  # "~/Pictures"
  # "~/Projects --exclude 'remote'"
  # "~/Movies"
)

# A list of folder names and files to exclude.
exclude_paths=(
  ".bundle"
  "node_modules"
  "tmp"
)

# Passing list of paths to exclude
for item in "${exclude_paths[@]}"
do
  exclude_flags="${exclude_flags} --exclude=${item}"
done

# Passing list of paths to copy
for item in "${include_paths[@]}"
do
  include_args="${include_args} '${item}'"
done


str="rsync -auvzP ${exclude_flags} ${include_args} ${usr}@${remote_server}:${target_path}"
echo "Running: ${str}"
${str}

Das Ausführen führt zu:

building file list ... 
rsync: link_stat "/Volumes/Norman" failed: No such file or directory (2)
rsync: link_stat "/Volumes/Norman Data/me/Data/me/.bash_profile" failed: No such file or directory (2)
rsync: link_stat "/Volumes/Norman" failed: No such file or directory (2)
rsync: link_stat "/Volumes/Norman Data/me/Data/me/Documents" failed: No such file or directory (2)
0 files to consider

sent 29 bytes  received 20 bytes  32.67 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files could not be transferred (code 23) at 
/BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-52/rsync/main.c(996) [sender=2.6.9]

Soweit ich das beurteilen kann, HOMEverursacht das Leerzeichen im Wert von my Probleme. Ich dachte, wenn ich es in Anführungszeichen setze, "${HOME}/.bash_profile"würden die Leerzeichen behoben. Und das scheint auch so zu sein, irgendwie. Damit meine ich, der Wert, den ich von erhalte, echo "Running: ${str}"ist

rsync -auvzP  --exclude=.bundle --exclude=node_modules --exclude=tmp  '/Volumes/Norman Data/me/.bash_profile' '/Volumes/Norman Data/me/Documents' --exclude=remote [email protected]:backup/

Und wenn ich das direkt im Terminal ausführe oder in das Skript einfüge (anstelle von ) ${str}, funktioniert es wie erwartet. Die oben genannten Fehler treten nur bei Verwendung der Variable auf.

Ich weiß einfach nicht, was mir hier entgeht. Kann mir jemand weiterhelfen?

** Skript adaptiert vonhttps://gitlab.com/ramawat/randomhacks/blob/master/backup_script.txt

Antwort1

Sie können Arrays zum Speichern von Parametern zu Recht verwenden, Sie sollten dann jedoch nicht versuchen, die Arrays in eine einzelne Zeichenfolge zu reduzieren, da diese beim Ausführen als Befehl in Wörter aufgeteilt werden muss und Probleme mit der Anführungszeichensetzung auftreten.

Verwenden Sie einfach im gesamten Skript Arrays, z. B. sammeln Sie den Befehl in einem Array cmd:

cmd=(rsync -auvzP)
for item in "${exclude_paths[@]}"
do  cmd+=("--exclude=${item}")
done
for item in "${include_paths[@]}"
do  cmd+=("${item}")
done

cmd+=("${usr}@${remote_server}:${target_path}")

set -x
"${cmd[@]}"

Wenn Sie set -xam Ende verwenden, sehen Sie, wie die Shell Wörter in einem einzigen Argument beibehält. Es zeigt Ihnen die von ihr verwendeten konzeptionellen Anführungszeichen:

+ rsync ... '/Volumes/Norman Data/me/.bash_profile' ...

verwandte Informationen