TAR-Fehler beim Einbinden einer Dotfile

TAR-Fehler beim Einbinden einer Dotfile

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 namesWarnung 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 tarBefehl wird also tmp/foo/.env tmp/foo/docker-compose.ymlals einzelner Pfad empfangen.

Genauso wie

file='a b'
touch "$file"

erstellt die Datei a b, nicht zwei Dateien aund 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.ymlfunktioniert, 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.

verwandte Informationen