erro tar ao incluir um dotfile

erro tar ao incluir um dotfile

Preciso tar alguns arquivos, sendo um deles um dotfile.

FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml

FILES="${FILE1#/} ${FILE2#/}"

tar -C / -cf /tmp/foo/files.tar "$FILES"

A substituição da variável evita o tar: Removing leading '/' from member namesaviso e simplifica a descompactação.

Mas eu recebo este erro:

tar: tmp/foo/.env tmp/foo/docker-compose.yml: Não é possível stat: esse arquivo ou diretório não existe

Codificar os caminhos funciona: tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml.

Então presumo que o problema esteja no manuseio desse arquivo de ponto ou algo relacionado ao escape?

Responder1

Quando o shell se expande "$FILES", o espaço perde seu valor sintático. Portanto, o tarcomando é recebido tmp/foo/.env tmp/foo/docker-compose.ymlcomo um caminho único.

Assim como

file='a b'
touch "$file"

criará um arquivo a b, não dois arquivos ae b.

Então, como sugerido no comentário, você deve usar variáveis ​​diferentes para arquivos diferentes: tar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}".


O fato de a execução direta tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.ymlfuncionar é porque os espaços possuem valor sintático ali, separando um argumento do outro. Para os “olhos humanos”, o mesmo espaço será produzido após a expansão de "$FILES"to tmp/foo/.env tmp/foo/docker-compose.yml, mas neste caso o espaço não tem significado especial por causa da cotação, portanto todo o valor será tratado como um único caminho.

informação relacionada