Visszatérési hiba a bash szkriptekben

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 a rmdir á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?

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük