Como eu redirecionaria um erro de uma condição de falha se [fechada]

0

Estou tentando entender melhor o STDERR e quando / onde colocar 2 > dentro da fase inicial de testes de um loop.

Meu script é o seguinte ...

#!/bin/bash

file1=/tmp/file1
file2=/tmp/file2

if [ -e $file1 -o -e $file2 ]; then
  if ls $file1 2>> err.log ; then
     echo "file1 exists" | tee -a job.log
  fi

  if ls $file2 2>> err.log ; then
    echo "file2 exists" | tee -a job.log
  fi
else
 echo "neither $file1 or $file2 exists"
fi

No entanto, quando arquivo1 ou arquivo2 NÃO existe, eu esperaria que o seguinte seja anexado a err.log

ls: não pode acessar / tmp / file1: nenhum arquivo ou diretório desse tipo

Mas nada é escrito para err.log qualquer ... não tenho certeza do que estou perdendo, mas achei que a lógica era simples.

Qualquer ideia é muito apreciada.

    
por Leonard 05.02.2018 / 02:51

2 respostas

4

Como aponta, você está usando desnecessariamente ls . Seu script pode ser escrito da seguinte forma:

#!/bin/bash

file1='/tmp/file1'
file2='/tmp/file2'

if [[ -e "$file1" ]]; then
    echo "file1 exists" | tee -a job.log
else
    echo 'ls: cannot access /tmp/file1: No such file or directory' >>err.log
fi
if [[ -e "$file2" ]]; then
    echo "file2 exists" | tee -a job.log
else
    echo 'ls: cannot access /tmp/file2: No such file or directory' >>err.log
fi
[[ ! -e "$file1" && ! -e "$file2" ]] && echo "neither $file1 or $file2 exists"

Os erros ls provavelmente devem ser alterados, mas é o que você queria ver no seu arquivo de erro, então eu os deixei:)

    
por 05.02.2018 / 03:07
1

O erro deve ser gravado no arquivo se pelo menos um dos arquivos existir. Se ambos não existirem, a instrução if irá pular diretamente para a cláusula else que não executa ls .

Se você deseja anexar a mensagem de erro se os arquivos both não existirem, você poderá fazê-lo manualmente na cláusula else da seguinte forma:

#!/bin/bash

file1=/tmp/file1
file2=/tmp/file2

if [ -e $file1 -o -e $file2 ]; then
  if ls $file1 2>> err.log ; then
     echo "file1 exists" | tee -a job.log
  fi

  if ls $file2 2>> err.log ; then
    echo "file2 exists" | tee -a job.log
  fi
else
 echo "neither $file1 or $file2 exists"
 ls $file1 2>> err.log
 ls $file2 2>> err.log
fi

Isso executará o comando ls mesmo quando você souber que os arquivos não existem, então você tem o erro de comando registrado em seu arquivo.

Note que o código não faz muito sentido em um ponto de vista prático, mas se for escrito com o único propósito de aprender, então isso não importa ...

    
por 05.02.2018 / 03:03