¿Hay alguna forma de verificar si hay un error al ejecutar un comando?
Ejemplo:
test1=`sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search`
valid $test1
function valid () {
if $test -eq 1; then
echo "OK"
else echo "ERROR"
fi
}
Ya intenté hacer eso, pero parece que no funciona. No sé cómo hacer eso.
command-line
moata_u
fuente
fuente
valid
) antes de llamarla.Respuestas:
El valor de retorno se almacena en
$?
. 0 indica éxito, otros indica error.Al igual que cualquier otro valor textual, puede almacenarlo en una variable para futuras comparaciones:
Para posibles operadores de comparación, ver
man test
.fuente
;
antes deelse
yfi
: `if ...; luego ...; de lo contrario ...; fitest
.[ $? ]
(o equivalentetest $?
) no funciona porque se$?
evalúa como un número (0, 1, etc.) que no es nulo. Consulte los documentos paratest
: "Si se omite EXPRESIÓN, 'prueba' devuelve falso. Si EXPRESIÓN es un argumento único, 'prueba' devuelve falso si el argumento es nulo y verdadero de lo contrario".Si solo necesita saber si el comando tuvo éxito o no, no se moleste en probarlo
$?
, solo pruebe el comando directamente. P.ej:Y asignar la salida a una variable no cambia el valor de retorno (bueno, a menos que se comporte de manera diferente cuando stdout no es un terminal, por supuesto).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explica
if
con más detalle.fuente
$?
hace, por lo que es incorrecto al decir que probar el comando directamente es estrictamente mejor.local
comando, es decir,local foo=$(false); echo $?;
produce0
en la salida. Perolocal
solo es relevante dentro de las funciones bash.fuente
command
devuelve un error en la pantalla, ¿cómo ocultarlo?command
escribe errores en stderr, puede usar el formulariocommand 2> /dev/null && echo OK || echo Failed
. Las2> /dev/null
redirecciones Stderr de salida a/dev/null
. Sin embargo, algunas utilidades escribirán errores en stdout (aunque esta sea una mala práctica). En este caso, puede omitir el 2 de la redirección, pero perderá cualquier resultado del comando. Este método de verificación del éxito es bueno para la lógica ternaria simple, pero para un comportamiento más complejo, es mejor verificar el$?
éxito del comando o usar elif
método de bloque descrito en la respuesta de @ geirha.PS debe contener el estado de salida del comando anterior, que debe ser cero para ningún error.
Entonces, algo así como;
Para la mayoría de los casos, es más fácil usar la construcción && para encadenar comandos que deben depender unos de otros. Por
cd /nonexistant && echo success!
lo tanto , no sería un éxito porque el comando se rompe antes de && El corolario de esto es ||, dondecd /nonexistant || echo fail
se hacen eco fallar porque no cd. (Esto se vuelve útil si usa algo como || exit, que finalizará el script si falla el comando anterior).fuente
fuente
command; echo $?
?true && echo $? || echo $?
/true; echo $?
yfalse && echo $? || echo $?
/false; echo $?
- encontrarás que hacen exactamente lo mismo: Dcommand && echo "success: $?" || echo "fail: $?"
Cabe señalar que
if...then...fi
y&&
/||
tipo de enfoque trata con el estado de salida devuelto por comando que queremos probar (0 en caso de éxito); sin embargo, algunos comandos no devuelven un estado de salida distinto de cero si el comando falló o no pudo manejar la entrada. Esto significa que los enfoques habitualesif
y&&
/||
no funcionarán para esos comandos en particular.Por ejemplo, en Linux, GNU
file
todavía sale con 0 si recibió un archivo no existente como argumento yfind
no pudo ubicar el archivo especificado por el usuario.En tales casos, una forma potencial de manejar la situación es mediante la lectura
stderr
/stdin
mensajes, por ejemplo, aquellos que regresaron porfile
comando, o analizar la salida del comando como enfind
. Para ese propósito, secase
podría usar una declaración.(Este es un reenvío de mi propia respuesta a una pregunta relacionada en unix.stackexchange.com )
fuente
Como se menciona en muchas otras respuestas, una simple prueba de
$?
lo hará, como estaSi desea probar si el comando falló , puede usar una versión más corta
bash
(pero quizás exagerada) de la siguiente manera:Esto funciona utilizando el
(( ))
modo aritmético, por lo que si el comando regresósuccess
, es decir$? = 0
, la prueba evalúa a((0))
qué pruebasfalse
, de lo contrario, volverátrue
.Para probar el éxito , puede usar:
pero ya no es mucho más corto que el primer ejemplo.
fuente
Para la prueba de errores de sus comandos:
Inspirado en la fabricación ajustada:
fuente
si [$ (comando)]; entonces echo "tener éxito"; fi
fuente
true
tiene éxitoif [ $(true) ]; then echo "succeed"; fi
perosucceed
no se imprime. De hecho, esto nunca verifica sicommand
tuvo éxito. Solo debe usarseif command
como en la publicación de geirha .$(
)
es la sustitución de comandos .[
]
Es una expresión condicional . En ausencia de división de palabras y expansión de nombre de archivo , esto básicamente prueba sicommand
tuvo salida.