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.