Linux: Kniha kouzel, vanilková příchuť 1.17 (27. února 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

13. Proměnné prostředí a interpretu

Řada 1.x vanilkové příchuti Linuxu: Knihy kouzel je od 1. října 2020 do 1. března 2023 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje novější vývojové řadě určené pro novější verze operačního systému a programů. Pokud nejste vázáni na starší verze programů, doporučuji vyhledat novou verzi z aktivně vyvíjené vývojové řady.
bash systém tematický okruh

1. Úvod

Tato kapitola pokrývá veškerou práci s proměnnými a funkcemi interpretu Bash a uvádí některé systémově důležité proměnné prostředí. Rovněž pokrývá práci s parametry skriptů a funkcí v Bashi.

Proměnné se v bashi (zejména ve skriptech a funkcích) používají k dočasnému uchování krátkých textových dat (popř. čísel) mezi příkazy. Většina proměnných je viditelná pouze v rámci dané instance interpretu; pro práci s prostředím se používají „exportované“ proměnné, které instance bashe vytvoří z proměnných prostředí v momentě svého spuštění a ze kterých sestaví prostředí každého procesu, který spustí.

Tato verze kapitoly nepokrývá zvláštní proměnné interpretu bash, které řídí jeho funkci, ale nebývají proměnnými prostředí; nedostatečně pokrývá lokální proměnné ve funkcích; nepokrývá možnosti přednastavení proměnných v souborech jako /etc/environment, „.profile“ či „.bashrc“. Do této kapitoly nespadají takzvané zvláštní parametry (jako např. $?, $! apod.).

2. Definice

Názvy proměnných a funkcí jsou obvykle tvořeny jen velkými a malými písmeny anglické abecedy, podtržítky a číslicemi, přičemž nesmí začínat číslicí.

3. Zaklínadla: Proměnné v bashi

3/1 Řetězcové proměnné

přiřadit proměnné hodnotu#1
název_proměnné="nová-hodnota"
˕zrušit proměnnou#2 (1)
unset -v název_proměnné
vypsat seznam (s hodnotami/bez hodnot/s hodnotami ve formátu txtz)#3
for _ in $(compgen -v); do [[ ${!_@a} = *[aA]* ]] || declare -p "$_"; done
for _ in $(compgen -v); do [[ ${!_@a} = *[aA]* ]] || printf '%s\n' "$_"; done
for _ in $(compgen -v); do [[ ${!_@a} = *[aA]* ]] || printf '%s=%s\0' "$_" "${!_}"; done
připojit text na začátek/konec proměnné#4
název_proměnné="nová-hodnota$název_proměnné"
název_proměnné+="nová-hodnota"
jde o řetězcovou proměnnou? (alternativy)#5
[[ -v název_proměnné && ${název_proměnné@a} = *([!aA]) ]]
[[ -v název_proměnné && ${název_proměnné@a} =~ ^[^aA]*$ ]]
automatická konverze velikosti písmen při přiřazení (na velká písmena/na malá písmena/vypnout)#6 (2)
declare -u název_proměnné
declare -l název_proměnné
declare +lu název_proměnné

3/2 Exportování proměnných

exportovat/neexportovat proměnnou#1
export název_proměnné[=nová-hodnota]
export -n název_proměnné
jde o exportovanou/neexportovanou proměnnou?#2
[[ ${název_proměnné@a} = *x* ]]
[[ -v název_proměnné && ! ${název_proměnné@a} = *x* ]]
seznam exportovaných proměnných (s hodnotami/bez hodnot)#3
(set -o posix; declare -x)
compgen -e
seznam neexportovaných proměnných (s hodnotami/bez hodnot)#4
(set -o posix; declare +x)
for _ in $(compgen -v); do [[ ${!_@a} = *x* ]] || printf '%s\n' "$_"; done

3/3 Obecné

jde o proměnnou?#1
test -v název_proměnné
seznam všech proměnných (s hodnotami/bez hodnot)#2
(set -o posix; set)
compgen -v
dosadit názvy všech proměnných, které začínají určitou předponou#3 (3)
${!předpona@}⊨ PATH PIPESTATUS PPID PROMPT_COMMAND PS1 PS2 PS4 PWD

3/4 Pole (jako celek)

vytvořit či přepsat/zrušit/vyprázdnit#1 (4)
název_pole=([prvky])
unset -v název_pole
název_pole=()
seznam polí (bez hodnot)#2
compgen -A arrayvar
dosadit počet prvků#3
${#názevpole[@]}
jde o pole?#4
[[ ${název_proměnné@a} = *a* ]]
zkopírovat (celé pole/výřez)#5
cílové_pole=("${zdrojové_pole[@]}")
cílové_pole=("${zdrojové_pole[@]:první-kopírovaný-index[:maximální-počet]}")
spojit dvě pole#6
cílové_pole=("${první_pole[@]}" "${druhé_pole[@]}")
rozdělit pole na poloviny#7
první_cíl=("${názevpole[@]:0:$((${#název_pole[@]}/2+1))}")
druhý_cíl=("${názevpole[@]:$((${#název_pole[@]}/2+1))}")
obrátit pořadí prvků pole#8 (5)
i=-1 j=${#název_pole[@]}
while test $((++i)) -lt $((--j))
do
x=${název_pole[i]}
název_pole[i]=${název_pole[j]}
název_pole[j]=$x
done
[unset -v i j x]
přiřadit do pole parametry skriptu či funkce#9
cílové_pole=("$@")

3/5 Pole (práce s prvky)

přečíst prvek na indexu N/přiřadit do něj#1 (6)
${název_pole[N][-náhradní hodnota]}
název_pole[N]=hodnota
iterovat přes prvky/přes indexy#2
for iterační_proměnná in "${název_pole[@]}"; do ...; done
for iterační_proměnná in "${!název_pole[@]}"; do ...; done
dosadit výřez pole#3 (7)
"${zdrojové_pole[@]:první-kopírovaný-index[:maximální-počet]}"
vložit nový prvek na začátek/konec#4 (8)
název_pole=("nový prvek" "${název_pole[@]}")
název_pole+=("nový prvek")
odstranit N prvků na začátku/konci#5
název_pole=("${názevpole[@]:N}")
název_pole=("${názevpole[@]:0:$((${#název_pole[@]}-N))}")

3/6 Asociativní pole (jako celek)

vytvořit = vyprázdnit#1
unset -v název && declare -A název
zrušit#2
unset -v název
jde o asociativní pole?#3
[[ ${název_proměnné@a} = *A* ]]
ʔseznam asociativních polí (bez hodnot)#4
for _ in $(compgen -v); do [[ ! ${!_@a} = *A* ]] || printf '%s\n' "$_"; done
dosadit počet prvků#5
${#název[@]}
zkopírovat#6
unset -v cílovépole
declare -A cílovépole
for _ in "${!zdrojovépole[@]}"; do cílovépole[$_]=${zdrojovépole[$_]}; done
sloučit dvě asociativní pole#7
for _ in "${!zdrojovépole[@]}"; do cílovépole[$_]=${zdrojovépole[$_]}; done

3/7 Asociativní pole (práce s klíči a prvky)

Pozor! Klíčem v asociativním poli může být pouze neprázdný řetězec! Prázdný klíč způsobí chybu „chybný podskript pole“.

přečíst hodnotu prvku (klíč je řetězec/hodnota proměnné)#1 (9)
["...]${názevpole["klíč"]}[..."]
["...]${názevpole["$klíč_proměnná"]}[..."]
přiřadit hodnotu prvku (klíč je: řetězec/hodnota proměnné)#2 (10)
názevpole["klíč"]="hodnota"
názevpole[$klíč_proměnná]="hodnota"
obsahuje prvek se zadaným klíčem? (klíč je hodnota proměnné)#3
test -v "názevpole[${proměnná_s_klíčem@Q}]"
obsahuje prvek se zadaným klíčem? (klíč je řetězec)#4
: 'klíč' [&&]
test -v "názevpole[${_@Q}]"
dosadit klíče/hodnoty#5
"${!název_pole[@]}"
"${název_pole[@]}"
iterovat přes klíče/přes hodnoty#6
for iterační_proměnná in "${!název_pole[@]}"; do ...; done
for iterační_proměnná in "${název_pole[@]}"; do ...; done
odstranit prvek podle klíče (klíč je hodnota proměnné)#7
unset -v "názevpole[${proměnná_s_klíčem@Q}]"
odstranit prvek podle klíče (klíč je řetězec)#8
: "klíč" [&&]
unset -v "názevpole[${_@Q}]"
příklady: přiřadit do proměnné „x“ hodnotu z asociativního pole „a“, kde klíčem je: zpětné lomítko/dvě zpětná lomítka/apostrof/dvojitá uvozovka/„A B“/„} }“#9
x="${a["\\"]}"
x="${a["\\\\"]}"
x="${a["'"]}"
x="${a["\""]}"
x="${a["A B"]}"
x="${a["} }"]}"

