En perl, puede salir con un mensaje de error con die "some msg"
. ¿Hay un solo comando equivalente en bash? En este momento, estoy logrando esto usando comandos: echo "some msg" && exit 1
En bash, ¿hay un equivalente de morir "mensaje de error"
Respuesta
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.
Puede liar con bastante facilidad:
die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
+1; pero tenga en cuenta que morir sin argumentos emite una nueva línea no deseada. Me gusta '{test -n "$ @" && echo "$ @"; salida 1; }> & 2 ' –
@WilliamPursell: Puede usar 'printf% s" $ {@ + $ @ $' \ n '} "' - En otras palabras, imprima los argumentos seguidos de una nueva línea si existen. – l0b0
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). –
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"
# 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
É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
Puede evitar la variable local con '$ {1-Died}' - con eso, incluso puede pasar una cadena vacía y funcionará como era de esperar. – tripleee
- 1. equivalente en Java a PHP morir
- 2. ¿Hay una alternativa para morir?
- 3. ¿Hay un equivalente de MessageBox en WPF?
- 4. PHP: ¿Morir() debe morir?
- 5. "CLS" Equivalente en BASH?
- 6. ¿Cómo puedo generar un mensaje de morir() sin la información de ubicación?
- 7. ¿Hay un equivalente de "esto" en Powershell?
- 8. Equivalente de Bash Backticks en Python
- 9. Equivalente a `__FILE__`,` __LINE__` en bash
- 10. Equivalente de select o poll en bash
- 11. comando Bash que imprime un mensaje en stderr
- 12. ¿Hay un equivalente de str_replace en C++?
- 13. ¿Hay un equivalente de JMS en .NET?
- 14. ¿Hay un equivalente de Rake en Python?
- 15. ¿Hay un equivalente de Make en Windows?
- 16. ¿Hay un equivalente de XDomainRequest en Firefox?
- 17. ¿Hay un equivalente de ucwords en java
- 18. ¿Hay un equivalente de "gettimeofday" en .NET
- 19. ¿Cuál es la forma correcta de morir con un error pero sin un rastro de pila en Perl?
- 20. ¿Hay un comando fuente equivalente en Windows CMD como en bash o tcsh?
- 21. ¿Hay un equivalente de C# de m_nCmdShow?
- 22. equivalente bash de os.path.normpath de Python?
- 23. mensaje de error de PDO?
- 24. ¿Cómo mostrar un mensaje de error JSON?
- 25. ¿Hay un equivalente de ColdFusion de phpinfo()
- 26. Equivalente a Bash alias en PowerShell
- 27. Extensiones Django mensaje de error
- 28. ¿Hay un equivalente 'no en' en GORM?
- 29. Cómo morir con elegancia?
- 30. Django permission_required mensaje de error?
gracias, bonkydog. – PJx
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
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