GNU/Linux >> Znalost Linux >  >> Linux

Rozdíl v použití mezi proměnnými shellu a proměnnými prostředí?

Vlastně jsem nevěděl, že existují dva různé typy proměnných, ke kterým mám přístup z příkazového řádku. Vše, co jsem věděl, je, že mohu deklarovat proměnné jako:

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

nebo k nim přistupovat pomocí znaku $, například:

echo $foo
echo ${bar[1]}

nebo pomocí vestavěných proměnných, jako:

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

Slyšel jsem, že existují dva (alespoň?) typy proměnných:proměnné prostředí a proměnné prostředí.

  • Jaký je účel mít dva různé typy?
  • Jak poznám, jaký typ proměnné je?
  • Jaká jsou typická použití pro každý z nich?

Přijatá odpověď:

Proměnné prostředí jsou seznam name=value páry, které existují bez ohledu na program (shell, aplikace, démon…). Obvykle je dědí podřízené procesy (vytvořené fork /exec sekvence):dětské procesy dostanou vlastní kopii rodičovských proměnných.

Proměnné shellu existují pouze v kontextu shellu. Dědí se pouze v podskořápkách (tj. když je shell rozvětvený bez exec úkon). V závislosti na vlastnostech shellu mohou být proměnné nejen jednoduché řetězce, jako jsou ty prostředí, ale také pole, složené, typované proměnné jako celé číslo nebo pohyblivá řádová čárka atd.

Když se shell spustí, všechny proměnné prostředí, které zdědí od svého rodiče, se stanou také proměnnými shellu (pokud nejsou neplatné jako proměnné shellu a další rohové případy jako IFS který je resetován některými shelly), ale tyto zděděné proměnné jsou označeny jako exportované. To znamená, že zůstanou dostupné pro podřízené procesy s potenciálně aktualizovanou hodnotou nastavenou shellem. To je také případ proměnných vytvořených pod shellem a označených jako exportované pomocí export klíčové slovo.

Pole a další proměnné komplexního typu nelze exportovat, pokud nelze jejich název a hodnotu převést na name=value vzor nebo když je na místě mechanismus specifický pro shell (např.:bash exportuje funkce v prostředí a některé exotické shelly jiné než POSIX jako rc a es může exportovat pole).

Hlavní rozdíl mezi proměnnými prostředí a proměnnými prostředí je tedy jejich rozsah:proměnné prostředí jsou globální, zatímco neexportované proměnné prostředí jsou pro skript lokální.

Všimněte si také, že moderní shelly (alespoň ksh a bash ) podporuje třetí rozsah proměnných prostředí. Proměnné vytvořené ve funkcích s typeset klíčová slova jsou pro tuto funkci lokální (způsob, jakým je funkce deklarována, povoluje/zakazuje tuto funkci pod ksh a chování perzistence se mezi bash liší a ksh ). Viz https://unix.stackexchange.com/a/28349/2594

Související:Rozdíl mezi „reg save“ a „reg export“?

To platí pro moderní shelly jako ksh , dash , bash a podobné. Starší Bourne shell a shelly jiné než Bourne syntaxe, jako je csh mají různé chování.


Linux
  1. Rozdíl mezi vestavěným příkazem a příkazem, který není?

  2. Rozdíl mezi uvozovkami „…“, „…“, $“…“ a $“…“ ve skořápce?

  3. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  1. Jaký je rozdíl mezi nohoup a ampersand

  2. Jaký je rozdíl mezi &> a >&v bash?

  3. Rozdíl mezi '{}' a {} v příkazu find?

  1. Rozdíl mezi přihlašovacím prostředím a nepřihlašovacím prostředím?

  2. Jaký je rozdíl mezi ls a l?

  3. Jaký je rozdíl mezi unlink a rm?