como diferenciar erro retornado durante a leitura e para EOF no shell script

2

Eu tenho essa tarefa de fazer o upload de um arquivo delimitado e processá-lo. Uma vez que o processamento é feito, eu digo o seu sucesso e se a análise falhar, eu preciso lançar o erro. Eu estou lendo este arquivo linha por linha no script filho e, em seguida, processando-o no script principal (por isso não posso usar ifs durante a leitura).

Estou renomeando para .done no caso de todas as linhas serem analisadas. Agora eu gostaria de saber quando há um erro antes que o EOF tenha chegado, para que eu possa renomeá-lo para .err. E se eu tiver um arquivo sem caractere de nova linha no final?

A estrutura é basicamente a seguinte:

Main script:
Calls parent script with filepath
gets the fileName and no of line in the files, calls the Child script with a nth line no in a loop until total no of lines are reached

Parent script:
#some validations to get the txt file from the list of files
... 
fileName='ls -A1 *.txt'
...

Child script:
...
lineno=$1
fileName=$2
noOfLines=$3
line='tail -$lineno $fileName | head -n1'

if [ $lineno -eq $noOfLines ] 
then
    noExt="${fileName%.*}"
    mv "$fileName" "$noExt.done" #success case
fi

Agora, também preciso renomear o arquivo para .err se o erro ou a análise falhar. Como eu pego o erro?

    
por Anu 17.12.2015 / 11:16

1 resposta

1

Use códigos de saída para comunicar essas informações. Se você quiser seguir as convenções , você pode usar, por exemplo, o

EX_DATAERR=65 

código para comunicar um erro de análise ao seu processo pai:

Criança

exit "$EX_DATAERR"

Pai

 case "$?" in  #$? is the exit code of the last exited child
              0) echo 'Child has exited succesfully';;
  "$EX_DATAERR") echo 'Child has experienced a parsing error';;
              *) echo 'Child has experienced an unknown error';;
esac

No que se refere ao tratamento de erros, o shell é como C em vez de C ++. Não joga. Cada erro deve ser retornado pelo receptor (para processos por seus códigos de saída, pois não há um erro global (usar o sistema de arquivos para isso seria desajeitado) e o chamador precisa verificar explicitamente os erros.

Você pode fazer set -e em seu shell para fazer com que seu shell saia com um erro se algum de seus filhos cujo status de saída não foi verificado (por exemplo, em uma instrução if ) retornar um status de saída diferente de zero . Isso é como lançar uma exceção incontável.

    
por 17.12.2015 / 11:28