Análise
Olhando os exemplos de arquivos de entrada
~/Documents/MIAGE/L3/semestre5/web
~/Documents/MIAGE/L3/semestre5/communication/
e as mensagens de erro de tar
tar: ~/Documents/MIAGE/L3/semestre5/web : cannot stat : No such file or directory
tar: ~/Documents/MIAGE/L3/semestre5/communication : cannot stat : No such file or directory
você parece presumir que o interpretador de shell ou tar
expandirá o til ( ~
) ao ler suas linhas com uma das seguintes construções:
-
for i in $(cat infile)
-
while read i; do ...; done < infile
-
mapfile ... < infile
Esta presunção é falsa. Nenhum dos intérpretes de shell comuns executa expansão , ou mais especificamente expansão do til nessas situações. Ele avalia apenas seqüências de escape (consulte read
). Nenhuma implementação conhecida (para mim) de tar
executa expansão de argumento (e não deveria, já que isso criaria muitos problemas).
Solução
Você precisa expandir os caracteres do til em seus arquivos de entrada de alguma forma.
A maneira mais fácil é provavelmente alterar o arquivo de entrada manualmente ou com um filtro (se você puder ter certeza de que $HOME
não inclui caracteres de escape ou delimitadores de sed
(aqui \
e ;
)):
sed -e 's;^~\(\/\|$\);'"$HOME"';' infile | tar cvzf my-archive.tar.gz --from-file -
Se você quiser tirar proveito de todas as expansões de shell disponíveis e puder assegurar que a entrada adequada escape , você pode usar o eval
comando interno :
while read -r i; do
eval echo "$i"
done < infile |
tar cvzf my-archive.tar.gz --from-file -