Retourwaardefout in bash-scripts

Ik heb bash-script als volgt:

rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $? 

Na uitvoering van dit script retourneert het een waarde voor het volgende proces, maar hoewel het script met succes is uitgevoerd en alle fasen van het script met succes zijn voltooid, retourneert het 1.

Omdat dit – het volgende proces niet plaatsvindt.

Als ik de return-instructie verwijder, verloopt het volgende proces soepel. dit probleem kwam na de Hadoop-cluster-up-gradatie die Ubuntu 14 en een nieuw cluster Ubuntu 16 hebben.

Kunt u ons helpen begrijpen wat het probleem is en hoe het volgende proces succesvol verloopt als u het retourcommando verwijdert hier en wat is de impact in de productie als de Return-instructie wordt verwijderd?

Reacties

  • wat is de volgende stap? wat controleert de volgende stap precies?
  • De volgende is HQL (hive-query in Hadoop) en het heeft een aantal zakelijke stappen die het uitvoert als ik de geretourneerde waarde becommentarieer, het werkt goed, maar niet als ik commentaar geef op de terugkeer. ik heb ' t verandert iets aan de bedrijfslogica / shell-script het enige dat we hadden gedaan was een upgrade

Antwoord

De instructie return retourneert een fout als de instructie niet wordt uitgevoerd vanuit een functie.

In shell-functies, gebruik return. Gebruik in scripts exit.

Een kort script zoals

#!/bin/bash return 0 

zal de foutmelding

line 1: return: can only `return" from a function or sourced script 

en het zal $? op 1 zetten.

Als u niet “sluit het script niet af met een expliciete exit (of als u afsluit met exit maar zonder een afsluitcode op te geven), de retourcode van het script als geheel zal hetzelfde zijn als het laatst uitgevoerde commando.

exit "$?" hebben is hetzelfde als gewone exit, en als het “aan het einde van het script staat, kan dit volledig worden weggelaten.


In het algemeen stel ik voor dat u $HOME in plaats van tilde in scripts. Dit komt doordat $HOME werkt zoals elke andere variabele, terwijl tilde wordt uitgebreid in een afzonderlijke uitbreidingsstap, wat betekent dat het zich niet gedraagt als een variabele en dat het niet wordt uitgevouwen in tekenreeksen tussen aanhalingstekens . $HOME is ook meer beschrijvend en aangezien het een script is, kun je een paar extra toetsaanslagen gebruiken om de code beter leesbaar te maken.

Opmerkingen

  • Ik heb een snelle vraag voor je antwoord hierboven..Ik zal hierboven proberen met exist 0, maar ik heb één vraag waarom dit probleem nu voorkomt, alleen eerder gebruik ik dezelfde vraag? het werkt als ik een reactie teruggeef statement is this impact iets?
  • @gsrao Als je commentaar geeft op het return statement, zal de retourcode van het script die van het laatst uitgevoerde commando zijn, dus in jouw geval hier, kun je het zeker weglaten. Ik zal dit aan mijn antwoord toevoegen.
  • Oh..groot .. je redt mijn leven, dus mijn geval als ik de terugkeer standaard becommentarieer script zal de vlag van de laatste reactie succesvol retourneren (rmdir ~ / sqoop / " $ TABLE ") toch? ..hier ook al is je beantwoorde werk ik als twee eenvoudige vragen die mijn hersenen opeten 1) mijn geval wat is het gebruik van " return $? " zoals je zei dat het hetzelfde zal werken als ik commentaar geef op de " return $ " 2) wat is er mogelijk waardoor het probleem eerder tot nu toe is veroorzaakt?
  • @gsrao Ja, als je de return (wat er niet ' zou moeten zijn om mee te beginnen omdat het ' niet in een functie zit, voor zover ik kan zien ), zal de exit-status van het script die van rmdir zijn, als dat ' het laatste commando in het script is. Wat betreft uw laatste vraag: ik ' begrijp niet helemaal wat u bedoelt met " het probleem eerder tot nu ".
  • Mijn laatste vraag..ik gebruik hetzelfde script dat ik heb gebruikt voor linux / cluster-up-gradatie het werkte tot cluster-up-gradatie, waarom gebeurt nu alleen dit probleem? wat kan de oorzaak zijn van dit probleem?

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *