Como posso ignorar o "aviso zip: nome não correspondido" ao usar o comando zip com a opção -d?

2

Estou criando um arquivo sh para executar vários comandos em segundo plano.

Em alguma linha deste arquivo, há um comando para atualizar um arquivo zip como:

zip -d archive.zip file.txt

Este arquivo.txt pode não fazer parte do archive.zip sempre. Quando não está, o script de shell quebra nessa linha com:

zip warning: name not matched

Eu quero continuar nas linhas seguintes ignorando a inexistência deste arquivo. Como posso conseguir isso?

    
por kubilay 12.06.2014 / 13:52

1 resposta

3

Normalmente, em um script de shell, até mesmo uma linha que gera um erro não interrompe a execução do script de shell. Ele irá apenas para a próxima linha.

A exceção notável é se você definiu o sinalizador para sair do shell se algum subcomando falhar. Isso às vezes é feito adicionando "set -e" próximo ao topo de um script. Se você tem algo parecido em seu script, ele aborta em qualquer comando no script que retorna um erro. Suas opções neste caso são:

  • Remova essa opção. Isso pode ter ramificações para o resto do seu script, então não faça isso por capricho.

  • Desative a opção da seção do script em que você está e, em seguida, ligue-a novamente para continuar:

    set +e
    zip -d archive.zip file.txt
    set -e
    
  • Forneça uma saída para a linha com falha, para que o shell veja o comando como um sucesso, mesmo que algo falhe. Isso pode ser feito de várias maneiras, mas uma simples é usar o operador OR:

    zip -d archive.zip file.txt || true
    

    Isto irá executar o comando zip, mas se falhar, irá executar o comando true e o shell pai irá obter o código de retorno (que é claro, um sucesso). Você pode ver isso às vezes escrito ||: , que é um pouco mais rápido e mais complicado, mas não mágico; O : simplesmente é um comando embutido no shell que também retorna um código de erro de sucesso mesmo que não faça nada.

    Outra maneira de fazer isso é executar o comando em um sub-shell cercando-o em () para que, enquanto o comando dentro dele, possa falhar, o subshell terá feito seu trabalho para que o script pai com set -e conjunto não vai morrer. Isso é sub-ótimo para um único comando, mas pode ser útil se você quiser executar um conjunto de coisas.

Por outro lado, se você quiser apenas suprimir a mensagem de erro gerada pelo zip, é possível redirecionar o fluxo de erro padrão para / dev / null com ( 2> /dev/null ) para suprimir as mensagens geradas (ou fechá-lo com 2>&- ).

    
por 12.06.2014 / 14:00