¿Qué hace el -e en un bash shebang?

32

Tengo un script bash con lo siguiente:

#!/bin/bash -e

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  echo "doesn't exist" 
fi

Este script no se ejecutará sin el -e. ¿Qué hace el -epara este script? Además, ¿qué hace el $?en este contexto?

Chris Henry
fuente
1
Impar. No -een la página de manual (realmente quiero ver una respuesta a esto). $?contiene el último código de salida (el del egrepproceso generado anteriormente).
2
@pst: -ese documenta en set.
Greg Hewgill
Puede simplificar su secuencia de comandos haciendo esto:if egrep -q "^username" /etc/passwd ; then echo "doesn't exist" ; fi
bollovan
2
Te falta un espacio entre ify [. Este script no funcionará con -e , porque si grepno encuentra nada entonces bajo -eel guión terminará ahí. Sin -e, tienes el mensaje al revés: un estado ( $?) de 0 significa que grep encontró al usuario. Tenga en cuenta que esto debería ser `grep '^ username:', por cierto (¿qué pasa si hay otro usuario con un nombre más largo?).
Gilles 'SO- deja de ser malvado'
3
¿Tendrá #/bin/bash -eel mismo efecto que #/bin/bashen la línea 1 y set -een la línea 2?
blong

Respuestas:

34

Error al salir. Más banderas

Si hay un error, saldrá de inmediato.

El $? es el estado de salida del comando pasado. En Linux, un estado de salida de 0 significa que el comando fue exitoso. Cualquier otro estado significaría que ocurrió un error.

egrep "^ nombre de usuario" / etc / passwd> / dev / null Buscaría el nombre de usuario debajo del archivo / etc / passwd. Si lo encuentra, entonces el estado de salida $? será igual a 0. Si no lo encuentra, el estado de salida será otra cosa (no 0), por lo tanto, "echo no existe".


fuente
Además, puede hacer que el script funcione correctamente sin -e reemplazando las dos primeras líneas con if egrep "^username" /etc/passwd >/dev/null.
1
¿Por qué no se setrequiere? : - /
1
@pst: Porque -ese da a bash como un argumento de línea de comandos. Todas las opciones enumeradas a continuación settambién son aceptadas por bash en su línea de comando: observe la primera oración en la sección Opciones de la página del manual.
Grawity
14

Todos los modificadores de línea de comando bash están documentados en man bash.

      -e Salir inmediatamente si una tubería (que puede consistir en un
              comando simple simple), un comando subshell encerrado en
              paréntesis, o uno de los comandos ejecutados como parte de
              Una lista de comandos entre llaves (ver SHELL GRAMMAR
              arriba) sale con un estado distinto de cero. La cáscara no
              salir si el comando que falla es parte del comando
              lista inmediatamente después de un tiempo o hasta la palabra clave,
              parte de la prueba que sigue al if o elif reservado
              palabras, parte de cualquier comando ejecutado en un && o || lista
              excepto el comando que sigue al && o || final, cualquier
              comando en una tubería pero el último, o si el comando es
              el valor de retorno se está invirtiendo con! Una trampa en ERR,
              si se establece, se ejecuta antes de que salga el shell. Esta opción
              se aplica al entorno de shell y a cada entorno de shell
              ronment por separado (ver ENTORNO DE EJECUCIÓN DE MANDOS
              arriba), y puede hacer que las subcapas salgan antes de ejecutar
              Todos los comandos en la subshell.
Greg Hewgill
fuente
2
Ahh Lo busqué en el hombre, pero después de encontrar -e en las pruebas de archivo y no -e bajo los argumentos principales, me di por vencido. Buen extracto. ¿Por qué no se setrequiere? : - /
1

Tu guión es incorrecto, porque

egrep "^username" /etc/passwd >/dev/null 
if[ $? -eq 0 ] 
then 
  #echo "doesn't exist" # WRONG
  echo "the USER EXISTS"
fi

estado de salida 0 - significa - todo está bien, en el caso de grep significa "OK, encontró la cadena". estado de salida! = 0 significa que algo está mal, en el caso de grep 1 significa, "no encontrado", 2 significa "no se puede abrir la entrada" ...

jm666
fuente