Suponga que un script de shell (/ bin/sh o/bin/bash) contiene varios comandos. ¿Cómo puedo hacer que la secuencia de comandos finalice limpiamente si alguno de los comandos tiene un estado de salida fallido? Obviamente, uno puede usar bloques y/o callbacks, pero ¿hay una manera más clara y concisa? Usar & & tampoco es una opción, porque los comandos pueden ser largos, o el script podría tener elementos no triviales como bucles y condicionales.Creación de scripts en el shell: se ha producido un error
Respuesta
Con el estándar sh
y bash
, puede
set -e
Será
$ help set
...
-e Exit immediately if a command exits with a non-zero status.
También funciona (por lo que pude reunir) con zsh
. También debería funcionar para cualquier descendiente de shell Bourne.
Con csh
/tcsh
, usted tiene que poner en marcha su guión con #!/bin/csh -e
Puede ser que usted podría usar:
$ <any_command> || exit 1
Este patrón es útil para ** salir selectivamente en caso de falla de comandos individuales ** y también ** si desea imprimir un mensaje de error personalizado ** primero. Para hacer esto último, use algo como '
Vive y aprende: Bash tiene una función de agrupación por comando, por lo que no hay necesidad del truco 'eval' que mencioné. En su lugar, use '
Puede comprobar $? para ver lo que el código de salida más reciente es ..
por ejemplo
#!/bin/sh
# A Tidier approach
check_errs()
{
# Function. Parameter 1 is the return code
# Para. 2 is text to display on failure.
if [ "${1}" -ne "0" ]; then
echo "ERROR # ${1} : ${2}"
# as a bonus, make our script exit with the right error code.
exit ${1}
fi
}
### main script starts here ###
grep "^${1}:" /etc/passwd > /dev/null 2>&1
check_errs $? "User ${1} not found in /etc/passwd"
USERNAME=`grep "^${1}:" /etc/passwd|cut -d":" -f1`
check_errs $? "Cut returned an error"
echo "USERNAME: $USERNAME"
check_errs $? "echo returned an error - very strange!"
-1: Este es un antipatrón muy frecuente. La solución de @Barun es más simple y más idiomática. – tripleee
mismo script que el anterior, pero como un "enfoque más ordenado" más ordenado (todo en una línea): foo = $ (grep "^ $ {1}"/etc/passwd) && foo = $ (echo "$ foo" | cut -d: -f1) && echo ok || echo not_ok (nb: si usa bash, y no se limita a sh, uno puede obtener el estado de salida de cualquier parte de una tubería, lo que simplifica la lógica grep/cut.) – michael
solo use el conjunto -e – Codefor
- 1. C1001: Se ha producido un error interno en el compilador
- 2. se ha producido un error de nivel de transporte
- 3. Rails ActiveSupport: ¿Cómo afirmar que se ha producido un error?
- 4. ¿Se ha producido realmente OverflowError?
- 5. Error de ASP.NET en Bitmap.Save "Exception (0x80004005): Se ha producido un error genérico en GDI +."
- 6. ha producido un error durante la inicialización de VM
- 7. 'System.StackOverflowException' se ha producido en PresentationCore.dll
- 8. Cómo atrapar correctamente una SqlException: Se ha producido un error en el nivel de transporte
- 9. Creación de scripts en shell: uso de bash con xargs
- 10. ha producido un error al intentar utilizar Nservice bus
- 11. error de Android, se ha producido un error al configurar la aplicación superior
- 12. Registros Rellenar con: Se ha producido un error de comunicación con el host remoto
- 13. ¿Se ha producido un error de secuencia de bytes no válido en la entrada normalize_yaml_input?
- 14. En la compra de la aplicación Se ha producido un error desconocido
- 15. ¿Se ha producido un bloqueo de Google App Engine Python?
- 16. Determinar si se ha producido un cambio de día
- 17. ¿Se ha producido un impacto en la memoria y el rendimiento al utilizar Bloch's Builder Pattern?
- 18. Se ha producido un error de generación desconocido, 'Excepción del tipo' System.OutOfMemoryException '
- 19. ¿Se ha producido una identificación de columna más de una vez en la especificación?
- 20. ¿Cómo se puede abortar la ejecución de los scripts de MySQL (quizás se haya producido un error)?
- 21. ¿Alguien ha producido un repositorio de GIT en memoria?
- 22. No se puede cargar la aplicación: 'Se ha producido un error al cargar en la tienda de iTunes'
- 23. Compiladores para scripts de shell
- 24. Se ha producido un error extraño al usar wcf para ejecutar la consulta en el servidor sql
- 25. Creación de scripts para el usuario final
- 26. Forma preferida de #! en scripts de shell
- 27. Creación de scripts en shell: uso de xargs para ejecutar instancias paralelas de una función de shell
- 28. ¿Manejo de excepciones en scripts de shell?
- 29. ejecutan los scripts de shell en C++
- 30. Funciones anónimas en scripts de shell
Gracias, esto parece ser lo que yo quiero. Debo mejorar mi Google fu, supongo ... :) – Pistos
Tenga en cuenta que los comandos en condicionales pueden fallar sin hacer que el script salga, lo cual es crucial. Por ejemplo: si grep algo/some/where; entonces: fue encontrado; else: no fue encontrado; fi funciona bien, independientemente de si se encuentra algo en/some/where. –
Usted dice "sh estándar". ¿Esto significa que es POSIX? Editar: lo busqué y es POSIX: http://pubs.opengroup.org/onlinepubs/009695399/utilities/set.html – Taywee