tar para stdout: falta de arquivos de entrada sem afetar o PIPESTATUS

0

Eu tenho uma pasta com esse conteúdo (as subpastas e os nomes dos arquivos são fixos e não podem ser alterados):

# ls
data/ config/ myfile

Eu preciso criar um arquivo tar para stdout para processá-lo com dd em um script Bash; suponha, por exemplo, desta forma, por uma questão de simplicidade:

# /bin/tar -cz data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

Imediatamente após esta instrução, eu verifico a variável ${PIPESTATUS[0]} para 0 para saber que tar fez seu trabalho com sucesso.

O problema é que myfile é opcional para mim e, se estiver faltando, meu ${PIPESTATUS[0]} se torna 2, embora eu não queira considerá-lo um erro. Então, como posso instruir tar a ignorar arquivos de entrada ausentes? Eu preferiria uma declaração de uma linha, se possível.

    
por virtualdj 12.05.2018 / 22:10

2 respostas

0

Se for uma opção para alterar a chamada tar :

test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |
    
por 12.05.2018 / 22:21
0

So how can I instruct tar to ignore missing input files?

É muito simples: basta usar o sinal --ignore-failed-read no seu comando tar :

$ /bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

$ echo ${PIPESTATUS[0]}

> 0

BTW: Note que a resposta do Hauke Laging é mais complicada, mas tar só retorna 0 se está tudo ok, ou se o único arquivo faltando é myfile ... com este , tar retorna 0 se estiver tudo ok, ou mesmo quando algum arquivo estiver faltando.

Com isso:

/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null

(observe que não estou redirecionando stderr de tar para /dev/null ) se myfile não existir, tar retornará 0 (se não houver outros erros, é claro) e você recebe isso em stderr : /bin/tar: myfile: Warning: Cannot stat: No such file or directory

tar manual diz:

‘--ignore-failed-read’ Do not exit with nonzero on unreadable files or directories. This option has effect only during creation. It instructs tar to treat as mild conditions any missing or unreadable files (directories). Such failures don’t affect the program exit code, and the corresponding diagnostic messages are marked as warnings, not errors. These warnings can be suppressed using the ‘--warning=failed-read’ option

mas, infelizmente, --warning=failed-read suprime todos os avisos sobre erros de leitura: no seu caso, suprime avisos sobre um arquivo que não existe, mas também suprime o aviso sobre erros de E / S , por exemplo ... está longe de ser ótimo; aparentemente, tar não tem um sinalizador para dizê-lo: ei, suprima o aviso de falha de leitura somente se o arquivo não existir , então, isso pode resolver o seu problema:

/bin/tar -cz --ignore-failed-read data config myfile 2> >(grep -v 'No such file or directory' 1>&2) | /bin/dd of=backup.tar 2>/dev/null

isto: >( ... ) é Substituição do Processo

Dessa forma, o comando tail não altera seu número de retorno se o arquivo não existir, você não recebe mensagens de aviso sobre arquivos ausentes e recebe mensagens de aviso sobre qualquer outro erro de leitura.

p>

isto >

Eu não posso deixar de pensar que nenhuma dessas soluções é realmente boa, então, eu inventei isso:

/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

com isso, você está enviando para tar apenas os arquivos que realmente existem no momento da execução do comando: você não precisa se preocupar com seus nomes, ou mesmo qual arquivo existe ou não: você sempre executa o mesmo comando (não importa o que), escalas perfeitamente se você tiver 1 arquivo ausente, ou arquivos n faltando, e você não perca nenhum erro.

(observe a barra invertida se a frente do comando ls : dessa forma, você evita% al_de% alias, portanto, sua saída é mais confiável)

    
por 13.05.2018 / 03:05