una - scripts bash ejemplos
¿Cuál es la mejor manera de escribir una función de contenedor que ejecuta comandos y registra su código de salida? (2)
Adicional a "$@"
lo que Douglas dice, usaría
return $?
Y no exit
Saldría de su caparazón en lugar de regresar de la función. Si en algunos casos desea salir de su caparazón si algo salió mal, puede hacerlo en la persona que llama:
do_cmd false i will fail executing || exit
# commands in a row. exit as soon as the first fails
do_cmd one && do_cmd && two && do_cmd three || exit
(De esa forma, puede manejar fallas y luego salir con gracia).
Actualmente utilizo esta función para ajustar los comandos de ejecución y registrar su ejecución, y el código de retorno, y salir en caso de un código de retorno distinto de cero.
Sin embargo, esto es problemático ya que aparentemente hace una doble interpolación, haciendo que los comandos con comillas simples o dobles rompan la secuencia de comandos.
¿Puedes recomendar una mejor manera?
Aquí está la función:
do_cmd()
{
eval $*
if [[ $? -eq 0 ]]
then
echo "Successfully ran [ $1 ]"
else
echo "Error: Command [ $1 ] returned $?"
exit $?
fi
}
"$@"
De http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters :
@
Se expande a los parámetros posicionales, comenzando desde uno. Cuando la expansión ocurre entre comillas dobles, cada parámetro se expande a una palabra separada. Es decir, "$ @" es equivalente a "$ 1" "$ 2" .... Si la expansión de comillas dobles ocurre dentro de una palabra, la expansión del primer parámetro se une con la parte inicial de la palabra original, y el la expansión del último parámetro se une con la última parte de la palabra original. Cuando no hay parámetros posicionales, "$ @" y $ @ se expanden a nada (es decir, se eliminan).
Esto significa que los espacios en los argumentos se vuelven a citar correctamente.
do_cmd()
{
"$@"
ret=$?
if [[ $ret -eq 0 ]]
then
echo "Successfully ran [ $@ ]"
else
echo "Error: Command [ $@ ] returned $ret"
exit $ret
fi
}