$ eval echo -e "n\ $d/$prf.00{2..$last}.tar\\n"
n someprefix.002.tar
n someprefix.003.tar
n someprefix.004.tar
How did that whitespace get in there?
A resposta em poucas palavras: isso é análogo ao resultado que você obteria se fizesse eco de uma linha usando a expansão de nome de arquivo em um monte de arquivos cujos nomes terminam com nova linha.
Conforme descrito na expansão de chaves :
Patterns to be brace expanded take the form of an optional preamble, followed by either a series of comma-separated strings or a sequence expression between a pair of braces, followed by an optional postscript.
Então o shell está avaliando
echo -e n\ dir/prefix00{2..4}.tar\n
^preamble^^^^^^ ^postscript
E, como na expansão de nome de arquivo, insere um espaço entre cada elemento expandido , assim você obtém (estou mantendo a sequência de escape \ n aqui para maior clareza):
n dir/prefix002.tar\n n dir/prefix003.tar\n n dir/prefix004.tar\n\n
QED.
Quanto à sua pergunta básica de como, em um script, alimentar tar
a informação para passar por vários volumes, aqui estão duas maneiras:
- Use
seq
para gerar os comandosn
:
seq -f "n $d/$prf.%03g.tar" 2 $last | tar -Mtvf $d/$prf.001.tar
- Escreva um script curto para gerar cada novo nome de volume e passe-o à
tar
'--new-volume-script
option:
echo '#!/bin/sh' > ./newvol echo "printf $d/$prf.%03d.tar \$TAR_VOLUME >&\$TAR_FD" >> ./newvol chmod +x ./newvol tar -Mtvf $d/$prf.001.tar --new-volume-script=./newvol