Tengo un script bash como este:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
Después de ejecutar esta secuencia de comandos, devuelve un valor al siguiente proceso, pero aunque la secuencia de comandos se ejecuta correctamente y todas las etapas de la secuencia de comandos se completaron correctamente, está devolviendo 1.
Porque esto, el siguiente proceso no se está llevando a cabo.
Si elimino la declaración de devolución, el siguiente proceso se realizará sin problemas. este problema se produjo después de la gradación del clúster de Hadoop que tiene Ubuntu 14 y el nuevo clúster tiene Ubuntu 16.
¿Puede ayudarnos a comprender cuál es el problema y cómo se ejecuta correctamente el siguiente proceso si elimina el comando return? aquí y cuál es el impacto en la producción si se quita la declaración de devolución?
Comentarios
- ¿cuál es el siguiente paso? ¿Qué verifica exactamente el siguiente paso?
- El siguiente es HQL (consulta de colmena en Hadoop) y tiene algunos pasos comerciales que se están ejecutando si comento el valor de retorno está funcionando bien pero no se está ejecutando si comento el regreso. Tengo ' t cambios en la lógica de negocios / script de shell, lo único que hicimos fue actualizar
Respuesta
La instrucción return
devuelve un error si la instrucción no se ejecuta desde una función.
En funciones de shell, use return
. En scripts, use exit
.
Un script corto como
#!/bin/bash return 0
producirá el mensaje de error
line 1: return: can only `return" from a function or sourced script
y establecerá $?
en 1.
Si no «t salga del script con un exit
explícito (o si sale con exit
pero sin especificar un código de salida), el código de retorno de el script en su totalidad será el mismo que el último comando ejecutado.
Tener exit "$?"
es lo mismo que exit
, y si está al final de la secuencia de comandos, se puede omitir por completo.
En general, también sugiero que use $HOME
en lugar de tilde en los scripts. Esto se debe a que $HOME
funciona como cualquier otra variable, mientras que la tilde se expande en un paso de expansión separado, lo que significa que no se comporta como una variable y que no se expande en cadenas entre comillas. . $HOME
también es más descriptivo y, dado que es un script, puede utilizar algunas pulsaciones adicionales para hacer que el código sea más legible.
Comentarios
- Tengo una consulta rápida para su respuesta anterior … lo intentaré arriba con exist 0 pero tengo una consulta por qué este problema ocurre ahora solo de manera previa ¿uso la misma consulta? Está funcionando si comento la devolución declaración ¿tiene algún impacto esto?
- @gsrao Si comenta la instrucción
return
, el código de retorno del script será el del último comando ejecutado, así que en tu caso aquí, definitivamente puedes omitirlo. Agregaré esto a mi respuesta. - Oh..grande … estás salvando mi vida, entonces mi caso si comento la devolución por defecto la secuencia de comandos devolverá el indicador de último comentario exitoso (rmdir ~ / sqoop / " $ TABLE ") ¿verdad? ..aquí aunque tu respuesta funcione yo si dos consultas simples que están comiendo mi cerebro 1) mi caso, ¿cuál es el uso de " return $? " como dijiste, funcionará igual si comento el " return $ " 2) ¿Qué puede ser la causa del problema antes?
- @gsrao Sí, si comenta el
return
(que no debería ' estar ahí para empezar, ya que ' no está en una función, por lo que puedo ver ), el estado de salida del script será el dermdir
, si ese ' es el último comando del script. En cuanto a tu última pregunta, ' no entiendo muy bien lo que quieres decir con " el problema anterior hasta ahora ". - Mi última pregunta … estoy usando la misma secuencia de comandos que usé antes de la gradación de linux / cluster up estaba funcionando hasta la gradación de cluster up, ¿por qué ahora solo ocurre este problema? ¿Cuál podría ser la causa de este problema?