Como obter mensagens de erro mais agradáveis neste script bash?

2

Estou tentando capturar qualquer erro ao executar um comando para gravar um arquivo de log / relatório

Eu tentei este código:

    function valid (){

    if [ $? -eq 0 ]; then
     echo "$var1" ": status : OK" 
     else echo "$var1" ": status : ERROR"   
    fi
   }

function save(){

 sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search
 var1="adding database ip"
 valid $var1

 sed -i "/connection.username/c connection.username=$name" #$search
 var1="addning database SID"
 valid $var1
}
save

A saída é assim:

adding database ip : status : OK
sed: no input file

Mas eu quero que seja assim:

adding database ip : status : OK
sed: no input file : status : ERROR"

ou isto:

adding database ip : status : OK
addning database SID : status : ERROR"

Eu tenho tentado, mas não está funcionando comigo. : (

    
por moata_u 07.03.2011 / 17:15

1 resposta

4

Para o primeiro:

# run sed, capture any output
var1="$(sed -i "/connection.username/c connection.username=$name" $search)"

Para o último:

# run sed, discard all output but keep exit status
sed -i "/connection.username/c connection.username=$name" $search >/dev/null 2>&1

Dito isto, valid() é ... estranho, para dizer o mínimo. Eu escreveria como

# valid label [status]
# check status ($? if not provided) and log success/failure
function valid {
  if [[ ${2-$?} == 0 ]]; then
    echo " : status : OK"
  else
    echo " : status : ERROR"
  fi
}

Na verdade, eu faria um pouco diferente do começo:

# log label command [arguments...]
# run command, output success/failure to stderr.  If label is empty, use the
# command name:  'log "" echo hi' uses 'echo' as the label.
# log entries look like
#    label1 : status : OK
#    label2 : status : ERROR
#    Error output from foo:
#      Baz is broken; fix and try again.
log() {
  # save off label
  local label="${1:-}"
  shift # this removes  and shifts ... to ... so "$@" works later
  # run command, capture output
  # $(command) runs 'command' and substitutes its output
  # "$@" preserves quoting; $* would turn argument "foo bar" into two
  # arguments foo bar
  err="$("$@")"
  if [[ $? == 0 ]]; then
    status=OK
  else
    status=ERROR
  fi
  echo "$label : status : $status" >&2 # standard error
  if [[ $status == ERROR ]]; then
    # log output from command, indented for clarity
    echo "Error output from :"
    echo "$err" | sed 's/^/  /' >&2
  fi
}

save() {
  # this sed command is pedantically correct; if GNU sed lets you
  # do single-line 'c' commands as in the original, then go for it.
  # The backslash-return after the label argument is just for clarity;
  # 'log "foo" bar' works just as well.
  log "adding database ip" \
    sed -i "/:@/c\
connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase\
." "$search"
  # using the original (GNU?) sed syntax
  log "adding database SID" \
    sed -i "/connection.username/c connection.username=$name" "$search"
}

save

Eu também incluo um timestamp e um ID do programa, etc. em um programa real.

Você provavelmente deve explorar o Guia de Scripts Avançados do Bash para saber mais sobre como escrever scripts de shell. Os capítulos de programação de shell do Ambiente de Programação UNIX não cobrem bash extensões para o shell Bourne original, mas ainda são úteis para aprender o "zen" do script de shell.

    
por geekosaur 07.03.2011 / 17:41