¿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 deelseyfi: `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
ifcon más detalle.fuente
$?hace, por lo que es incorrecto al decir que probar el comando directamente es estrictamente mejor.localcomando, es decir,local foo=$(false); echo $?;produce0en la salida. Perolocalsolo es relevante dentro de las funciones bash.fuente
commanddevuelve un error en la pantalla, ¿cómo ocultarlo?commandescribe errores en stderr, puede usar el formulariocommand 2> /dev/null && echo OK || echo Failed. Las2> /dev/nullredirecciones 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 elifmé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 failse 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...fiy&&/||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 habitualesify&&/||no funcionarán para esos comandos en particular.Por ejemplo, en Linux, GNU
filetodavía sale con 0 si recibió un archivo no existente como argumento yfindno pudo ubicar el archivo especificado por el usuario.En tales casos, una forma potencial de manejar la situación es mediante la lectura
stderr/stdinmensajes, por ejemplo, aquellos que regresaron porfilecomando, o analizar la salida del comando como enfind. Para ese propósito, secasepodrí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
truetiene éxitoif [ $(true) ]; then echo "succeed"; fiperosucceedno se imprime. De hecho, esto nunca verifica sicommandtuvo éxito. Solo debe usarseif commandcomo 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 sicommandtuvo salida.