
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 names
aviso 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 tar
comando é recebido tmp/foo/.env tmp/foo/docker-compose.yml
como um caminho único.
Assim como
file='a b'
touch "$file"
criará um arquivo a b
, não dois arquivos a
e 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.yml
funcionar é 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.