GNU/Linux >> Znalost Linux >  >> Linux

Jakýkoli způsob, jak ukončit bash skript, ale ne opustit terminál

Ano; můžete použít return místo exit . Jeho hlavním účelem je vrátit se z funkce shellu, ale pokud ji použijete v source -d skript, vrátí se z tohoto skriptu.

Jako § 4.1 „Bourne Shell Builtins“ Bash Reference Manual říká:

     return [n]

Způsobí ukončení funkce shellu s návratovou hodnotou n .Pokud n není zadán, návratová hodnota je stav ukončení posledního příkazu provedeného ve funkci. Toto lze také použít k ukončení provádění skriptu, který se provádí pomocí . (nebo source ) vestavěný, vrací buď n nebo stav ukončení posledního příkazu provedeného ve skriptu jako stav ukončení skriptu. Jakýkoli příkaz spojený s RETURN trap je spuštěn před obnovením provádění po funkci nebo skriptu. Návratový stav je nenulový, pokud return se používá mimo funkci a ne během provádění skriptu pomocí . nebo source .


Místo spouštění skriptu pomocí . run2.sh , můžete jej spustit pomocí sh run2.sh nebo bash run2.sh

Spustí se nový sub-shell, pro spuštění skriptu se pak na konci skriptu zavře a druhý shell zůstane otevřený.


"Problém" je ve skutečnosti v tom, že skript získáváte a nespouštíte. Když vytvoříte zdrojový soubor, jeho obsah bude spuštěn v aktuálním shellu, místo toho, aby se vytvořil podshell. Takže vše, včetně ukončení, ovlivní aktuální shell.

Místo použití exit , budete chtít použít return .


Za příkaz/příkaz return můžete přidat další příkaz exit, aby fungoval jak pro spuštění skriptu z příkazové řádky, tak pro získávání zdrojů z terminálu.

Příklad výstupního kódu ve skriptu:

   if [ $# -lt 2 ]; then
     echo "Needs at least two arguments"
     return 1 2>/dev/null
     exit 1
   fi

Řádek s exit příkaz nebude volán, když zdroj skriptu zadáte za return příkaz.

Když skript spustíte, return příkaz hlásí chybu. Chybovou zprávu tedy potlačíme jejím přeposláním na /dev/null .


Linux
  1. Nejlepší způsob, jak zjistit (ze skriptu), zda je software nainstalován?

  2. Může být skript spustitelný, ale nečitelný?

  3. Proč dokument Parent Shell Here nefunguje pro dílčí příkaz v Dash, ale funguje Bash?

  1. Získat všechny soubory kromě souborů v poli – Bash?

  2. Jaký je nejlepší způsob, jak zajistit, aby byla spuštěna pouze jedna instance skriptu Bash?

  3. Bash:Proč se nadřazený skript neukončí na SIGINT, když podřízený skript zachytí SIGINT?

  1. Rozdíl mezi operátory Bash [[ Vs [ Vs ( Vs ((?

  2. Příkaz Conda pracuje v příkazovém řádku, ale ne ve skriptu bash

  3. Jaký je nejlepší způsob, jak zkontrolovat, zda je svazek připojen ve skriptu Bash?