Bash: se [tar = erro] [fechado]

-1

Eu quero um script de shell para escrever uma mensagem dependendo se o tar é bem-sucedido ou falha, mas esse script não funciona corretamente:

TAR=$(tar -cf Archiv.tar myfolder/ myotherfolder/)
if [ ! "$TAR" = "/dev/null" ]; then
   echo "success"
else
  echo "error - no such Directory or file"
fi

Qual é o problema?

    
por Jannyeis 11.01.2016 / 00:30

2 respostas

3

Não estou ciente de uma situação em que tar produzirá /dev/null para sinalizar um erro, que é como seu código tenta detectar o erro. Esta é a maneira correta de verificar erros:

if tar -cf Archiv.tar myfolder/ myotherfolder/
then
    echo "success"
else
    echo "error - no such Directory or file"
fi

Você provavelmente não precisa do else caso porque tar se queixará nesse caso. Se o uso de /dev/null deveria suprimir tar reclamações para que você possa substituir sua própria mensagem, a primeira linha deve ser:

if tar -cf Archiv.tar myfolder/ myotherfolder/ > /dev/null 2>&1

Observe que não estamos usando colchetes aqui. Isso é na verdade um alias para um comando de shell interno chamado test(1) que faz operações lógicas e retorna 0 ou diferente de zero para sinalizar sucesso ou falha, respectivamente. if , por sua vez, verifica esse retorno 0 / diferente de zero, portanto, para verificar o sucesso de um programa como tar que retorna falha diferente de zero, você não precisa envolver test ou seu alias [ .

Se você foi treinado em uma linguagem de programação que requer algum tipo de pontuação em torno da expressão if para que a falta de pontuação incomode você aqui, você pode reescrever a primeira linha assim:

tar -cf Archiv.tar myfolder/ myotherfolder/
if [ $? = 0 ]

Essas duas linhas juntas fazem a mesma coisa com a versão acima, porque a variável incorporada do shell $? contém o código de status do último programa executado.

Isso talvez seja mais claro, mas um pouco desperdício.

    
por 11.01.2016 / 00:49
0

Como de costume, há mais de uma maneira de fazer o que você estava tentando.
Esta é uma maneira (talvez compacta) de fazer isso:

#!/bin/bash
TAR_COMMAND='tar -cf Archiv.tar myfolder/ myotherfolder/ 2>/dev/null'
MSG_OK='### Work well DONE ### '   # A more common way to use a variable
MSG_ERR='### OPS IT FAILS ###  '    

$TAR_COMMAND && echo $MSG_OK || echo $MSG_ERR

Notas breves

  • Se você tiver não é necessário armazenar o status de saída (ou o código de saída) do seu comando, você pode usar imediatamente após os operadores AND , && e OU , || [ 1 ]
    . A lógica: cmd1 && cmd2 , cmd2 será executada somente se cmd1 sair sem erros (com o código de saída 0 ). Em vez disso, com cmd1 || cmd3 , cmd3 será executado apenas se cmd1 sair com um erro (código de erro diferente de 0 ).

  • Se, em vez disso, você quiser armazenar o código de saída de um comando, terá que executá-lo imediatamente após sua execução, porque com a próxima execução do comando esse valor será atualizado. É uma atribuição variável

    mycommand               # you execute your command
    ExitCodeToUseLater=$?   # So I can use it later in the script
    # ... other stuffs ...
    [ $ExitCodeToUseLater = 0  ]  && echo "It was gone ok " 
    # ... again other stuffs ...
    [ $ExitCodeToUseLater = 0  ] || echo "# Never a time that it goes as I want"
    
  • No script do bash, bem como nos makefiles [ 2a , 2b ] , você pode encontrar um comando com muitas opções escritas em uma variável para tornar mais legível o código (como você pode ver acima para a variável TAR_COMMAND ). Escrevendo em um shell a variável $MyVar será a mesma para escrever no shell o que está escrito dentro [ 3 ] . Ele funciona em um script também. Você pode ter que prestar atenção às regras de expansão e substituição bash sobre as quais você pode ler mais em man bash .

  • /dev/null é o Dispositivo nulo [ 4 ] , < em> "um arquivo de dispositivo que descarta todos os dados gravados nele, mas informa que a operação de gravação foi bem-sucedida" . Ele pode ser usado para fornecer uma entrada vazia para um comando ( </dev/null ) ou para passar em "silêncio absoluto" a saída padrão ou o erro padrão [5 ] .
por 11.01.2016 / 09:50