Como escrever um script de shell portátil com tratamento de erros

6

Eu tive um sucesso relativamente bom em escrever um shell portátil e completo scripts de shell usando /bin/sh , por exemplo:

#!/bin/sh
trap 'echo "Error on line $LINENO"; exit 1' ERR
while read LINE
do
  echo "+ $LINE"
done < file.txt

isso funciona no BSD porque /bin/sh é tipicamente um alias para ksh

$ ls -li /bin/{sh,ksh}
26768 -r-xr-xr-x  3 root  bin  418612 Jun 18 17:41 /bin/ksh
26768 -r-xr-xr-x  3 root  bin  418612 Jun 18 17:41 /bin/sh

Enquanto estiver no MacOS e em muitas distribuições do Linux, basta link simbólico /bin/sh to bash

$ ls -li /bin/{sh,bash}
17170438 -rwxr-xr-x 1 root root 938832 Jul 18  2013 /bin/bash
17170540 lrwxrwxrwx 1 root root      4 Feb 19 12:42 /bin/sh -> bash

Se essas duas condições forem verdadeiras, posso usar um conjunto de recursos relativamente rico comum a KSH e BASH. No Ubuntu, o shell padrão suporta apenas os recursos POSIX . Ainda é possível escrever um script de shell de plataforma cruzada que também incorpore o tratamento de erros?

Edit (2014-08-18)

A solução que eu criei foi atualizar automaticamente o script se o shell fornecido não entender a armadilha ERR

#!/bin/sh
trap 'echo "Error on line $LINENO"; exit 1' ERR || exec bash $0 "$@"

Isso me permite escrever scripts de shell razoavelmente portáveis que requerem apenas o bash se o shell padrão não suportar recursos do KSH.

    
por eradman 11.08.2014 / 15:57

1 resposta

3

Se você quiser escrever um shell script portátil, você deve ficar com o POSIX, já que é o padrão mais confiável no mundo Unix.

Basear-se em /bin/sh , sendo tudo menos uma shell Bourne, é um estilo ruim e provavelmente irá quebrar mais cedo ou mais tarde.

Como o POSIX não suporta o ERR trap, você precisa adicionar manualmente o seu manipulador de erros a qualquer comando para o qual você deseja, usando || . Por exemplo:

#!/bin/sh

error(){
 echo "Error at $1"; exit 1   ## we don't have $LINENO in POSIX
}

while read LINE
do
  echo "+ $LINE"
  false
done < file.txt || error "while loop"
    
por Florian Diesch 11.08.2014 / 16:44

Tags