Nekem ilyen bash szkriptem van:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
A végrehajtás után ez a szkript értéket ad vissza a következő folyamathoz, de annak ellenére, hogy a szkript sikeresen fut, és a szkript összes szakaszát sikeresen befejezi, visszatér 1-be.
Mivel ez – a következő folyamat nem zajlik.
Ha eltávolítom a return utasítást, a következő folyamat zökkenőmentesen megy. ez a probléma a Hadoop-fürt fokozatossága után következett be, amely az Ubuntu 14-et és az új fürtöt az Ubuntu 16-mal rendelkezik.
Tudna segíteni abban, hogy megértsük, mi a probléma, és hogyan működik a következő folyamat sikeresen, ha eltávolítja a return parancsot itt és mi a hatás a termelésben, ha eltávolítja a Return utasítást?
Megjegyzések
- mi a következő lépés? mit ellenőriz a következő lépés?
- A következő a HQL (Hive lekérdezés a Hadoopban), és van néhány üzleti lépése, amelyek futnak, ha megjegyzem a visszatérési értéket, amely jól működik, de nem fut, ha megjegyzést ír Visszatérés. ' nem változtat semmit az üzleti logikán / shell szkripten, az egyetlen dolog, amit megtettünk, az a frissítés
Válasz
A return
utasítás hibát ad, ha a parancsot nem egy függvény hajtja végre.
A shell függvényekben használja a return
parancsot. A szkriptekben használja az exit
parancsot.
Egy rövid szkript, például a
#!/bin/bash return 0
, a hibaüzenet
line 1: return: can only `return" from a function or sourced script
és a $?
értéket 1-re állítja.
Ha nem “t ne lépjen ki a szkriptből egy explicit exit
paranccsal (vagy ha exit
vel lép ki, de kilépési kód megadása nélkül), akkor a a szkript egésze megegyezik az utoljára végrehajtott paranccsal.
A exit "$?"
birtoklása megegyezik a sima exit
, és ha a szkript végén van, akkor ez teljesen kihagyható.
Általában azt is javaslom, hogy használja a $HOME
helyett tilde a szkriptekben. Ez azért van, mert az $HOME
úgy működik, mint bármely más változó, míg a tilde külön bővítési lépésben bővül, ami azt jelenti, hogy nem változóként viselkedik, és hogy nem bővül idézett karakterláncokban . Az $HOME
is inkább leíró jellegű, és mivel szkript, néhány extra billentyűleütést elkölthet a kód olvashatóbbá tételéhez.
Megjegyzések
- Gyors lekérdezésem van a válaszod fölött … megpróbálom a fentieket létező 0-val, de van egy lekérdezésem, hogy miért fordul elő ez a probléma, csak előzőleg használom ugyanazt a lekérdezést? működik, ha visszatérek állítás ez valamilyen hatással van?
- @gsrao Ha megjegyzi a
return
utasítást, akkor a szkript visszatérési kódja megegyezik az utoljára végrehajtott parancs kódjával, szóval itt a te esetedben mindenképpen elhagyhatod. Ezt hozzáadom a válaszomhoz. - Ó .. nagyszerű .. megmented az életemet, tehát az én esetem, ha alapértelmezés szerint megjegyzem a visszatérést A szkript visszaadja az utolsó megjegyzés sikeres megjelölését (rmdir ~ / sqoop / " $ TABLE ") igaz? nekem, ha két egyszerű kérdés, amely az agyamat éli 1) esetem, mit használ a " return $? ", mint ahogy mondtad, ugyanúgy fog működni, ha megjegyzem a " return $ -t " 2) Mi okozhatja a problémát korábban?
- @gsrao Igen, ha megjegyzi a
return
(aminek ' nem kell ott lennie, hogy kezdje, mivel ' nincs függvényben, amennyire látom ), a szkript kilépési állapota armdir
állapot lesz, ha ez a ' parancs a parancsfájl utolsó parancsának. Ami az utolsó kérdésedet illeti, nem értem ' nagyon, hogy mit értesz a " alatt a kérdéssel korábban ". - Utolsó kérdésem .. ugyanazt a szkriptet használom, mint amit a linux / cluster up gradáció előtt használtam, és a cluster up gradationig működött, miért csak most fordul elő ez a probléma? mi okozhatja ezt a problémát?