Trapping arquivo de ponto (.) não encontrado erros no KSH

3

No ksh88, eu posso criar um arquivo usando o comando "ponto", como

. /my/file/source.ksh

No entanto, se o source.ksh não existir, eu quero capturar o erro.

Então eu tentei isso:

#!/bin/ksh

trap "echo 'Source Not Found'; exit 1" ERR
. test2.ksh

Mas a armadilha nunca exibe a mensagem de erro, o script retorna com:

./test.ksh[4]: test2.ksh:  not found.

Eu até tentei usar trap sem nenhum sinal e ele ainda não detectou o erro.

Existe alguma maneira de pegar esse erro? Eu devo usar o ksh88 para este script. Respostas de bash são inúteis para esta questão.

Estou ciente de que posso testar a existência do arquivo de antemão, eu estava apenas esperando que houvesse uma maneira de interceptar esse erro sem ter que fazer isso, já que há um monte dessas inclusões no meu script. / p>     

por N West 18.04.2013 / 19:04

1 resposta

4

Você pode usar o comando command para remover o comportamento especial (pelo qual a falha faz com que o shell saia, entre outras coisas) de especiais embutidos em POSIX shells como ksh ou bash .

Então:

if ! command . /my/file/source.ksh; then
  echo >&2 ". failed"
  exit 1
fi

Agora, . pode falhar se /my/file/source.ksh não puder ser encontrado, ou não puder ser aberto para leitura ou se houver um erro ao lê-lo ou analisá-lo ou o último comando executado retornar a falha. / p>

Se você quiser considerar apenas o caso em que source.ksh não pode ser aberto para leitura, você pode usar exec (outro especial incorporado ):

die() {
  IFS=" "
  printf >&2 'Error: %s\n' "$*"
  exit 1
}
command exec 3< /my/file/source.ksh || die "Can't read the file"
command . /dev/fd/3

Ou use eval em vez de . :

code=$(cat /my/file/source.ksh) || die "Can't read the file"
eval "$code"
    
por 18.04.2013 / 22:24

Tags