Ho uno script bash come questo:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
Dopo lesecuzione, questo script restituisce un valore al processo successivo, ma anche se lo script è stato eseguito correttamente e lesecuzione di tutte le fasi dello script è stata completata correttamente, restituisce 1.
Perché questo, il processo successivo non è in corso.
Se rimuovo listruzione return, il processo successivo procede senza intoppi. questo problema si è verificato dopo la gradazione del cluster Hadoop che ha Ubuntu 14 e il nuovo cluster Ubuntu 16.
Puoi aiutarci a capire qual è il problema e come il processo successivo viene eseguito correttamente se rimuovi il comando di ritorno qui e qual è limpatto nella produzione se si rimuove listruzione Return?
Commenti
- qual è il passaggio successivo? cosa controlla esattamente il passaggio successivo?
- Il prossimo è HQL (query hive in Hadoop) e ha alcuni passaggi aziendali che è in esecuzione se commento il valore di ritorno funziona bene ma non funziona se commento il ritorno. ho ' t cambiato qualcosa sulla logica di business / script di shell, lunica cosa che abbiamo fatto è aggiornare
Risposta
Listruzione return
restituisce un errore se listruzione non viene eseguita da una funzione.
Nelle funzioni di shell, utilizza return
. Negli script, utilizza exit
.
Un breve script come
#!/bin/bash return 0
produrrà il messaggio di errore
line 1: return: can only `return" from a function or sourced script
e imposterà $?
su 1.
Se non lo fai “t uscire dallo script con un exit
(o se esci con exit
ma senza specificare un codice di uscita), il codice di ritorno lo script nel suo insieme sarà lo stesso dellultimo comando eseguito.
Avere exit "$?"
è uguale a exit
, e se è alla fine dello script, questo può essere completamente omesso.
In generale, suggerisco anche di utilizzare $HOME
piuttosto che tilde negli script. Questo perché $HOME
funziona come qualsiasi altra variabile, mentre tilde viene espansa in un passaggio di espansione separato, il che significa che non si comporta come una variabile e che non viene espansa nelle stringhe tra virgolette . $HOME
è anche più descrittivo e poiché “è uno script, puoi utilizzare alcuni tasti in più per rendere il codice più leggibile.
Commenti
- Ho una query veloce per sopra la tua risposta .. proverò sopra con exist 0 ma ho una domanda sul motivo per cui questo problema si verifica ora solo previsouly uso la stessa query? funziona se commento ritorno listruzione ha un impatto?
- @gsrao Se commentate listruzione
return
, il codice di ritorno dello script sarà quello dellultimo comando eseguito, quindi nel tuo caso qui, puoi sicuramente lasciarlo fuori. Aggiungerò questo alla mia risposta. - Oh..grande … mi stai salvando la vita, quindi il mio caso se commento il ritorno per impostazione predefinita lo script restituirà il flag dellultimo commento riuscito (rmdir ~ / sqoop / " $ TABLE ") giusto? .. qui anche se la risposta funziona io se due semplici domande mi stanno divorando il cervello 1) il mio caso a cosa serve " return $? " come hai detto che funzionerà allo stesso modo se commento il " return $ " 2) cosa potrebbe essere la causa del problema da prima ad ora?
- @gsrao Sì, se commentate il
return
(che non dovrebbe ' essere lì per iniziare poiché ' non è in una funzione, per quanto posso vedere ), lo stato di uscita dello script sarà quello dirmdir
, se ' è lultimo comando nello script. Per quanto riguarda la tua ultima domanda, ' non capisco bene cosa intendi per " il problema da prima a ora ". - La mia ultima domanda … sto usando lo stesso script che ho usato prima di Linux / cluster up gradation funzionava fino a cluster up gradation, perché ora si verifica solo questo problema? quale potrebbe essere la causa di questo problema?