3/8 Funkce

vytvořit/přepsat funkci#1 (11)
[function] název_funkce() {
[tělo-funkce]
}
zavolat funkci#2
název_funkce [parametry]
seznam funkcí (s těly/bez těl)#3
declare -f
compgen -A function
existuje funkce?#4
declare -f název_funkce >/dev/null
zrušit funkci#5
unset -f název_funkce
vypsat definici funkce#6
declare -f název_funkce
exportovat/neexportovat funkci#7 (12)
export -f název_funkce
export -fn název_funkce

3/9 Celočíselné proměnné

jde o celočíselnou proměnnou?#1 (13)
[[ ${název_proměnné@a} = *i* ]]
nastavit řetězcovou proměnnou jako celočíselnou (obecně/příklady...)#2 (14)
declare -i název_proměnné=$název_proměnné [další_proměnná=$další_proměnná]
declare -i x=$x
declare -i x=-1
nastavit pole či asociativní pole, že jeho prvky budou celočíselné#3 (15)
declare -i název_pole_či_asoc_pole
přičíst/odečíst od celočíselné proměnné#4
: $((název_proměnné += číslo))
: $((název_proměnné -= číslo))

3/10 Jmenné odkazy

vytvořit jmenný odkaz#1 (16)
declare -n název_odkazu=název_odkazované_proměnné
zrušit jmenný odkaz#2
unset -n název_odkazu
je proměnná jmenný odkaz?#3
test -R název_proměnné
přečíst jmenný odkaz místo odkazované proměnné (alternativy)#4
if test -R název_odkazu; then declare +n název_odkazu; echo $název_odkazu; declare -n název_odkazu; else false; fi
test -R název_odkazu && eval "$(declare -p název_odkazu | sed -E '1s/^[^=]*=/echo /')"

