
Ich muss einige Dateien tarnen, eine davon ist eine Dotfile.
FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml
FILES="${FILE1#/} ${FILE2#/}"
tar -C / -cf /tmp/foo/files.tar "$FILES"
Die Variablensubstitution vermeidet die tar: Removing leading '/' from member names
Warnung und vereinfacht das Entpacken.
Aber ich erhalte diesen Fehler:
tar: tmp/foo/.env tmp/foo/docker-compose.yml: stat kann nicht ausgeführt werden: Keine solche Datei oder kein solches Verzeichnis
Das Hardcoding der Pfade funktioniert: tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
.
Ich gehe also davon aus, dass das Problem in der Handhabung dieser Dotfile liegt oder etwas mit dem Escapen zu tun hat?
Antwort1
Wenn die Shell erweitert wird "$FILES"
, verliert das Leerzeichen seinen syntaktischen Wert. Der tar
Befehl wird also tmp/foo/.env tmp/foo/docker-compose.yml
als einzelner Pfad empfangen.
Genauso wie
file='a b'
touch "$file"
erstellt die Datei a b
, nicht zwei Dateien a
und b
.
Daher sollten Sie, wie im Kommentar vorgeschlagen, für unterschiedliche Dateien unterschiedliche Variablen verwenden: tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}"
.
Dass die direkte Ausführung tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
funktioniert, liegt daran, dass die Leerzeichen dort einen syntaktischen Wert haben und ein Argument von einem anderen trennen. Für das „menschliche Auge“ wird nach der Erweiterung von "$FILES"
to dasselbe Leerzeichen erzeugt tmp/foo/.env tmp/foo/docker-compose.yml
, aber in diesem Fall hat das Leerzeichen aufgrund der Anführungszeichen keine besondere Bedeutung, sodass der gesamte Wert als einzelner Pfad behandelt wird.