Bash scripting: Alterar mensagem de erro padrão para um personalizado

0

Eu tenho tentado trabalhar com meu próprio script de backup. Estou com um problema quando executo meu script e o comando rm não tem nada a ver. Eu ainda gostaria de processar a saída (também exibir mensagens diferentes de acordo com a falha da operação ou não), mas suprimir a saída gerada nativamente por rm . Atualmente isto:
ls -t | tail -n +$startnumber | xargs -d '\n' rm && echo "Removed old backup(s)." || echo "No more than $keepnumber files; nothing to do."
infelizmente produz isto:
rm: missing operand Try 'rm --help' for more information. No more than 14 files; nothing to do.
Onde eu gostaria de me livrar das duas primeiras linhas e só produzir minha própria mensagem, "mais legível". Eu tentei usar rm -f , mas isso sempre (e falsamente) acionará a saída bem-sucedida.

    
por mti_ 08.07.2016 / 18:02

2 respostas

0

Estas mensagens rm foram enviadas para o erro padrão ( stderr ). Você pode redirecionar a saída de erro padrão ( stderr ) para /dev/null como:

xargs -d '\n' rm 2>/dev/null

Isso evitará que as linhas sejam impressas em seu terminal e apenas sua mensagem personalizada será exibida.

    
por 08.07.2016 / 18:07
0

Gostaria de salvar a listagem de arquivos em um arquivo temporário e contar as linhas antes de tentar rm . (Ou apenas conte os arquivos de outra maneira primeiro.)

Você também pode redirecionar os erros de rm para /dev/null , mas isso também mascara os erros valid .

Diga

tmpfile=$(mktemp)
ls -t | tail -n +$startnumber > $tmpfile
if [ -s "$tmpfile" ] ; then
    echo not empty, do something with filelist in $tmpfile
else
    echo empty, do something else
fi
rm "$tmpfile"

É claro que usar ls como esse será quebrado se você tiver nomes de arquivos contendo novas linhas por algum motivo. (Sim, é possível. Embora nesse caso isso signifique que alguns arquivos não serão removidos, mesmo que devam ser.)

    
por 08.07.2016 / 18:22