Am un script bash astfel:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
După executarea acestui script, returnează o valoare la următorul proces, dar chiar dacă scriptul rulează cu succes și execută toate etapele scriptului finalizat cu succes, acesta revine 1.
Deoarece acest lucru – următorul proces nu are loc.
Dacă elimin instrucțiunea return, următorul proces se desfășoară fără probleme. această problemă a apărut după gradarea Hadoop cluster up care are Ubuntu 14 și noul cluster au Ubuntu 16.
Ne puteți ajuta să înțelegem care este problema și cum urmează următorul proces cu succes dacă eliminați comanda return aici și ce impact are producția dacă eliminați declarația Return?
Comentarii
- care este următorul pas? ce verifică exact pasul următor?
- Următorul este HQL (interogare de tip stup în Hadoop) și are câțiva pași de afaceri pe care îi rulează dacă comentez valoarea de returnare funcționează bine, dar nu se execută dacă comentează întoarcere. ' nu schimb nimic în logica de afaceri / scriptul shell singurul lucru pe care l-am făcut este să actualizăm
Răspunde
Instrucțiunea return
returnează o eroare dacă instrucțiunea nu este executată dintr-o funcție.
În funcțiile shell, utilizați return
. În scripturi, utilizați exit
.
Un script scurt ca
#!/bin/bash return 0
va produce mesaj de eroare
line 1: return: can only `return" from a function or sourced script
și va seta $?
la 1.
Dacă nu „nu ieșiți din script cu un exit
explicit (sau dacă ieșiți cu exit
dar fără a specifica un cod de ieșire), codul de returnare al scriptul în ansamblu va fi același cu ultima comandă executată.
Având exit "$?"
este același lucru ca simplu exit
, iar dacă este la sfârșitul scriptului, acest lucru poate fi lăsat complet în afara.
În general, vă sugerez, de asemenea, să utilizați $HOME
mai degrabă decât tilde în scripturi. Acest lucru se datorează faptului că $HOME
funcționează ca orice altă variabilă, în timp ce tilda este extinsă într-un pas de expansiune separat, ceea ce înseamnă că nu se comportă ca o variabilă și că nu este extinsă în șiruri citate . $HOME
este, de asemenea, mai descriptiv și din moment ce este un script, puteți cheltui câteva apăsări de tastă suplimentare pentru a face codul mai lizibil.
Comentarii
- Am o interogare rapidă pentru răspunsul dvs. de mai sus .. voi încerca mai sus cu existența 0, dar am o singură întrebare de ce se întâmplă această problemă acum doar dacă folosesc aceeași interogare? funcționează dacă comentariu returnează declarația este acest impact ceva?
- @gsrao Dacă comentați declarația
return
, codul de returnare al scriptului va fi cel al ultimei comenzi executate, deci, în cazul dvs. aici, îl puteți lăsa cu siguranță. Voi adăuga acest lucru la răspunsul meu. - Oh..mare .. îmi salvați viața, deci cazul meu dacă comentez returnarea în mod implicit scriptul va returna ultimul comentariu cu succes (rmdir ~ / sqoop / " $ TABLE ") nu? .. aici chiar dacă răspunsul dvs. funcționează eu dacă două întrebări simple care îmi mănâncă creierul 1) cazul meu ce folosesc " returnează $? " așa cum ai spus că va funcționa la fel dacă comentez " returnează $ " 2) ce poate fi posibil să provoace problema mai devreme acum?
- @gsrao Da, dacă comentați
return
(care nu ar trebui să ' să fie acolo pentru a începe, deoarece ' nu este într-o funcție, din câte văd ), starea de ieșire a scriptului va fi cea armdir
, dacă ' este ultima comandă din script. În ceea ce privește ultima întrebare, nu ' nu înțeleg destul ce vrei să spui prin " problema anterioară până acum ". - Ultima mea întrebare..utilizez același script ce am folosit înainte de linux / cluster up gradation, a funcționat până la cluster up gradation, de ce acum se întâmplă doar această problemă? care ar putea fi cauza acestei probleme?