GNU/Linux >> Znalost Linux >  >> Linux

Co je Subshell v Linuxu?

Skořápku si již uvědomujete. Je to program, který vám umožní spouštět příkazy v Linuxu. Vaše hlavní interakce s shellem je, když spouštíte příkazy v terminálu.

Dříve nebo později narazíte na termín zvaný „subshell“ a to vás může zmást.

Co je to subshell?

Subshell je v podstatě nový shell pouze ke spuštění požadovaného programu. Subshell má přístup ke globálním proměnným nastaveným 'nadřazeným shellem', ale ne k lokálním proměnným. Jakékoli změny provedené subshellem v globální proměnné nejsou předány nadřazenému shellu.

Dává to smysl? Asi ne. Dovolte mi vysvětlit věci podrobně na příkladech.

Zde je jednořádkový skript, který zobrazuje hodnotu proměnné 'var'.

echo $var

Hodnotu této proměnné jsem nastavil na LHB, co si myslíte, že se zobrazí při spuštění skriptu?

Překvapení! Skript nevidí hodnotu proměnné var Nastavil jsem dříve.

Skripty prostředí se spouštějí v subshell (ve výchozím nastavení)

Proč? Protože když spustíte skript shellu, spustí se do svého vlastního shellu. Protože tento shell pochází z jiného shellu (kde nastavujete proměnnou a kde spouštíte skript), nazývá se subshell.

Skript shellu nemohl vidět hodnotu proměnné, protože se jednalo o lokální proměnnou a nově vytvořený shell ji neznal. Pokud chcete, aby byla proměnná přístupná prostřednictvím jejích podsložek, budete muset použít příkaz export a přeměnit ji na globální proměnnou.

Můžete také vytvořit podskořápku spuštěním nových skořápek ze stávajících. Stačí spustit bash a budete v podslupce. Příkaz exit můžete použít k zavření/opuštění shellu a přesunutí zpět do původního shellu.

Nepředstavujte si subshell jako nové okno terminálu. Vím, že je těžké si to představit, ale je to tak.

Použil jsem proměnnou k zobrazení rozdílu mezi dvěma shelly (nadřazeným a podslupkou). Proměnná var nebyl v tomto případě exportován, a proto nebyl subshell znám.

Vnořené podskořápky

Stejným způsobem můžete vytvořit také vnořené podskořápky. Po exportu zůstane proměnná exportována do všech následně vytvořených subshellů.

Hodnotu exportované proměnné můžete změnit v dílčím shellu. Změněná hodnota bude předána do následujících subshellů (protože samotná proměnná je globální), ale pokud ji opustíte a vrátíte se zpět do původního shellu, původní hodnota zůstane zachována.

Proč? Protože hodnota exportované proměnné se zkopíruje do subshell. A právě kopie se mění (z LHB na HOC). Původní hodnota zůstává stejná v nadřazeném prostředí.

Mějte to na paměti, neexistuje žádný způsob, jak změnit hodnotu proměnné v nadřazeném shellu z podshell . Nezáleží na tom, zda exportujete proměnnou nebo ne, proměnná se v nadřazeném shellu nezmění.

Bonusový tip:Spusťte skript shellu v aktuálním prostředí

Normálním chováním je, že skript shellu se spouští ve vlastním shellu, tj. v podshellu.

Toto chování můžete změnit a spustit skript shellu v aktuálním prostředí díky vestavěnému příkazu prostředí s názvem tečka (.).

Ne, není to totéž jako spuštění skriptu shellu, jako je tento ./script. Místo toho jej spustíte takto:

. script

Tímto způsobem jsou příkazy ze skriptu prováděny aktuálním shellem, jako by byly zadány do terminálu, místo aby byly spouštěny pomocí skriptu v podshellu. Skripty mohou tímto způsobem přistupovat k lokálním proměnným.

Myslím, že to jsou dostatečné informace o subshell v Linuxu.

Už tomu rozumíte lépe, nebo jste zmatenější než kdy jindy? Neváhejte se vyjádřit v komentářích jako člen LHB.


Linux
  1. Jak nastavit proměnnou $PATH v Linuxu

  2. Co je uživatel Linuxu?

  3. Co je Umask v Linuxu

  1. Proč je proměnná viditelná v podslupce?

  2. Jak změnit Shell v Linuxu

  3. Co je Red Hat Linux?

  1. Jaké jsou různé typy shellů v Linuxu?

  2. UNIX / Linux:Co je to Shell? Jaké jsou různé Shelly?

  3. Co dělá % v řetězcích shellu Linux?