3/11 Konstanty

seznam konstant (pro člověka/bez hodnot)#1
readonly
for _ in $(compgen -v); do [[ ! ${!_@a} = *r* ]] || printf '%s\n' "$_"; done
jde o konstantu?#2
[[ ${název_proměnné@a} = *r* ]]
vytvořit konstantu#3 (17)
readonly název_konstanty="hodnota" [další_název_konstanty="hodnota"]

4. Zaklínadla: Dosazování proměnných

4/1 Jednoduché a nepřímé dosazení

dosadit hodnotu řetězcové proměnné (alternativy)#1
$název_proměnné⊨ Hello, world!
${název_proměnné}
dosadit hodnotu řetězcové proměnné s odzvláštněním#2 (18)
${název_proměnné@Q}⊨ 'Hello, world!'
nepřímé dosazení#3 (19)
${!proměnná[zbytek výrazu]}
dosadit prvky pole (všechny prvky/jeden prvek/výřez/poslední prvek)#4
"${název_pole[@]}"
"${název_pole[index]}"
"${název_pole[@]:první-kopírovaný-index[:maximální-počet]}"
"${název_pole[-1]}"
dosadit hodnotu z asociativního pole (klíč je řetězec/hodnota proměnné)#5 (20)
${název_asoc_pole["klíč"]}
${název_asoc_pole["$klíč_proměnná"]}
dosadit všechny klíče/všechny hodnoty z asociativního pole#6
"${!název_asoc_pole[@]}"
"${název_asoc_pole[@]}"

4/2 Vlastnosti proměnné

