M. Garrels. Bash Guide. Proměnné. Jak nastavit a zakázat místní, uživatelské a systémové proměnné prostředí v Linuxu Jak zjistit, kde je zapsána proměnná prostředí

Variabilní typy

Jak můžete vidět z příkladů výše, proměnné shellu jsou obvykle psány velkými písmeny. Bash ukládá seznamy proměnných dvou typů:

Globální proměnné

Globální proměnné nebo proměnné prostředí jsou dostupné ve všech shellech. Chcete-li zobrazit proměnné prostředí, můžete použít příkazy env nebo printenv. Tyto příkazy jsou součástí balíčku sh-utils.

Níže je typický výstup:

Franky ~> printenv CC=gcc CDPATH=.:~:/usr/local:/usr:/ CFLAGS=-O2 -fomit-frame-pointer COLORTERM=gnome-terminal CXXFLAGS=-O2 -fomit-frame-pointer DISPLAY=: 0 DOMAIN=hq.garrels.be e= TOR=vi FCEDIT=vi FIGNORE=.o:~ G_BROKEN_FILENAMES=1 GDK_USE_XFT=1 GDMSESSION=Výchozí GNOME_DESKTOP_SESSION_ID=Výchozí GTK_RC_FILES=/ettkgrc/gnet/gtk. -1.2-gnome2 GWMCOLOR=tmavězelená GWMTERM=xterm HISTFILESIZE=5000 history_control=ignoredups HISTSIZE=2000 HOME=/nethome/franky HOSTNAME=octarine.hq.garrels.be INPUTRC=/etc/inputrc/JAVArHNAME=javky/JAVArHNAME=franky j2sdk1.4.0 LANG=cs_US LDFLAGS=-s LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins LESSCHARSET=latin1 LESS=-edfMQ LESSOPEN=|/usr/bin/lesspipe.sh %s LEX=flex LOCAL_MACHINE=octarine LOGNAME=franky LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd= 40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*. com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz= 01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01; 31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31: *.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*. tif=01;35: MACHINES=octarine MAILCHECK=60 MAIL=/var/mail/franky MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man MEAN_MACHINES= octarine MOZ_DIST_BIN=/usr/lib/mozilla MOZILLA_FIVE_HOME=/usr/lib/mozilla MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin MTOOLS_FAT_COMPATIBILITY=1 MYMALLOC=0 NNTPPORT=119 NNTPin/plugSERns_THSINGLUXPlugverns= / usr/lib/netscape/plugins OLDPWD=/nethome/franky OS=Linux PAGER=méně PATH=/nethome/franky/bin.Linux:/nethome/franky/bin:/usr/local/bin:/usr/local/ sbin :/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:. PS1=\[\033franky je v \w\[\033 PS2=Další vstup> PWD=/nethome/franky SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106 SHELL=/bin /bash SHELL_LOGIN=--login SHLVL=2 SSH_AGENT_PID=22161 SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106 USERWTERNAME=TYPEM=typetw START_NAME franky USER=franky _=/usr/bin/printenv VISUAL=vi WINDOWID=20971661 XAPPLRESDIR=/nethome/franky/app-defaults XAUTHORITY=/nethome/franky/.Xauthority XENVIRONMENT=/nethome/franky/.Xdefaults XFILESEARTHPAULTS /X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11 /%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S :/usr/X11R6/lib/X11/%T/%N%S XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB XMODIFIERS=@im=none XTERMID= XWINHOME=/usr/X11R6 X=X11R6 - YACC=bison y

Lokální proměnné

Lokální proměnné jsou dostupné pouze v aktuálním příkazovém prostředí. Pokud je vestavěný příkaz soubor je použit bez jakýchkoli parametrů, vrátí seznam všech proměnných (včetně runtime proměnných) a funkcí. Použijme formátování a vytvořme seřazený výsledek, který zohledňuje umístění proměnných.

Níže je soubor diff vytvořený porovnáním výsledků příkazů printenv A soubor, po odebrání ze seznamu funkcí, které jsou také zobrazeny příkazem soubor:

Franky ~> diff set.sorted printenv.sorted | grep"<" | awk "{ print $2 }" BASE=/nethome/franky/.Shell/hq.garrels.be/octarine.aliases BASH=/bin/bash BASH_VERSINFO=(="2" BASH_VERSION="2.05b.0(1)-release" COLUMNS=80 DIRSTACK=() DO_FORTUNE= EUID=504 GROUPS=() HERE=/home/franky HISTFILE=/nethome/franky/.bash_history HOSTTYPE=i686 IFS=$" LINES=24 MACHTYPE=i686-pc-linux-gnu OPTERR=1 OPTIND=1 OSTYPE=linux-gnu PIPESTATUS=(="0") PPID=10099 PS4="+ PWD_REAL="pwd SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor THERE=/home/franky UID=504

Dělení proměnných podle jejich obsahu

Kromě rozdělení proměnných na lokální a globální je můžeme také rozdělit do kategorií podle toho, jaký obsah je v proměnné uložen. V tomto ohledu jsou proměnné rozděleny do čtyř typů:

  • Řetězcové proměnné
  • Celočíselné proměnné
  • Proměnné - konstanty
  • Proměnné - pole

Tyto typy proměnných probereme v kapitole 10. Nyní v našich proměnných použijeme celočíselné a řetězcové hodnoty.

Vytváření proměnných

V proměnných se rozlišují velká a malá písmena a standardně se používají velká písmena. Někdy je zvykem používat pro zápis lokálních proměnných malá písmena. Pro názvy proměnných však můžete použít libovolné znaky a dokonce kombinovat velká a malá písmena. Čísla můžete použít i v názvech proměnných, ale názvy začínající čísly nejsou povoleny:

Prompt> export 1number=1 bash: export: `1number=1": neplatný identifikátor

Chcete-li nastavit proměnnou v příkazovém prostředí, použijte následující příkaz

VARNAME="value"

Kolem rovnítka nevkládejte mezery, způsobí to chyby. Když přiřazujete hodnoty proměnným, je dobrým zvykem uzavřít obsah řetězce do uvozovek; tím se snižuje šance, že uděláte chybu.

Některé příklady použití velkých a malých písmen, čísel a mezer (zpráva příkaz nenalezen označuje problém - Cca.):

Franky ~> MYVAR1="2" franky ~> echo $MYVAR1 2 franky ~> first_name="Franky" franky ~> echo $first_name Franky franky ~> full_name="Franky M. Singh" franky ~> echo $full_name Franky M. Singh franky ~> MYVAR-2="2" bash: MYVAR-2=2: příkaz nenalezen franky ~> MYVAR1 ="2" bash: MYVAR1: příkaz nebyl nalezen franky ~> MYVAR1= "2" bash: 2: příkaz nenalezeno franky ~> unset MYVAR1 first_name full_name franky ~> echo $MYVAR1 $first_name $full_name<--no output-->Franky ~>

Export proměnných

Proměnná vytvořená podle příkladu výše je dostupná pouze v aktuálním příkazovém prostředí. Toto je lokální proměnná: podřízené procesy aktuálního shellu si tuto proměnnou neuvědomují. Abychom mohli předat proměnné do subshell, potřebujeme vývozní pomocí vestavěného příkazu vývozní. Proměnné, které se exportují, se nazývají proměnné prostředí. Přiřazení hodnoty a export se obvykle provádí v jednom kroku:

Exportovat VARNAME="value"

Subshell může změnit proměnné, které jsou zděděny z nadřazeného procesu, ale změny provedené podřízeným procesem neovlivní nadřazený proces. To je ukázáno na následujícím příkladu:

Franky ~> full_name="Franky M. Singh" franky ~> bash franky ~> echo $full_name franky ~> exit franky ~> export full_name franky ~> bash franky ~> echo $full_name Franky M. Singh franky ~> export full_name= "Charles the Great" franky ~> echo $full_name Charles the Great franky ~> exit franky ~> echo $full_name Franky M. Singh franky ~>

Když se podshell poprvé pokusí přečíst hodnotu full_name , hodnota není nastavena (příkaz echo ukazuje prázdný řádek). Po ukončení subshell je proměnná full_name exportována do nadřazeného shellu - proměnnou lze exportovat poté, co jí byla přiřazena hodnota. Poté se spustí nový subshell zobrazující proměnnou exportovanou z nadřazeného shellu. Proměnná je upravena a bude v ní uložena jiná hodnota, ale v nadřazeném shellu zůstává hodnota této proměnné stejná.

Rezervované proměnné

Bourne Reserved Shell Variables

Bash používá určité proměnné shellu stejně jako Bourne shell. V některých případech Bash přiřadí proměnné její výchozí hodnotu. Níže uvedená tabulka ukazuje Stručný popis tyto jednoduché proměnné shellu:

Tabulka 3.1. Bourne Reserved Shell Variables

Název proměnné Definice

Seznam adresářů oddělených dvojtečkami, které se používají při hledání cesty pomocí vestavěného příkazu CD.

Domovský adresář současný uživatel; používá se ve výchozím nastavení ve vestavěném příkazu CD. Hodnota této proměnné se také používá místo znaku tilda.

Seznam znaků používaných k oddělení polí; používá se, když shell po provedení všech substitucí rozdělí výsledek na jednotlivá slova.

Pokud je tento parametr nastaven na název souboru a MAILPATH není nastavena, Bash bude informovat uživatele, že pošta byla přijata do zadaného souboru.

Dvojtečkou oddělený seznam názvů souborů, který příkazový shell pravidelně kontroluje, zda neobsahuje novou poštu.

Hodnota posledního argumentu v parametru zpracovávaném vestavěným příkazem getopts.

Index posledního argumentu parametru zpracovaného vestavěným příkazem getopts.

Dvojtečkou oddělený seznam adresářů, ve kterých shell hledá příkazy.

Primární promptní linka. Výchozí hodnota je ""\s-\v\$ "".

Sekundární promptní linka. Výchozí hodnota je ""> "".

Bash Reserved Variables

Hodnoty těchto proměnných jsou nastaveny nebo použity v Bash, ale v jiných shellech se s nimi obecně nezachází jako se speciálními.

Tabulka 3.2. Bash Reserved Variables

Název proměnné Definice

Tato proměnná řídí, jak shell interaguje s uživatelem a provádí úkoly.

Úplná cesta použitá ke spuštění aktuální instance Bash.

Pokud je tato proměnná nastavena v době, kdy je Bash vyvolán ke spuštění skriptu, její hodnota se použije jako název spouštěcího souboru, který je nutné přečíst před spuštěním skriptu.

Číslo verze aktuální instance Bash.

Proměnná je pole pouze pro čtení, jehož prvky pole ukládají informace o verzi tohoto případu Bash.

Při tisku vybraných seznamů se používá vestavěný příkaz vybrat k určení šířky terminálu. Automaticky nastaveno při příjmu signálu SIGWINCH.

Ukazatel v $(COMP_WORDS) na slovo, které ukládá aktuální pozici kurzoru.

Aktuální příkazový řádek.

Ukazatel na aktuální pozici kurzoru vzhledem k začátku aktuálního příkazu.

Proměnná je pole skládající se z jednotlivých slov použitých na aktuálním příkazovém řádku.

Proměnná je pole, ze kterého Bash čte možné možnosti dokončování řetězců generované funkcí shellu volanou službou navrženou k dokončení programu

Proměnná je pole, které ukládá aktuální stav zásobníku adresářů.

Číselné efektivní ID uživatele ID aktuálního uživatele.

Výchozí editor používaný ve vestavěném příkazu fc je zadán parametr -e

Seznam přípon oddělených dvojtečkou, které by měly být ignorovány při provádění automatického doplňování názvu souboru.

Název aktuálně spuštěné funkce shellu.

Seznam vzorů oddělených dvojtečkami, které definují sadu názvů souborů, které mají být ignorovány při nahrazování názvů souborů.

Proměnná je pole obsahující seznam skupin, do kterých aktuální uživatel patří.

Až tři postavy, které řídí nahrazování historie příkazů, rychlé nahrazování a rozdělování dokončených substitucí do žetonů.

Číslo aktuálního příkazu v historii příkazů nebo jeho index v seznamu historie příkazů.

Určuje, zda bude příkaz přidán do souboru historie příkazů.

Název souboru, ve kterém je uložena historie příkazů. Výchozí hodnota: ~/.bash_history.

Výchozí maximální počet řádků obsažených v souboru historie příkazů je 500.

Seznam vzorů oddělených dvojtečkami, které určují, zda má být příkaz uložen do seznamů historie příkazů.

Výchozí maximální počet příkazů, které lze uložit do seznamu historie příkazů, je 500.

Obsahuje název souboru ve stejném formátu jako soubor /etc/hosts, který lze přečíst, když příkazový shell potřebuje doplnit název hostitele.

Aktuální název hostitele.

Řetězec popisující stroj, na kterém běží Bash.

Řídí, co shell udělá, když přijme znak jako ukončovací znak vstupního proudu EOF(symbol konce souboru).

Název inicializačního souboru programu Readline, který nahrazuje výchozí soubor /etc/inputrc.

Používá se k definování kategorie národního prostředí pro všechny kategorie, které nejsou explicitně specifikovány proměnnými, jejichž názvy začínají znaky LC_ .

Tato proměnná přepíše hodnotu proměnné LANG a všechny ostatní proměnné, které začínají znaky LC_, které určují kategorii lokalizace.

Tato proměnná určuje pořadí řazení používané při třídění názvů souborů se shodou se vzorem a určuje interpretaci rozsahů, tříd shody a pravidel porovnávání znaků pro nahrazování názvu souboru a shodu se vzorem.

Tato proměnná určuje, jak jsou znaky interpretovány a zda patří do určité třídy pro rozšíření názvu souboru a shodu se vzorem.

Tato proměnná určuje kategorii lokalizace používanou ke zpracování řetězců dvojité uvozovky, před kterým je uveden symbol $.

Tato proměnná určuje kategorii lokalizace pro formát čísla.

Číslo řádku ve skriptu nebo funkci shellu, která se aktuálně spouští.

Používá se vestavěným příkazem vybrat k určení délky sloupce, ve kterém se zobrazují vybrané seznamy.

Řetězec, který plně popisuje typ systému, na kterém Bash běží, pomocí standardního formátu GNU CPU-COMPANY-SYSTEM.

Určuje v sekundách, jak často by měl shell kontrolovat poštu v souborech zadaných v proměnných MAILPATH nebo MAIL.

Předchozí pracovní adresář nastavený pomocí vestavěného příkazu CD.

Pokud je nastaveno na 1, Bash zobrazuje chybové zprávy generované vestavěným příkazem getopts.

Popis řetězce operační systém, která provozuje Bash.

Proměnná je pole obsahující seznam hodnot výstupního stavu procesu v posledním kanálu (který může sestávat z jediného příkazu).

Pokud je tato proměnná přidána do prostředí při spuštění bash, shell přejde do režimu POSIX.

Pokud je tato proměnná nastavena, hodnota je interpretována jako příkaz, který se provede před každým vydáním primárního řádku (PS1).

Hodnota této proměnné se používá pro příkaz vybrat jako příkazový řetězec. Výchozí - ""#? ""

Hodnota řetězce výzvy, který je zadán před příkazovým řádkem, když je volba -x nastavena tak, aby umožňovala ozvěnu příkazový řádek; výchozí je ""+ "".

Aktuální pracovní adresář nastavený vestavěným příkazem CD.

Při každém přístupu k tomuto parametru se vygeneruje náhodné celé číslo v rozsahu od 0 do 32767. Hodnota této proměnné se používá v generátorech náhodných čísel.

Výchozí proměnná ve vestavěném příkazu číst.

Tato proměnná udává počet sekund, které uplynuly od spuštění příkazového shellu.

Seznam parametrů nastavených v příkazovém shellu; oddělené dvojtečkami.

Při každém spuštění nové instance Bash se zvýší o jednu.

Hodnota tohoto parametru se používá jako řetězec, který určuje formát pro vydávání informací o běhu pro kanály, kterým předchází vyhrazené slovo. čas.

Pokud je proměnná TMOUT nastavena na hodnotu větší než nula, pak se s ní ve vestavěném příkazu zachází jako s výchozím časovým limitem. číst. Když je příkazový shell spuštěn v interaktivním režimu, je tato hodnota interpretována jako počet sekund, po které bude shell čekat na vstup po vydání úvodního řádku. Pokud není přijat žádný vstup, po uplynutí této doby Bash odejde.

Číselná hodnota, skutečné uživatelské ID pro aktuálního uživatele.

Další informace najdete na manuálových stránkách nebo dokumentaci Bash. Některé proměnné jsou pouze pro čtení, některé se nastavují automaticky a některé ztrácejí smysl, když jsou nastaveny na jinou než výchozí hodnotu.

Speciální parametry

Příkazový shell zachází s některými parametry zvláštním způsobem. Tyto parametry lze použít pouze k získání hodnot z nich, nelze jim přiřadit hodnoty.

Tabulka 3.3. Bash speciální proměnné

Symbol Definice

Vrátí poziční parametry počínaje prvním. Když je parametr uveden v uvozovkách, je nahrazen jedním slovem obsahujícím hodnoty každého parametru, oddělené prvním znakem speciální proměnné IFS.

Vrátí poziční parametry počínaje prvním. Když je parametr uveden v uvozovkách, každý parametr je vrácen jako samostatné slovo.

Vrátí počet pozičních parametrů zadaných jako desítkovou hodnotu.

Vrátí návratový kód posledního kanálu provedeného v režimu popředí.

Parametr spojovník vrací příznaky aktuálního parametru tak, jak byly nastaveny při volání vestavěného příkazu soubor, nebo jak byly nastaveny samotným shellem (například -i).

Vrátí ID procesu shellu.

Vrátí ID procesu posledního příkazu provedeného v režimu na pozadí (asynchronní).

Vrátí název shellu nebo skriptu.

Hodnota parametru "podtržítko" je nastavena při spuštění příkazového shellu a obsahuje celé jméno shell nebo skript, který se provede tak, jak byl předán v seznamu argumentů. Hodnota pak bude nahrazena posledním argumentem předchozího příkazu. Tento parametr také určuje úplnou cestu ke každému příkazu provedenému a umístěnému v prostředí, které bylo do tohoto příkazu exportováno. Při kontrole pošty tento parametr obsahuje název souboru pošty.

Poziční parametry jsou slova následující za názvem skriptu shellu. Jsou uloženy v proměnných $1, $2, $3 a tak dále. Proměnné se do vnitřního pole přidávají podle potřeby. Proměnná $# určuje celkový počet parametrů, jak ukazuje následující jednoduchý skript:

# positional.sh # Tento skript načte 3 poziční parametry a vytiskne je. POSPAR1="$1" POSPAR2="$2" POSPAR3="$3" echo "$1 je první poziční parametr, \$1." echo "$2 je druhý poziční parametr, \$2." echo "$3 je třetí poziční parametr, \$3." echo echo "Celkový počet pozičních parametrů je $#."

Při spouštění skriptu můžete zadat libovolný počet argumentů:

Franky ~> positional.sh jedna dva tři čtyři pět jedna je první poziční parametr, $1. two je druhý poziční parametr, $2. tři je třetí poziční parametr, $3. Celkový počet pozičních parametrů je 5. franky ~> positional.sh jedna dvě jedna je první poziční parametr, $1. two je druhý poziční parametr, $2. je třetí poziční parametr, $3. Celkový počet polohových parametrů je 2.

Další informace o použití těchto parametrů naleznete v kapitole 7, Podmíněné příkazy, a v části o vestavěném příkazu shift.

Některé příklady dalších speciálních parametrů:

Franky ~> slovník grep /usr/share/dict/words slovník franky ~> echo $_ /usr/share/dict/words franky ~> echo $$ 10662 franky ~> mozilla & 11064 franky ~> echo $! 11064 franky ~> echo $0 bash franky ~> echo $? 0 franky ~> ls doesnotexist ls: doesnotexist: Žádný takový soubor nebo adresář franky ~> echo $? 1 upřímný ~>

Uživatel upřímný začíná zadáním příkazu grep, který přiřadí hodnotu proměnné _ . ID procesu tohoto shellu je 10662. Pokud je provádění nějaké úlohy přeneseno na režim na pozadí, v proměnné! bude tam identifikátor procesu pozadí práce. Funkční příkazový shell je bash. Pokud došlo k chybě v proměnné? bude návratový kód odlišný od 0 (nula).

Rozšíření rozsahu použití skriptů, které mají proměnné

Kromě toho, že váš skript bude čitelnější, mohou vám proměnné také pomoci rychle použít váš skript v jiných kontextech nebo pro jiné účely. Zvažte následující příklad – velmi jednoduchý skript, který funguje na vzdáleném serveru záložní kopie domovský adresář uživatele upřímný:

#!/bin/bash # Tento skript vytvoří zálohu mého domovského adresáře. cd /home # Tím se vytvoří archiv tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1 # Nejprve odstraňte starý soubor bzip2. Chyby přesměrování, protože to generuje nějaké, pokud archiv # neexistuje. Poté vytvořte nový komprimovaný soubor. rm /var/tmp/home_franky.tar.bz2 2> /dev/null bzip2 /var/tmp/home_franky.tar # Zkopírujte soubor na jiný hostitel - máme ssh klíče, aby to fungovalo bez zásahu. scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1 # Vytvořte časové razítko v souboru protokolu. datum >> /home/franky/log/home_backup.log zálohování echa bylo úspěšné >> /home/franky/log/home_backup.log

Za prvé, je větší pravděpodobnost, že uděláte chyby, pokud ručně určíte soubory a adresáře pokaždé, když je potřebujete. Za druhé, předpokládejme uživatele upřímný chce tento skript předat uživateli Koleda, pak předtím Koleda bude moci použít skript pro Rezervovat kopii svůj domovský adresář, bude muset docela dost upravit. Totéž se stane, pokud uživatel upřímný bude chtít použít tento skript k zálohování jiných adresářů. Chcete-li rozšířit rozsah, použijte proměnné pro všechny soubory, adresáře, uživatelská jména, názvy serverů atd. Pak stačí změnit hodnotu pouze jednou a nemusíte procházet celý skript, abyste našli všechna místa, kde se konkrétní parametr vyskytuje. Příklad:

#!/bin/bash # Tento skript vytvoří zálohu mého domovského adresáře. # Změňte hodnoty proměnných, aby skript fungoval za vás: BACKUPDIR=/home BACKUPFILES=franky TARFILE=/var/tmp/home_franky.tar BZIPFILE=/var/tmp/home_franky.tar.bz2 SERVER=bordeaux REMOTEDIR =/ opt/backup/franky LOGFILE=/home/franky/log/home_backup.log cd $BACKUPDIR # Tím se vytvoří archiv tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1 # Nejprve odstraňte starý soubor bzip2. Chyby přesměrování, protože to generuje nějaké, pokud archiv # neexistuje. Poté vytvořte nový komprimovaný soubor. rm $BZIPFILE 2> /dev/null bzip2 $TARFILE # Zkopírujte soubor na jiný hostitel - máme ssh klíče, aby to fungovalo bez zásahu. scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1 # Vytvořte časové razítko v souboru protokolu. datum >> $LOGFILE záloha echa byla úspěšná >> $LOGFILE

Při práci se serverem shromažďuje shell velké množství informací, které určují jeho chování a přístup ke zdrojům. Některé z těchto možností se nacházejí v nastavení shellu, jiné jsou určeny zadáním uživatele.

Jedním ze způsobů, jak může shell tyto informace sledovat, je prostřednictvím prostředí. Prostředí je oblast obsahující systémové definující proměnné, které shell vytváří při každém spuštění relace.

Tento kurz vysvětluje, jak interagovat s prostředím a číst nebo nastavovat proměnné prostředí a shellu interaktivně a pomocí konfigurační soubory. Všechny akce se provádějí na Ubuntu 12.04 VPS, ale na jakémkoli moderním Linux distribuce by měl fungovat stejným způsobem.

Jak funguje prostředí a jeho proměnné

Pokaždé, když je aktivována relace shellu, spustí se proces shromažďující a kompilující informace, které by měly být dostupné pro shell a jeho podřízené procesy. Shell získává tato data z mnoha různých souborů a nastavení v systému.

Prostředí obecně poskytuje přenosové zařízení, které shromažďuje a nastavuje nezbytná nastavení procesu shellu, který je následně předává svým podřízeným procesům.

Prostředí má podobu řetězce obsahujícího páry klíč-hodnota. Více hodnot je obvykle odděleno dvojtečkou (:). Každý pár obecně vypadá nějak takto:

KLÍČ=hodnota1:hodnota2:...

Pokud hodnota obsahuje mezery, musíte použít dvojité uvozovky:

KEY="hodnota s mezerami"

V tomto případě klíč znamená proměnné jedné ze dvou existující druhy: proměnné prostředí nebo prostředí.

Proměnné prostředí jsou proměnné, které byly definovány pro aktuální shell a jsou zděděny všemi podřízenými shelly nebo procesy. Proměnné prostředí se používají k předávání informací procesům spouštěným ze shellu.

Proměnné shellu jsou proměnné, které jsou obsaženy výhradně v shellu, ve kterém byly nastaveny nebo definovány. Často se používají ke sledování aktuálních dat (například aktuálního pracovního adresáře).

Obvykle se takové proměnné označují velkými písmeny. To pomáhá uživatelům rozlišovat mezi proměnnými prostředí v jiných kontextech.

Tisk proměnných prostředí a prostředí

Každá relace sleduje svůj vlastní shell a proměnné prostředí. Existuje několik způsobů, jak je dostat ven.

Chcete-li zobrazit seznam všech proměnných prostředí, použijte příkaz env nebo printenv. Ve výchozím nastavení vydávají přesně stejný výsledek:

printenv
SHELL=/bin/bash
TERM=xterm
USER=demouser
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd= 40;33;01:or=40;31;01:su=37;41:sg=30;43:ca:...
MAIL=/var/mail/demouser
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
PWD=/home/demouser
LANG=cs_US.UTF-8
SHLVL=1
HOME=/domov/demouser
LOGNAME=demouser
LESSOPEN=| /usr/bin/lesspipe %s
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/printenv

Toto je typický příklad výstupu příkazů printenv a env. Tyto příkazy se liší pouze v několika jednotlivých funkcích. Printenv se například může dotazovat na hodnoty jednotlivých proměnných:

printenv SHELL
/bin/bash

Příkaz env vám umožňuje změnit prostředí, ve kterém programy běží, předáním sady definic proměnných příkazu, něco takového:

env VAR1="blahblah" command_to_run command_options

Jak je uvedeno výše, podřízené procesy obvykle dědí proměnné prostředí nadřazeného procesu, což umožňuje měnit hodnoty nebo zavádět další proměnné pro podřízené procesy.

Jak můžete vidět na výstupu příkazu printenv, mnoho proměnných prostředí je vytvořeno pomocí systémové soubory a procesy bez zásahu uživatele.

Ale jak vidíte proměnné shellu?

Chcete-li to provést, použijte příkaz set. Když je zadána bez dalších parametrů, set uvádí všechny proměnné prostředí, proměnné prostředí, lokální proměnné a funkce prostředí:

soubor
BASH=/bin/bash
BASHOPTS=velikost kontroly:cmdhist:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
. . .

Tento seznam je zpravidla poměrně dlouhý. Chcete-li jej zobrazit v pohodlnějším formátu, otevřete jej pomocí programu pager:

Tento seznam obsahuje obrovské množství dodatečné informace, který je v tento moment není potřeba (například některé bash funkce).

Chcete-li "vyčistit" výstup, musíte spustit příkaz set v režimu POSIX, který obchází funkce shellu. To je třeba provést v subshell, aby se nezměnilo aktuální prostředí:

(set -o posix; set)

Tato akce zobrazí všechny proměnné prostředí a shellu.

Tento výstup můžete také porovnat s výstupem příkazů env/printenv a pokusit se vypsat pouze proměnné shellu, ale takový seznam nebude ideální, protože výstup těchto příkazů je odlišný:

komunikace -23<(set -o posix; set | sort) <(env | sort)

Seznam bude pravděpodobně obsahovat více proměnných prostředí, protože příkaz set vypisuje hodnoty v uvozovkách, ale příkazy printenv a env nikoli.

Je to však skvělý způsob, jak zobrazit proměnné prostředí a prostředí nastavené v dané relaci.

Takové proměnné se používají pro nejrůznější účely. Poskytují alternativní způsob, jak nastavit trvalé hodnoty pro relaci mezi procesy, což eliminuje potřebu provádět změny v souboru.

Základní proměnné prostředí a shellu

Některé zvláště užitečné proměnné prostředí a shellu se používají velmi často.

Níže je uveden seznam hlavních proměnných prostředí:

  • SHELL: Popisuje shell, který interpretuje zadané příkazy. Ve většině případů je bash standardně nainstalován, ale tuto hodnotu lze v případě potřeby změnit.
  • OBDOBÍ: Určuje typ terminálu emulovaného při spuštění shellu. V závislosti na provozních požadavcích lze emulovat různé hardwarové terminály. Obvykle si s tím nemusíte dělat starosti.
  • UŽIVATEL: současný uživatel.
  • P.W.D.: aktuální pracovní adresář.
  • OLDPWD: předchozí pracovní adresář. Shell jej uloží pro případ spuštění příkazu cd -.
  • LS_BARVY: Definuje kódy barev, které se používají k obarvení výstupu příkazu ls. Tento výstup pomáhá uživateli rychleji číst výsledek příkazu (například rychle rozlišovat mezi typy souborů).
  • POŠTA: Cesta k aktuální poštovní schránce uživatele.
  • CESTA: Seznam adresářů, ke kterým systém přistupuje při provádění příkazů. Když uživatel spustí příkaz, systém v těchto adresářích v určeném pořadí zkontroluje spustitelný soubor.
  • JAZYK: Aktuální nastavení jazyka a lokalizace, včetně kódování znaků.
  • DOMOV: Domovský adresář aktuálního uživatele.
  • _ : Poslední provedený příkaz.

Po prostudování seznamu proměnných prostředí prozkoumejte seznam proměnných prostředí:

  • BASHOPS: Seznam možností použitých při provádění bash. To lze použít ke kontrole, zda prostředí funguje podle očekávání.
  • BASH_VERZE: Běžící verze bash v podobě čitelné pro člověka.
  • BASH_VERSINFO: Strojově čitelná verze bash.
  • SLOUPCE: Určuje šířku výstupu ve sloupcích.
  • DIRSTACK: Zásobník adresářů přístupných příkazům pushd a popd.
  • HISTFILESIZE: Maximální počet řádků obsažených v souboru historie příkazů.
  • HISTSIZE: Počet příkazů, které mají být zapamatovány v seznamu historie.
  • HOSTNAME: Aktuální název hostitele.
  • IFS: Interní oddělovač vstupních polí na příkazovém řádku. Výchozí hodnota je mezera.
  • PS1: Definuje počáteční řádek příkazu – typ příkazového řádku při spuštění relace shellu. Proměnná PS2 nastavuje sekundární řádek výzvy, pokud příkaz zahrnuje více řádků.
  • SHELLOPTY: Možnosti prostředí, které lze nastavit pomocí set.
  • UID: Jedinečný identifikátor pro aktuálního uživatele.

Nastavení proměnných prostředí a prostředí

Níže je uvedeno několik příkladů, které demonstrují rozdíl mezi proměnnými prostředí a prostředí a vysvětlují syntaxi pro nastavení těchto proměnných.

Vytváření proměnných Shell

Nejprve musíte nastavit proměnné shellu pro aktuální relaci. To se provádí velmi jednoduše, vše, co musíte udělat, je zadat název a hodnotu. Jak již bylo zmíněno, pro psaní názvů takových proměnných se používají velká písmena.

TEST_VAR="Ahoj světe!"

Tento příklad používá uvozovky, protože hodnota obsahuje mezery. Navíc zde musíte používat jednoduché uvozovky, protože vykřičník je speciální znak v bash shellu, který přistupuje k historii příkazů, pokud není escapován nebo uzavřen v jednoduchých uvozovkách.

Výsledná proměnná prostředí je tedy platná v aktuální relaci, ale není předána svým podřízeným procesům.

Chcete-li to ověřit, použijte příkaz grep na výsledek příkazu set:

set | grep TEST_VAR
TEST_VAR="Ahoj světe!"

Můžete se také ujistit, že tato proměnná není proměnná prostředí spuštěním příkazu grep na výsledek příkazu printenv:

printenv | grep TEST_VAR

Tato akce nepřinese žádný výsledek.

To lze použít k odhalení hodnoty jakékoli proměnné prostředí nebo prostředí.

echo $TEST_VAR
Ahoj světe!

Jak vidíte, pro přístup k hodnotě proměnné musíte použít symbol $.

Opět platí, že výsledná proměnná by neměla být předána žádnému podřízenému procesu. Chcete-li to otestovat, ve svém aktuálním prostředí nasaďte nový shell bash:

bash
echo $TEST_VAR

Pokud rozbalíte podřízený shell a pokusíte se otevřít obsah proměnné, nic se nevytiskne. To znamená, že vše funguje správně.

Chcete-li se vrátit do původního prostředí, napište exit:

Vytváření proměnných prostředí

Nyní zkuste změnit proměnnou shellu na proměnnou prostředí. To se provádí exportem proměnné. Příkaz, který provádí export, je pojmenován odpovídajícím způsobem.

Tento příkaz změní proměnnou prostředí na proměnnou prostředí. Chcete-li zkontrolovat, zda bylo vše provedeno správně, můžete se znovu podívat na seznam proměnných prostředí:

printenv | grep TEST_VAR
TEST_VAR=Ahoj světe!

Nyní je tato proměnná zobrazena v tomto seznamu. Můžete také znovu rozšířit podřízený shell:

bash
echo $TEST_VAR
Ahoj světe!

Skvělý! Podřízený shell přijal proměnnou z původního shellu. Než opustíte podřízený shell, zkuste exportovat ještě jednu proměnnou.

export NEW_VAR="Testovací export"

Zkontrolujte, zda byla proměnná exportována:

printenv | grep NEW_VAR
NEW_VAR=Testovací export

Nyní se vraťte do původního shellu:

Zkontrolujte, zda lze tuto proměnnou otevřít:

Výsledek se nevrací

K tomu dochází, protože proměnné prostředí jsou předávány pouze podřízeným procesům. Neexistuje žádný vestavěný způsob, jak nastavit proměnné prostředí nadřazeného prostředí. Ve většině případů to zabrání tomu, aby programy zasahovaly do operačního prostředí, ze kterého byly spuštěny.

Proměnná NEW_VAR byla nastavena jako podřízená proměnná prostředí prostředí. Tato proměnná je platná pro tento shell a jeho podřízené shelly a procesy. Poté, co se uživatel vrátil do původního prostředí, bylo toto prostředí zničeno.

Přesouvání a nulování proměnných

Proměnná TEST_VAR je stále proměnnou prostředí. Chcete-li z ní znovu vytvořit proměnnou shellu, zadejte:

export -n TEST_VAR

Nyní tato proměnná již není proměnnou prostředí:

printenv | grep TEST_VAR

Toto je opět proměnná shellu:

set | grep TEST_VAR
TEST_VAR="Ahoj světe!"

Chcete-li úplně resetovat proměnnou, ať už se jedná o proměnnou prostředí nebo prostředí, použijte příkaz unset:

Ujistěte se, že taková proměnná již neexistuje:

Nebyl vytištěn žádný výsledek, protože proměnná byla resetována.

Automatické nastavení proměnných prostředí

Jak již bylo zmíněno, mnoho programů používá proměnné prostředí k určení, jak by měly fungovat. Nastavení potřebných proměnných při každém vytvoření nového shellu je docela nepohodlné. Mnoho proměnných se navíc nastavuje ihned po přihlášení. Jak nastavit proměnné automaticky?

To je trochu složitější, než se na první pohled zdá, protože bash shell čte hodně konfiguračních souborů.

Typy relací Shell

Shell bash čte různé konfigurační soubory v závislosti na tom, jak byla relace spuštěna. První dva typy relací, které definují shell, jsou start a potomek.

Startér nebo počáteční shell(přihlašovací shell) je shellová relace, která se otevře po autorizaci uživatele. Pokud se uživatel přihlásí do terminálu nebo se autentizuje pomocí SSH, otevře se spouštěcí shell.

Pokud je nová relace zahájena z autorizované (spouštěcí) relace (jako v předchozích příkladech byl spuštěn nový bash shell), bude tato relace dceřiná společnost (ne-přihlásit se skořápka). Chcete-li otevřít tuto relaci, nemusíte projít autorizačním postupem.

Relace shellu mohou být také interaktivní nebo neinteraktivní.

Interaktivní relace shell (interaktivní shell) je relace vázaná na terminál. Neinteraktivní shellová relace je relace, která není spojena s terminálem.

Takže shellové relace jsou klasifikovány podle následujících aspektů: start-dítě, interaktivní-neinteraktivní.

Normální relace otevřená pomocí SSH je obvykle interaktivní počáteční relace. Skript spuštěný přes příkazový řádek se obvykle spouští v neinteraktivní podřízené relaci. Terminálová relace je odlišná kombinace těchto dvou vlastností.

Klasifikací relace jako počáteční relace nebo podřízené relace systém rozumí, které soubory je třeba číst, aby bylo možné inicializovat relaci shellu.

Nejprve tedy spouštěcí relace získá konfigurace ze souboru /etc/profile. Poté hledá konfigurační soubor spouštěcího prostředí v domovském adresáři uživatele, aby získal uživatelsky definované konfigurace.

Tato relace čte soubory ~/.bash_profile, ~/.bash_login a ~/.profile a nečte jiné soubory.

Podřízená relace zase čte /etc/baash.bashrc a poté uživatelův soubor ~/.bash.rc pro nasazení prostředí.

Neinteraktivní shelly čtou proměnnou prostředí BASH_ENV a zadaný soubor za účelem vytvoření nového prostředí.

Jak nastavit proměnné prostředí

Jak vidíte, konfigurace jsou rozptýleny v různých souborech.

Díky tomu je systém velmi flexibilní, což je užitečné v určitých situacích, kdy potřebujete nastavit různé parametry pro startovací a podřízený shell. Tyto shelly však obecně používají stejné nastavení.

Naštěstí většina distribucí Linuxu odkazuje na konfigurační soubor podřízeného prostředí jako na zdroj konfigurací spouštěcího prostředí. To znamená, že můžete definovat proměnné prostředí pro obě relace v konfiguračních souborech podřízeného shellu.

Obvykle oba shelly používají uživatelem definované proměnné prostředí. To znamená, že tyto proměnné můžete nastavit v souboru ~/.bashrc.

Otevřete tento soubor:

S největší pravděpodobností již obsahuje nějaká data. Většina zde nastavených hodnot jsou možnosti bash a nemají nic společného s proměnnými prostředí. Proměnné v tomto souboru se nastavují přesně stejným způsobem jako na příkazovém řádku:

export VARNAME=hodnota

Po zadání všech potřebných proměnných soubor zavřete. Při příštím spuštění shellové relace se zde nastavené proměnné přečtou a předají prostředí shellu. Chcete-li sdělit aktuální relaci, aby přečetla daný soubor, zadejte:

zdroj ~/.bashrc

Chcete-li nastavit systémové proměnné, přidejte je do /etc/profile, /etc/bash.bashrc nebo /etc/environment.

Výsledek

Proměnné prostředí a prostředí jsou vždy přítomny ve všech relacích prostředí, takže vědět, jak s nimi pracovat, je obzvláště užitečné. Lze je použít k předání konfigurací nadřazených procesů podřízeným procesům a také ke konfiguraci nastavení mimo soubory.

To poskytuje v určitých situacích řadu výhod. Některé mechanismy nasazení například spoléhají na proměnné prostředí při konfiguraci informací o ověřování. To je výhodné, protože tak důležitá data nebudou uložena v žádném souboru, což znamená, že budou spolehlivě chráněna před cizími osobami.

Existuje mnoho dalších běžnějších situací, ve kterých možná budete muset číst proměnné nebo změnit systémové prostředí. Nástroje a techniky popsané v této příručce poskytují vynikající základ pro rozvoj vašich dovedností v práci s proměnnými a jejich správném používání.

Štítky: ,

Proměnné prostředí v Linuxu jsou speciální proměnné definované shellem a používané programy za běhu. Mohou být definovány systémem a uživatelem. Proměnné prostředí systému Linux jsou definovány systémem a používány programy na systémové úrovni.

Například příkaz PWD používá systémovou proměnnou k zachování předchozího pracovního adresáře. Proměnné uživatelského prostředí nastavuje uživatel pro aktuální prostředí buď dočasně, nebo trvale. Celý koncept přidávání a odebírání proměnných shellu se točí kolem více souborů, příkazů a různých shellů.

Obecněji může být proměnná prostředí tří typů:

1. Lokální proměnné prostředí

Tyto proměnné jsou definovány pouze pro aktuální relaci. Po skončení relace budou trvale vymazány, ať už jde o vzdálený přístup nebo emulátor terminálu. Nejsou uloženy v žádných souborech, ale jsou vytvářeny a mazány pomocí speciálních příkazů.

2. Vlastní proměnné Shell

Tyto proměnné shellu v Linuxu jsou definovány pro konkrétního uživatele a načtou se pokaždé, když se uživatel přihlásí pomocí místního terminálu nebo se připojí vzdáleně. Tyto proměnné jsou obvykle uloženy v konfiguračních souborech: .bashrc, .bash_profile, .bash_login, .profile nebo jiných souborech umístěných v uživatelském adresáři.

3. Systémové proměnné prostředí

Tyto proměnné jsou dostupné v celém systému pro všechny uživatele. Načítají se při startu systému ze systémových konfiguračních souborů: /etc/environment, /etc/profile, /etc/profile.d/ /etc/bash.bashrc.

Soubory konfigurace proměnných prostředí Linux

Zde se rychle podíváme na různé výše uvedené konfigurační soubory, které se používají ke konfiguraci proměnných prostředí pro celý systém nebo konkrétního uživatele.

.bashrc

Toto je soubor proměnných specifických pro uživatele. Načteno pokaždé, když uživatel vytvoří relaci terminálu, to znamená jinými slovy otevře nový terminál. Všechny proměnné prostředí vytvořené v tomto souboru se projeví při každém spuštění nové relace terminálu.

.bash_profile

Tyto proměnné se projeví pokaždé, když se uživatel připojí vzdáleně přes SSH. Pokud tento soubor chybí, systém vyhledá .bash_login nebo .profile.

/etc/environment

Tento soubor slouží k vytváření, úpravám a odstraňování jakýchkoli proměnných prostředí na systémové úrovni. Proměnné prostředí vytvořené v tomto souboru jsou dostupné pro celý systém, pro každého uživatele a dokonce i při vzdáleném připojení.

/etc/bash.bashrc

Systém bashrc. Tento soubor se spustí pro každého uživatele pokaždé, když vytvoří novou relaci terminálu. Toto funguje pouze pro lokální uživatele, při připojení přes internet nebudou takové proměnné viditelné.

/etc/profile

Profil systémového souboru. Všechny proměnné z tohoto souboru jsou dostupné každému uživateli v systému pouze v případě, že je vzdáleně přihlášen. Nebudou však dostupné při vytváření místní relace terminálu, tedy pokud terminál jednoduše otevřete.

Všechny proměnné prostředí Linux vytvořené pomocí těchto souborů lze jednoduše odstranit jejich odstraněním. Pouze po každé změně se musíte buď odhlásit a znovu přihlásit, nebo spustit tento příkaz:

zdrojový název souboru

Přidání proměnných uživatelského a systémového prostředí v Linuxu

Nyní, když znáte trochu teorie, přejděme k praxi. Lokální proměnné prostředí v Linuxu lze vytvořit pomocí následujících příkazů:

var=hodnota
$ export var=hodnota

Tyto proměnné budou dostupné pouze pro aktuální relaci terminálu.

Existuje několik příkazů, které můžete použít k odstranění proměnných prostředí:

1. Pomocí env

Ve výchozím nastavení můžete použít env k zobrazení všech nastavených proměnných prostředí. Ale s volbou -i vám umožňuje dočasně odstranit všechny proměnné shellu a spustit příkaz bez proměnných.

příkaz env –i

Var je jakákoli proměnná, kterou chcete předat tomuto příkazu.

Tento příkaz spustí shell bez jakýchkoli proměnných prostředí:

Po spuštění takového prostředí nebudou dostupné žádné proměnné, ale po ukončení se vše vrátí na své místo.

2. Pomocí unset

Toto je další způsob, jak odstranit proměnné prostředí Linuxu. Unset odebere proměnnou podle názvu až do konce aktuální relace:

unset variable_name

3. Nastavte hodnotu proměnné na ""

Toto je nejjednodušší způsob odstranění proměnných prostředí v Linuxu; nastavením proměnné na prázdnou ji odstraníte po zbytek aktuální relace.

Poznámka: Pomocí těchto metod můžete změnit hodnoty systémových nebo uživatelských proměnných, ale budou relevantní pouze pro aktuální relaci.

Vytváření proměnných uživatelského a systémového prostředí

V této části se podíváme na to, jak nastavit a odstranit systémové a uživatelské proměnné nejen pro aktuální relaci, ale tak, aby efekt přetrvával i po restartu.

1. Nastavte a odstraňte lokální proměnné v Linuxu

Vytvořme lokální proměnnou VAR a nastavme ji na libovolnou hodnotu, poté ji zrušme a ujistěte se, že je odstraněna:

VAR1="Ztráta"
$ echo $VAR1
$nenastaveno VAR1
$ echo $VAR1

Dalším způsobem, jak vytvořit proměnnou, je příkaz export. Odstraníme to přiřazením prázdné hodnoty:

export VAR="Ztráta"
$ echo $VAR
$VAR=
$ echo $VAR

Nyní vytvoříme proměnnou VAR2 a dáme jí hodnotu. A poté dočasně odstraňte všechny lokální proměnné spuštěním env -i. Spustí shell bez jakýchkoli proměnných. Po zadání exit budou všechny proměnné obnoveny.

VAR2="Ztráta"
$ echo $ VAR2
$ env -i bash
$ echo $ VAR2

Nastavení a odebrání uživatelských proměnných

Upravte soubor .bashrc ve svém domovském adresáři přidáním příkazu export pro export požadované proměnné. Poté spusťte příkaz source a použijte změny. Vytvořme například proměnnou CD:

Přidejte tento řádek (o, poté vložte, poté Esc a :wq):

export CD="Toto je ztracený domov"

Nyní zbývá aktualizovat konfiguraci:

zdroj.bashrc
$echo $CD

Chcete-li tuto proměnnou odstranit, jednoduše ji odstraňte z .bashrc.

Nyní přidáme proměnnou prostředí pomocí .bash_profile. Tato proměnná, jak již víte, bude dostupná pouze během vzdáleného přihlášení:

vi .bash_profile

Přidejte řádek:

export VAR2="Toto je ztracený domov"

A spusťte tyto příkazy, abyste použili změny a zkontrolovali, zda byla proměnná přidána:

source.bash_profile
$ echo $ VAR2

Proměnná není k dispozici, protože jste vytvořili místní terminálovou relaci, nyní se připojte přes ssh:

ssh user@localhost
$ echo $ VAR2

Tuto proměnnou prostředí můžete odstranit stejným způsobem jako v předchozím případě jejím odstraněním ze souboru.

Komentář: Tyto proměnné jsou vždy dostupné, ale ne pro všechny uživatele.

Nastavení a odebrání proměnných prostředí systému

Pojďme vytvořit proměnnou dostupnou všem uživatelům ve všech terminálových relacích kromě vzdálených tím, že ji přidáme do /etc/bash.profile:

vi /etc/bash.profile

export VAR="Toto je proměnná celého systému"

Poté aktualizujeme:

zdroj /etc/bash.bashrc

Nyní je tato proměnná dostupná všem uživatelům ve všech terminálech:

echo $VAR
$sudo su
$ echo $VAR
$su -
$ echo $VAR

Pokud chcete zpřístupnit proměnnou prostředí všem uživatelům, kteří se k tomuto počítači připojují vzdáleně, upravte soubor /etc/profile:

export VAR1="Toto je celosystémová proměnná pouze pro vzdálené relace"

Aktualizujte konfiguraci a zkontrolujte dostupnost proměnné, bude dostupná pouze vzdáleně:

zdroj /etc/profile
$ echo $VAR1

Pokud potřebujete přidat proměnnou prostředí v Linuxu, aby byla přístupná vzdáleně i pro místní relace, exportujte ji do /etc/environment:

vi /etc/environment

export VAR12="Jsem k dispozici všude"

Kontrolujeme:

zdroj /etc/environment
$ echo $ VAR12
$sudo su
$ echo $ VAR12
$ výstup
$ssh localhost
$ echo $ VAR12

2.2. Proměnné prostředí

Operační systém podporuje speciální typ zdroje tzv Proměnné prostředí (proměnné prostředí). Tyto proměnné jsou pár NAME – VALUE . Název může začínat písmenem a skládat se z písmen, číslic a podtržítek.

Chcete-li nahradit hodnotu proměnné na příkazovém řádku, uveďte před název proměnné znak $:

$ echo $USER host

Pokud proměnná není nastavena, vrátí se prázdný řetězec.

Chcete-li nastavit hodnotu proměnné, použijte operátor přiřazení (v případě shellů typu Bourne):

$TEST=test

nebo vestavěný operátor sady (v případě C-like):

$ set TEST=test

Příkaz set bez argumentů vypíše hodnoty všech proměnných nastavených v prostředí:

$ set COLUMNS=197 CVS_RSH=ssh DIRSTACK=() EUID=1000 GROUPS=() G_BROKEN_FILENAMES=1 HISTFILE=/home/hosta/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home8HOST/host6NAME =$" \t\n" INPUTRC=/etc/inputrc KDEDIR=/usr KDEDIRS=/home/guest/.local/ KDE_IS_PRELINKED=1 KDE_NO_IPV6=1 LANG=ru_RU.UTF-8 LESSOPEN="|/usr/bin/ lesspipe.sh %s" LINES=65 LOGNAME=host ....

Proměnné mohou být lokální pro daný proces nebo globální pro relaci. Místní hodnoty proměnných můžete nastavit tak, že je předřadíte voláním příkazů:

$ TEST=test1 sh -c "echo $TEST" test1

Obsah sady proměnných pro relaci můžete vyhodnotit voláním vestavěného příkazu tlumočníka env v případě interpretů podobných Bourneovi (sh, ksh, bash, zsh, pdksh...) a printenv v případě překladačů klonů C-Shell (csh, tcsh...):

$ env HOSTNAME=myhost TERM=xterm SHELL=/bin/bash HISTSIZE=1000 KDE_NO_IPV6=1 SSH_CLIENT=172.16.0.9 50487 22 QTDIR=/usr/lib/qt-3.3 QTINC=/usr/lib/qt =/dev/pts/6 USER=host MOZILLA_CERTIFICATE_FOLDER=/home/guest/.evolution/ KDEDIR=/usr MAIL=/var/spool/mail/guest PATH=/usr/games:/usr/local/bin:/bin :/usr/bin:/home/guest/bin INPUTRC=/etc/inputrc PWD=/home/guest KDE_IS_PRELINKED=1 LANG=ru_RU.UTF-8 KDEDIRS=/home/guest/.local/ SSH_ASKPASS=/usr/libexec /openssh/gnome-ssh-askpass SHLVL=1 HOME=/home/guest LOGNAME=guest QTLIB=/usr/lib/qt-3.3/lib CVS_RSH=ssh SSH_CONNECTION=172.16.0.9 50487 172.16.2.9 /bin/lesspipe.sh %s G_BROKEN_FILENAMES=1 _=/bin/env

Příkazové sady Shell lze zkompilovat do příkazových souborů nazývaných skripty, kde první řádek ve speciálním typu komentáře určuje interpret příkazů pro provádění této sady. Vytvořme například soubor v textovém editoru s názvem test s následujícím obsahem:

#!/bin/sh echo TEST proměnná: echo $TEST

Tento program vypíše na standardní výstup textovou zprávu "TEST proměnná: " a hodnotu proměnné TEST, pokud je zadána. Můžete jej spustit z příkazového řádku tak, že jej předáte jako parametr interpretu příkazů:

$sh test TEST proměnná:

Proměnnou můžete učinit globální pomocí příkazu export (Bourne) nebo setenv (C-SHell):

$ export TEST=test1 $ sh test TEST proměnná: test1

Místní hodnoty proměnných pro provádění daného programu můžete nastavit tak, že jim předcházíte voláním příkazů:

$ TEST=test2 sh test TEST proměnná: test2

Odstranění proměnných prostředí se provádí pomocí příkazu unset.

Koncept parametru v shellu bash podobný konceptu proměnné v konvenčních programovacích jazycích. Název parametru (nebo identifikátor) může být slovo skládající se z abecedních znaků, čísel a podtržítek (pouze první znak slova nemůže být číslo), číslo nebo jeden z následujících speciálních znaků: * , @ , # , ? , - (pomlčka), $ , ! , 0 , _ (podtržení).

O parametru se říká, že je nastaven nebo nastaven, pokud je k němu přiřazena hodnota. Hodnota může být také prázdný řetězec. Chcete-li zobrazit hodnotu parametru, použijte symbol $ před jeho jménem. Ano, tým

$ echo jméno

zobrazí slovo na obrazovce název a tým

$echo $name

vrátí hodnotu proměnné name (pokud je samozřejmě nastavena).

5.6.1 Různé parametry

Parametry jsou rozděleny do tří tříd: polohové parametry, speciální parametry(jejichž názvy jsou právě uvedené speciální znaky) a shellové proměnné.

jména (identifikátory) polohové parametry sestávají z jedné nebo více číslic (nikoli jediné nuly). Hodnoty pozičních parametrů jsou argumenty, které byly zadány při spuštění shellu (první argument je hodnota pozičního parametru 1 atd.). Hodnotu pozičního parametru můžete změnit pomocí vestavěného příkazu soubor. Hodnoty těchto parametrů se také mění, když shell provádí jednu z funkcí (toto bude diskutováno níže, v sekce 5.8).

Speciální parametry jsou vzory, jejichž nahrazení (substituce) se provádí následovně.

Tabulka 5.2. Speciální parametry.

Parametr

Pravidla střídání

Nahrazeno polohovými parametry, počínaje prvním. Pokud je nahrazení v dvojitých uvozovkách, pak je tento parametr nahrazen jedním slovem složeným ze všech pozičních parametrů, oddělených prvním znakem speciální proměnné IFS (diskutované níže). To znamená, že ,,$*"" je ekvivalentní ,,$1c$2c...", kde c je první znak v hodnotě proměnné IFS. Pokud je IFS nastaveno na prázdné nebo nemá nastavenou žádnou hodnotu, jsou parametry odděleny mezerami

Nahrazeno polohovými parametry, počínaje prvním. Pokud je nahrazení v dvojitých uvozovkách, pak je každý parametr nahrazen samostatným slovem. Tedy `` $@"" je ekvivalentní ""$1"" ""$2"" ... Pokud neexistují žádné poziční parametry, pak není přiřazena žádná hodnota (parametr @ je jednoduše odstraněn)

Nahrazeno desetinnou hodnotou počtu polohových parametrů

Nahrazeno stavem ukončení posledního spuštěného programového kanálu v popředí

(pomlčka)

Nahrazeno aktuální sadou hodnot příznaků nastavených pomocí vestavěného příkazu soubor nebo při spouštění samotného shellu

Nahrazeno identifikátorem procesu (P ID) shellu

Nahrazeno identifikátorem procesu (P ID) naposledy provedeného příkazu na pozadí (asynchronně provedeného)

Nahrazeno názvem shellu nebo skriptu, který se má spustit. Li bash spustí, aby provedl dávkový soubor, $0 je název souboru. Jinak je tato hodnota rovna celé cestě k shellu

(zdůraznit)

Nahrazeno posledním argumentem předchozího provedeného příkazu (pokud se jedná o parametr nebo proměnnou, je nahrazena její hodnotou)

Speciální parametry uvedené v tabulce výše se liší tím, že na ně lze pouze odkazovat; Nelze jim přiřadit hodnoty.

Variabilní z pohledu shellu je to parametr označovaný jménem. Hodnoty se přiřazují proměnným pomocí následujícího operátoru:

$jméno=hodnota

Kde název je název proměnné a hodnota— hodnota, která je mu přiřazena (může být prázdný řetězec). Název proměnné se může skládat pouze z číslic a písmen a nemůže začínat číslem. Hodnota může být libovolný text. Pokud hodnota obsahuje speciální znaky, musí být uzavřena v uvozovkách. Přiřazená hodnota tyto uvozovky samozřejmě neobsahuje. Pokud je proměnná nastavena, lze ji odstranit pomocí příkazu shell vestavěného odstaveno.

Množina všech nastavených proměnných prostředí s přiřazenými hodnotami se nazývá prostředí nebo prostředí prostředí. Můžete jej zobrazit pomocí příkazu soubor bez parametrů (jen byste možná měli zorganizovat potrubí "nastavit | méně"). Výstup tohoto příkazu uvádí všechny proměnné prostředí v abecedním pořadí. Chcete-li zobrazit hodnotu jedné konkrétní proměnné, můžete místo příkazu soubor(v jehož výstupu můžete stále hledat a hledat požadovanou proměnnou) můžete použít příkaz

$echo $name

(v tomto případě však musíte znát název proměnné, která vás zajímá).

Mezi proměnnými, které uvidíte ve výstupu příkazu, jsou soubor, existuje několik velmi zajímavých proměnných. Věnujte pozornost například proměnné RANDOM. Pokud příkaz spustíte několikrát za sebou

$ echo $RANDOM

pokaždé získáte novou hodnotu. Faktem je, že tato proměnná vrací náhodné celé číslo z intervalu 0 - 32 768.

5.6.2 Výzvy prostředí

Jedna z velmi důležitých proměnných má jméno PS1. Tato proměnná určuje typ pozvánky bash Výstup, když čeká na další příkaz zadaný uživatelem. Ve výchozím nastavení je tato proměnná nastavena na "\s-\v\$ ". Vlastně v bash Existují čtyři pozvánky, které se používají v různých situacích. Variabilní PS1 určuje typ výzvy, která se zobrazí, když shell čeká na zadání příkazu. Sekundární výzva určená proměnnou PS2, se objeví, když shell čeká, až uživatel zadá nějaké další údaje potřebné pro pokračování spuštěného příkazu nebo programu. Výchozí proměnná PS2 má význam" >" . Možná jste již viděli tuto výzvu, když jste spustili příkaz kočka pro zadání dat z klávesnice do souboru. Dalším příkladem je příkaz ftp, po jehož spuštění má pozvánka také tuto podobu.

Proměnná výzva PS3, používaný v příkazu vybrat. Proměnná výzva PS4, se vytiskne před každým příkazem v daný čas bash sleduje průběh realizace. Výchozí hodnota je " + ".

Pokud si to přejete, můžete změnit typ proměnných PS1 A PS2. V tomto případě můžete použít libovolné symboly zadané z klávesnice a také určitý počet speciálních znaků, které se při generování řetězce výzvy dekódují podle tabulky. 5.3 (uvádíme například pouze některé z nich; úplný seznam naleznete v manuálové stránce nástroje bash) .

Tabulka 5.3. Speciální znaky pro generování pozvánky

Symbol

Jeho význam

Pípnutí (ASCII kód ​​07)

Datum ve formátu „Den, měsíc, den“, například St, Oct, 17.

Název hostitele až po první tečku

Celé jméno hostitele

Aktuální čas ve 24hodinovém formátu: HH:MM:SS (hodiny:minuty:sekundy)

Aktuální čas ve 12hodinovém formátu: HH:MM:SS

Aktuální čas ve 12hodinovém formátu am/pm

Jméno uživatele, který spustil shell

Úplný název aktuálního pracovního adresáře (počínaje kořenem)

Aktuální pracovní adresář (není zadána cesta)

Symbol #, pokud shell běží jako superuživatel, a symbol $ , pokud shell spouští normální uživatel.

\nnn

Znak s osmičkovým kódem nnn

Nový řádek (odřádkování)

Název mušle

Aktuální číslo týmu

Zpětné lomítko

Začátek sekvence netisknutelných znaků (tento znak lze použít k zahrnutí sekvence řídicích znaků terminálu do textu nápovědy)

Konec sekvence netisknutelných znaků

Pořadové číslo tohoto příkazu v historii příkazů

Číslo aktuálního příkazu (sériové číslo příkazu prováděného v rámci aktuální relace) se může lišit od čísla tohoto příkazu v seznamu historie příkazů, protože ten zahrnuje příkazy, které byly uloženy v souboru historie příkazů.

Jakmile shell přečte hodnotu proměnné definující nápovědu, lze v ní provádět substituce podle pravidel pro rozšiřování parametrů, substituce v názvech příkazů a aritmetických výrazech a dělení slov. Tato pravidla budou diskutována níže v části. 5.7.

Například po provedení příkazu (protože v řetězci je mezera, jsou vyžadovány uvozovky)

# PS1="[\u@\h \W]\$"

standardní výzva zobrazí hranatou závorku, uživatelské jméno a symbol @ , název počítače, mezera, název aktuálního adresáře (bez cesty), hranatá závorka a symbol $ (pokud v shellu běží jednoduchý uživatel) popř # (pokud shell běží jako root).

5.6.3 Proměnná CESTA

Další velmi důležitá proměnná má jméno CESTA. Specifikuje seznam cest k adresářům, ve kterých bash vyhledává soubory (zejména soubory s příkazy) v případech, kdy není na příkazovém řádku uvedena úplná cesta k souboru. Jednotlivé adresáře v tomto seznamu jsou odděleny dvojtečkami. Výchozí proměnná CESTA zahrnuje adresáře /usr/local/bin, /bin, /usr/bin, /usr/X11R6/bin, t.j. vypadá to takto:

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:

Chcete-li přidat adresář do tohoto seznamu, musíte spustit následující příkaz:

# PATH=$PATH:nová_cesta.

Při provádění vyhledávání prohledává shell adresáře v pořadí, v jakém jsou uvedeny v proměnné PATH.

Všimněte si, že do tohoto seznamu můžete zahrnout aktuální adresář přidáním tečky do proměnné PATH. To se však nedoporučuje z bezpečnostních důvodů: útočník by mohl umístit příkaz do veřejného adresáře, jehož jméno odpovídá jednomu z příkazů, které často provádí superuživatel, ale provádí zcela jiné akce (zejména pokud je aktuální adresář na začátku seznam vyhledávacích cest).

5.6.4 Proměnná IFS

Tato proměnná určuje interní oddělovač polí, který se používá při operaci rozdělení slov převodů příkazového řádku prováděných shellem před spuštěním příkazového řádku. Výchozí hodnota této proměnné je "<Пробел><Символ_ новой_ строки>".

5.6.5 Aktuální a domovské adresáře

Název aktuálního adresáře je uložen v proměnné prostředí (pojmenované PWD) a hodnota této proměnné se mění při každém spuštění programu. CD(a také při změně aktuálního adresáře jakýmkoli jiným způsobem, například prostřednictvím Midnight Commander).

Podobně je v proměnné HOME uloženo celé jméno (a cesta) domovského adresáře uživatele, který proces spustil.

5.6.6 Tým vývozní

Když shell spustí program nebo příkaz, předá jim některé proměnné prostředí. Aby mohla být proměnná prostředí předána procesu spuštěnému z shellu, musí být nastavena pomocí speciálního příkazu vývozní, tedy místo toho

$jméno=hodnota

je potřeba si to zapsat

$export name=value

V tomto případě budou mít všechny programy spouštěné z shellu (včetně sekundárních instancí samotného shellu) přístup k takto definovaným proměnným, tj. mohou volat své hodnoty jménem.

V. Kostromin (kos at rus-linux dot net) - 5.6. Parametry a proměnné. Shell prostředí