2011-10-23 6 views

Respuesta

2

Sí, así es como se hace.

Puede usar un punto y coma o una nueva línea en lugar de & &, ya que desea salir si el eco tiene éxito o no (aunque no estoy seguro de qué lo haría fallar).

La programación en un shell significa usar muchos pequeños comandos (algunos comandos incorporados, algunos programas pequeños) que hacen bien una cosa y los conectan con redirección de archivos, lógica de código de salida y otro tipo de pegamento.

Puede parecer extraño si está acostumbrado a idiomas en los que todo se hace mediante funciones o métodos, pero se acostumbra.

+0

gracias, bonkydog. – PJx

+0

Ahora estoy descubriendo otro efecto desagradable. Mientras se ejecuta el comando echo, el intérprete no espera a que termine, ¡sino que ejecuta simultáneamente el código debajo de él! Esto es lo que tengo: 'CMD1 || (echo 'ERROR MSG'; salida 1); CMD2; CMD3'. Ahora, si CMD1 falla, espero que se produzca el eco y la salida, y la secuencia de comandos se cerrará. Pero ahora, cuando CMD1 falla, CMD2 y CMD3 se ejecutan realmente antes del eco. Esto es de acuerdo con el registro de errores. Bizarre o no? – PJx

+0

en realidad, creo que los paréntesis() pueden ser los culpables. Simplemente lea en alguna parte que pueden ejecutar el código dentro de una subcamada, lo que por supuesto no tendrá el efecto deseado. Acabo de cambiar mi código a un bloque if-fi, y funcionó como se esperaba. Solo por curiosidad, ¿puedo combinar este código en un solo trazador de líneas? – PJx

45

Puede liar con bastante facilidad:

die() { echo "$*" 1>&2 ; exit 1; } 
... 
die "Kaboom" 
+1

+1; pero tenga en cuenta que morir sin argumentos emite una nueva línea no deseada. Me gusta '{test -n "$ @" && echo "$ @"; salida 1; }> & 2 ' –

+4

@WilliamPursell: Puede usar 'printf% s" $ {@ + $ @ $' \ n '} "' - En otras palabras, imprima los argumentos seguidos de una nueva línea si existen. – l0b0

+0

Al repasar esta respuesta 6 años después, me doy cuenta de que '" $ * "' probablemente tenga más sentido que '" $ @ "'. El comportamiento será idéntico en la mayoría de los casos, pero difiere para 'die -n Oops' (no es que quieras hacer eso). –

18

Aquí es lo que estoy usando. Es demasiado pequeño para poner en una biblioteca por lo que debe haber escrito cientos de veces ...

warn() { 
    echo "$0:" "[email protected]" >&2 
} 
die() { 
    rc=$1 
    shift 
    warn "[email protected]" 
    exit $rc 
} 

Uso: die 127 "Syntax error"

0
# echo pass params and print them to a log file 
wlog(){ 
    # check terminal if exists echo 
    test -t 1 && echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" 
    # check LogFile and 
    test -z $LogFile || { 
     echo "`date +%Y.%m.%d-%H:%M:%S` [$$] $*" >> $LogFile 
    } #eof test 
} 
# eof function wlog 


# exit with passed status and message 
Exit(){ 
    ExitStatus=0 
    case $1 in 
     [0-9]) ExitStatus="$1"; shift 1;; 
    esac 
    Msg="$*" 
    test "$ExitStatus" = "0" || Msg=" ERROR: $Msg : [email protected]" 
    wlog " $Msg" 
    exit $ExitStatus 
} 
#eof function Exit 
10

Ésta es una función muy cerca de Perl de "morir" (pero con el nombre de la función):

function die 
{ 
    local message=$1 
    [ -z "$message" ] && message="Died" 
    echo "$message at ${BASH_SOURCE[1]}:${FUNCNAME[1]} line ${BASH_LINENO[0]}." >&2 
    exit 1 
} 

Y foma de morir si se falla la función de construir-en (con nombre de la función)

function die 
{ 
    local message=$1 
    [ -z "$message" ] && message="Died" 
    echo "${BASH_SOURCE[1]}: line ${BASH_LINENO[0]}: ${FUNCNAME[1]}: $message." >&2 
    exit 1 
} 

Así, Bash es mantener toda la información necesaria en varias variables de entorno:

  • NUMLINEA - número actual línea ejecutada
  • FUNCNAME - pila de llamadas de funciones, primer elemento (índice 0) es la función actual, segundo (índice 1) es la función que llama función actual
  • BASH_LINENO - pila de llamadas de números de línea, donde correspondiente FUNCNAME fue llamado
  • BASH_SOURCE - array de archivo de origen, donde FUNCNAME corresponfing se almacena
+4

Puede evitar la variable local con '$ {1-Died}' - con eso, incluso puede pasar una cadena vacía y funcionará como era de esperar. – tripleee