dosadit délku hodnoty proměnné ve znacích#1
${#název_proměnné}⊨ 0
dosadit znaky reprezentující zapnuté atributy dané proměnné#2 (21)
${název_proměnné@a}⊨ x
dosadit příkaz bashe, který vytvoří danou proměnnou včetně atributů a hodnoty#3
${název_proměnné@A}⊨ declare -x HOME='/home/kalandira'

4/3 Podmíněné dosazení

je-li proměnná definovaná/neprázdná, dosadit; jinak použít náhradní řetězec#1 (22)
${název_proměnné-["]náhradní řetězec["]}
${název_proměnné:-["]náhradní řetězec["]}
dosadit hodnotu proměnné, která musí být definovaná/neprázdná; jinak zobrazit chybové hlášení a ukončit skript#2
${název_proměnné?["]chybové hlášení]["]}
${název_proměnné:?["]chybové hlášení]["]}
je-li proměnná definovaná/neprázdná, dosadit; jinak jí přiřadit náhradní hodnotu a dosadit#3
${název_proměnné=["]náhradní řetězec["]}
${název_proměnné:=["]náhradní řetězec["]}
dosadit řetězec, jen pokud je proměnná definovaná/neprázdná#4 (23)
${název_proměnné+["]řetězec["]}
${název_proměnné:+["]řetězec["]}

4/4 Dosazení podřetězce či se substitucí

dosadit podřetězec hodnoty proměnné#1 (24)
${název_proměnné: index-prvního-znaku-od-0 : maximální-délka }
dosadit hodnotu proměnné po odebrání nejkratší/nejdelší shody začátku hodnoty se vzorkem#2
${název_proměnné#vzorek}
${název_proměnné##vzorek}
dosadit hodnotu proměnné po odebrání nejkratší/nejdelší shody konce hodnoty se vzorkem#3
${název_proměnné%vzorek}
${název_proměnné%%vzorek}
dosadit hodnotu proměnné po nahrazení první/všech shod se vzorkem řetězcem náhrady#4
${název_proměnné/vzorek[/řetězec náhrady]}
${název_proměnné//vzorek[/řetězec náhrady]}
dosadit hodnotu proměnné velkými/malými písmeny#5
${název_proměnné^^}
${název_proměnné,,}
interpretovat hodnotu jako by byla uvedena v konstrukci $'text' a výsledek dosadit#6
${název_proměnné@E}

4/5 Parametry skriptu

dosadit N-tý poziční parametr (alternativy)#1 (25)
$N
${N}
dosadit všechny parametry od $1: do samostatných parametrů/jen oddělené mezerou#2 (26)
"$@"
"$*"
nastavit poziční parametry#3 (27)
set -- parametr
dosadit úsek parametrů (samostatně/oddělené mezerou)#4
"${@: číslo-prvního-parametru [: maximální-počet] }"
"${*: číslo-prvního-parametru [: maximální-počet] }"
dosadit všechny parametry počínaje $0 (samostatně/oddělené mezerou)#5
"${@:0}"
"${*:0}"

4/6 Aritmetické operace při dosazení

inkrementovat/dekrementovat a dosadit#1
$((++název_proměnné))
$((--název_proměnné))
přičíst/odečíst číslo, přiřadit a dosadit#2
$((název_proměnné += číslo))
$((název_proměnné -= číslo))
přičíst/odečíst číslo a dosadit (bez přiřazení)#3
$((název_proměnné + číslo))
$((název_proměnné - číslo))

4/7 Různé příklady

dosadit první neprázdnou z proměnných „a“, „b“ a „c“#1
${a:-${b:-${c:-}}}
ȹdosadit proměnnou „abc“ s odstraněním všech konců řádků#2
${abc//$'\n'}
dosadit proměnnou „abc“ s tím, že všechny číslice se nahradí nulami#3
${abc//[0123456789]/0}
z proměnné „abc“ dosadit jen číslice#4
${abc//[!0123456789]}

5. Zaklínadla: Proměnné prostředí

5/1 Spouštění programů s upraveným prostředím

spustit s upraveným prostředím (jednodušší varianta)#1
[[/usr/bin/]env] PROMĚNNÁ=hodnota [DALŠÍ_PROMĚNNÁ=další-hodnota] příkaz [parametr]
spustit v jiném aktuálním adresáři#2
env -C cesta příkaz [parametr]
spustit s upraveným prostředím (komplexní varianta)#3 (28)
[[/usr/bin/]env] [-i] [--unset=PROMĚNNÁ] [PROMĚNNÁ=hodnota] [-C nový/aktuální/adresář] příkaz [parametr]

5/2 Předdefinované proměnné

absolutní cesta domovského adresáře#1
$HOME⊨ /home/petr
vyhledávací cesty externích příkazů#2 (29)
$PATH⊨ /home/petr/bin:/usr/local/sbin:/usr/local/bin:
/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
označení příslušného grafického zobrazovacího rozhraní#3
$DISPLAY⊨ :0.0
typ terminálu#4 (30)
$TERM⊨ xterm-256color
typ sezení#5 (31)
$XDG_SESSION_TYPE⊨ x11
jazyk/lokalizace systému#6
$LANGUAGE⊨ cs_CZ
$LANG⊨ cs_CZ.UTF-8
výchozí interpret příkazové řádky#7
$SHELL⊨ /bin/bash
uživatelské jméno#8 (32)
$USER⊨ petr
adresář pro dočasné soubory#9
${TMPDIR-/tmp}

5/3 Proměnné ovládající programy a systém

vypnout lokalizaci a podporu Unicode#1 (33)
LC_ALL=C
vypnout lokalizaci, ale ponechat kódování UTF-8#2
LC_ALL=C.utf8
preferovaná časová zóna#3
TZ=UTC
TZ=Europe/Prague
nelokalizovat výpisy a hlášení#4
LC_MESSAGES=C.utf8
požádat aplikaci o použití určitého dočasného adresáře#5
TMPDIR=/absolutní/cesta

5/4 Preferované aplikace

Poznámka: proměnné prostředí EDITOR, VISUAL a PAGER se obvykle nastavují v souboru „~/.bashrc“.

výchozí textový editor (terminálový/grafický)#1
EDITOR=/bin/nano
VISUAL=/usr/bin/gedit
výchozí terminálový stránkovač#2
PAGER=/usr/bin/less

5/5 Prostředí jiných procesů

mohu číst prostředí daného procesu?#1
test -r /proc/PID/environ
vypsat seznam proměnných#2
sed -zE 's/=.*//' /proc/PID/environ | tr \\0 \\n [| sort]
je proměnná definovaná/neprázdná?#3
egrep -zq '^název_proměnné=' /proc/PID/environ
egrep -zq '^název_proměnné=.' /proc/PID/environ
přečíst hodnotu#4
sed -znE 's/^název_proměnné=//;T;p' /proc/PID/environ | tr -d \\0

5/6 Proměnné pro programátory

cesty pro vyhledávání sdílených knihoven#1 (34)
LD_LIBRARY_PATH=cesta[:další/cesta]
vypsat ladicí informace ohledně sdílených knihoven#2 (35)
LD_DEBUG=libs[,symbols] [LD_DEBUG_OUTPUT=předpona/výstupní/cesty]
vynutit načtení funkcí ze zadané sdílené knihovny do aplikace (nezkoušeno, bez záruky).#3
LD_PRELOAD=/home/petr/moje.so

6. Instalace na Ubuntu

Všechny použité nástroje jsou základní součástí Ubuntu, přítomné i v minimální instalaci.

7. Tipy a zkušenosti

8. Další zdroje informací

1 Pozor! Příkaz „unset“ uspěje i tehdy, pokud daná proměnná neexistuje.
2 Pozor! Zapnutí této konverze nezmění stávající hodnotu proměnné, účinek nastane až při následujícím přiřazení!
3 Názvy proměnných se dosadí jako samostatné parametry (podobně jako u speciálního parametru $@).
4 Prvky pole se zadávají stejně jako parametry příkazu, tzn. oddělují se mezerami; obsahují-li zvláštní znaky, budou interpretovány, pokud je neodzvláštníte (vhodné je umístění do uvozovek či apostrofů).
5 V případě potřeby změňte názvy pomocných proměnných „i“, „j“ a „x“.
6 Je dovoleno přiřadit do prvku libovolně daleko za koncem pole; Bash v takovém případě pole automaticky prodlouží prázdnými řetězci, aby index byl platný.
7 Výřez se dosadí jako samostatné parametry (podobně jako u zvláštního parametru $@).
8 Pozor! Vkládání prvků na začátek je v případě rozsáhlého pole velmi pomalé! Snažte se mu vyhnout a vkládat prvky raději na konec. Pro vložení prvku doprostřed použijte spojování polí (které je ale také pomalé).
9 Tyto tvary uvádějte vždy ve dvojitých uvozovkách. Klíč se v tomto případě vyhodnocuje, jako by byl sám uvnitř samostatných dvojitých uvozovek, což umožňuje i vícenásobné vnoření této konstrukce, ačkoliv to je špatně čitelné.
10 Uvozovky kolem klíče slouží pouze k odzvláštnění znaků klíče, můžete je odzvláštnit i jinak, např. zpětným lomítkem či apostrofy.
11 Pokud je uzavírací závorka „}“ na stejném řádku jako poslední příkaz těla funkce, musí být od příkazu oddělená středníkem.
12 Exportované funkce se uloží do zvláštních proměnných prostředí a další instance bashe, která je tímto způsobem „zdědí“, je opět načte jako funkce. Doporučuji exportování funkcí příliš nepoužívat, protože tak můžete snadno ztratit kontrolu nad tím, kam všude se vaše funkce dostanou.
13 Tento test odpoví kladně i v případě, že půjde o pole celočíselných hodnot či asociativní pole celočíselných hodnot.
14 Hodnoty přiřazené do celočíselných proměnných se automaticky vyhodnocují jako výrazy a konvertují na celé číslo. Místo každého druhého názvu proměnné v uvedeném příkazu pochopitelně můžete uvést novou hodnotu proměnné, a to i výrazem.
15 Pozor! Účinek této deklarace nastává až při následujícím přiřazení. Pokud tedy deklarované pole či asociativní pole již obsahuje neceločíselné hodnoty, zůstanou v původní podobě, dokud nebudou přepsány!
16 Poznámka: jmenným odkazem nelze odkazovat na normální ani asociativní pole!
17 Konstanta je proměnná interpretu (popř. prostředí), kterou nelze zrušit ani později změnit její hodnotu (bez použití opravdu škaredých a nespolehlivých hacků). Lze ji však změnit z proměnné interpretu na proměnnou prostředí a naopak. Jde-li o proměnnou prostředí, vytvořené procesy (včetně dalších instancí bashe) ji zdědí již jako obyčejnou (přiřaditelnou) proměnnou prostředí.
18 Hodnota bude typicky v apostrofech či konstrukci „$''“. Konkrétní tvar se může lišit, ale vždy bude možno ho bezpečně dosadit do skriptu.
19 Tuto konstrukci lze skombinovat s většinou ostatních druhů dosazení.
20 Tyto tvary uvádějte vždy ve dvojitých uvozovkách. Klíč se v tomto případě vyhodnocuje, jako by byl sám uvnitř samostatných dvojitých uvozovek, což umožňuje i vícenásobné vnoření této konstrukce, ačkoliv to je špatně čitelné.
21 Nemá-li proměnná zapnutý žádný atribut, dosadí se prázdný řetězec.
22 Pokud má náhradní řetězec obsahovat zvláštní znaky či znak „}“, doporučuji uzavřít jej do dvojitých uvozovek. To funguje i tehdy, pokud je dosazovací výraz jako celek použit uvnitř dvojitých uvozovek.
23 Nebude-li splněna podmínka dosazení, dosadí se prázdný řetězec.
24 Tip: kolem indexu a délku mohou být mezery, kolem názvu proměnné ne.
25 První variantu lze použít pouze pro parametry $0 až $9. Druhou variantu (tu se složenými závorkami) lze použít i pro ostatní parametry (např. ${10}) a lze ji skombinovat s pokročilými formami dosazení.
26 Dvojité uvozovky zde znamenají, že pro správnou funkci musí být $@ (resp. $*) uvedeny uvnitř dvojitých uvozovek.
27 Parametry lze nastavit pouze najednou, přičemž se všechny stávající parametry (kromě $0) ztratí.
28 -i prostředí zcela vyprázdní; --unset z něj odebírá uvedené proměnné, přiřazení proměnné prostředí nastavuje a parametr „-C“ změní aktuální adresář.
29 Cesty jsou odděleny. Bývají absolutní, ale mohou být i relativní. Zahrnout aktuální adresář „.“ je možné, ale z bezpečnostních důvodů se to striktně nedoporučuje.
30 Pro textovou konzoli je to „linux“. Další hodnoty, se kterými se lze setkat, jsou „xterm“ a „rxvt“.
31 Jde-li o X-server, hodnota je „x11“, pro Wayland je to „wayland“, v textové konzoli je to „tty“.
32 Poznámka: proměnnou prostředí lze snadno podvrhnout. Pro bezpečné zjištění uživatelského jména použijte příkaz „id -un“.
33 Tato volba se zapíná především při řazení, kdy způsobí, že soubor se seřadí podle kódových hodnot bajtů. Hodí se také pro dosažení vyššího výkonu některých skriptovacích nástrojů, ale tam je potřeba, aby uživatel věděl, co dělá.
34 Když spuštěný program požádá systém o nahrátí sdílené knihovny, systém ji obvykle vyhledává v několika standardních adresářích. Má-li však program v prostředí proměnnou „LD_LIBRARY_PATH“, systém nejprve prohledává adresáře uvedené zde. V každém případě nahraje první nalezenou knihovnu a případné další knihovny téhož jména ignoruje.
35 Nápovědu k proměnné LD_DEBUG si můžete zobrazit příkazem „env LD_DEBUG=help cat“. Bez proměnné LD_DEBUG_OUTPUT se ladicí údaje vypíšou na standardní výstup; s ní se k jejímu obsahu připojí tečka a PID procesu a výpis se provede do daného souboru.
AWKSoubory a adresářeDatum, čas a kalendář