Jai un script bash comme celui-ci:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
Après lexécution, ce script renvoie une valeur au processus suivant, mais même si le script sexécute avec succès et que toutes les étapes du script se sont terminées avec succès, il renvoie 1.
Parce que ceci – le processus suivant na pas lieu.
Si je supprime linstruction return, le processus suivant se déroule sans problème. ce problème est survenu après la gradation du cluster Hadoop qui, ayant Ubuntu 14 et le nouveau cluster, a Ubuntu 16.
Pouvez-vous nous aider à comprendre le problème et comment le processus suivant sexécute avec succès si vous supprimez la commande return ici et quel est limpact en production si la suppression de linstruction Return?
Commentaires
- quelle est la prochaine étape? quest-ce que la prochaine étape vérifie exactement?
- La suivante est HQL (requête ruche dans Hadoop) et il comporte des étapes commerciales en cours dexécution si je commente la valeur de retour, cela fonctionne bien mais ne fonctionne pas si vous commentez le revenir. Jai ' t change quoi que ce soit sur la logique métier / le script shell, la seule chose que nous ayons faite est de mettre à niveau
Réponse
Linstruction return
renvoie une erreur si linstruction nest pas exécutée à partir dune fonction.
Dans les fonctions shell, utilisez return
. Dans les scripts, utilisez exit
.
Un script court comme
#!/bin/bash return 0
produira le message derreur
line 1: return: can only `return" from a function or sourced script
et il définira $?
sur 1.
Si vous ne le faites pas « t quitter le script avec un exit
explicite (ou si vous quittez avec exit
mais sans spécifier de code de sortie), le code retour de le script dans son ensemble sera le même que la dernière commande exécutée.
Avoir exit "$?"
est identique à exit
, et si cest à la fin du script, cela peut être complètement omis.
En général, je vous suggère également dutiliser $HOME
plutôt que tilde dans les scripts. En effet, $HOME
fonctionne comme toute autre variable, alors que le tilde est développé dans une étape dexpansion séparée, ce qui signifie quil ne se comporte pas comme une variable et quil nest pas développé entre guillemets . $HOME
est également plus descriptif et comme il « sagit dun script, vous pouvez passer quelques frappes supplémentaires pour rendre le code plus lisible.
Commentaires
- Jai une requête rapide pour ci-dessus votre réponse..Je vais essayer ci-dessus avec exist 0 mais jai une question pourquoi ce problème se produit maintenant seulement auparavant jutilise la même requête? cela fonctionne si je commente le retour est-ce que cela a un impact?
- @gsrao Si vous commentez linstruction
return
, le code retour du script sera celui de la dernière commande exécutée, donc dans votre cas ici, vous pouvez certainement le laisser de côté. Jajouterai ceci à ma réponse. - Oh..grande .. vous me sauvez la vie, donc mon cas si je commente le retour par défaut le script retournera le dernier indicateur de réussite du commentaire (rmdir ~ / sqoop / " $ TABLE ") nest-ce pas? .. ici même si votre réponse fonctionne moi si deux requêtes simples qui mangent mon cerveau 1) mon cas à quoi sert " return $? " comme vous lavez dit, cela fonctionnera de la même manière si je commente le " return $ " 2) quest-ce qui pourrait causer le problème avant maintenant?
- @gsrao Oui, si vous mettez en commentaire
return
(qui ne devrait pas ' être là pour commencer car il ' nest pas dans une fonction, pour autant que je puisse voir ), le statut de sortie du script sera celui dermdir
, si ' est la dernière commande du script. Pour ce qui est de votre dernière question, je ne ' pas très bien comprendre ce que vous entendez par " le problème d’avant en maintenant ". - Ma dernière question … Jutilise le même script que celui que jai utilisé avant la gradation linux / cluster, cela fonctionnait jusquà la gradation du cluster, pourquoi maintenant seul ce problème se produit? quelle pourrait être la cause de ce problème?