Chyba návratové hodnoty ve skriptech bash

Mám bash skript takto:

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

Po provedení tohoto skriptu vrací hodnotu do dalšího procesu, ale přestože skript běží úspěšně a úspěšné dokončení všech fází skriptu se vrací 1.

Protože toto – další proces neprobíhá.

Pokud odstraním příkaz return, další proces proběhne hladce. tento problém nastal po přechodu klastru Hadoop, který má Ubuntu 14 a nový klastr s Ubuntu 16.

Můžete nám prosím pomoci pochopit, o co jde a jak úspěšně běží další proces, pokud odstraníte příkaz return zde a jaký je dopad na produkci, pokud odstraníte příkaz Return?

Komentáře

  • jaký je další krok? co přesně zkontroluje další krok?
  • Další je HQL (dotaz úlu v Hadoop) a má nějaké obchodní kroky, které běží, když okomentuji návratovou hodnotu, funguje dobře, ale neběží, pokud okomentuje vrátit se. ' t nic nemění na obchodní logice / shell skriptu, jedinou věcí, kterou jsme udělali, je upgrade

odpověď

Příkaz return vrací chybu, pokud příkaz není proveden z funkce.

Ve funkcích prostředí použijte return. Ve skriptech použijte exit.

Krátký skript jako

#!/bin/bash return 0 

vytvoří chybová zpráva

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

a nastaví $? na 1.

Pokud ne Skript nelze opustit explicitním exit (nebo pokud opustíte exit, ale bez zadání kódu ukončení), návratovým kódem skript jako celek bude stejný jako poslední provedený příkaz.

Mít exit "$?" je stejné jako obyčejný exit, a pokud je na konci skriptu, může být zcela vynechán.


Obecně také doporučuji použít $HOME spíše než vlnovku ve skriptech. Důvodem je, že $HOME funguje jako každá jiná proměnná, zatímco vlnovka se rozšiřuje v samostatném kroku rozšiřování, což znamená, že se chová jako proměnná a že se nerozšiřuje v uvozovkách . $HOME je také popisnější a protože se jedná o skript, můžete utratit několik dalších stisků kláves, aby byl kód čitelnější.

Komentáře

  • Mám rychlý dotaz na vaši odpověď..zkusím výše s existovat 0, ale mám jeden dotaz, proč se tento problém stane nyní, pouze previsouly, používám stejný dotaz? funguje to, když vrátím komentář prohlášení je tento dopad nějaká věc?
  • @gsrao Pokud komentujete příkaz return, návratovým kódem skriptu bude kód posledního provedeného příkazu, takže ve vašem případě zde to můžete rozhodně vynechat. Přidám to ke své odpovědi.
  • Ach … skvělý .. zachraňujete mi život, takže můj případ, pokud ve výchozím nastavení komentuji návrat skript vrátí poslední komentář úspěšný příznak (rmdir ~ / sqoop / " $ TABLE ") správně? .. i když vaše odpověď funguje me if two simple queries which are eating my brain 1) my case what is use of " návrat $? " jak jste řekl, bude fungovat stejně, pokud okomentuji " návrat $ " 2) co je možné, že problém vznikne dříve?
  • @gsrao Ano, pokud komentujete return (který by ' tam neměl být, protože ' není ve funkci, pokud vidím ), bude stav ukončení skriptu rmdir, pokud je ' posledním příkazem ve skriptu. Pokud jde o vaši poslední otázku, nerozumím ' tomu, co máte na mysli tím " problémem dříve

.

  • Moje poslední otázka..Já používám stejný skript, jaký používám před gradací linuxu / clusteru, fungoval až do gradace clusteru, proč se nyní stává pouze tento problém? co by mohlo být příčinou tohoto problému?
  • Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *