Už víš, že Bash používá proměnné.
Asi nejčastěji se používají vrámci cyklu for
:
$ cd ~/Dokumenty/data-shell/creatures/
$ for jmeno in *.dat;
> do
> head -n2 $jmeno | tail -n1
> done
CLASSIFICATION: basiliscus vulgaris
CLASSIFICATION: bos hominus
CLASSIFICATION: equus monoceros
Spousta proměnných v Bashi je součást takzvaného prostředí, které používá jak samotný Bash, tak i programy které spouští.
Jedna z takových proměnných je LANG
– aktuální jazyk.
U mě je nastaven na češtinu, takže programy vypisují hlášky v češtině
(pokud jsou překlady k dispozici):
$ echo $LANG
cs_CZ.UTF-8
$ cat neexistujuci
cat: neexistujuci: Adresář nebo soubor neexistuje
Můžu ho ale nastavit i na angličtinu.
Jak už víš, proměnnou můžeš nastavit pomocí příkazu
jméno=hodnota
,
kde před a za rovnítkem nesmí být mezera:
$ LANG=en_US.UTF-8
$ exbho
bash: exbho: command not found...
$ cat neexistujuci
cat: neexistujuci: No such file or directory
Pokud máš anglický systém, je možné, že pouhé nastavení LANG=cs_CZ.UTF-8
ti jazyk nepřepne – příslušné překlady musí být na systému nainstalovány,
aby se daly použít.
Všechny proměnné prostředí ti vypíše příkaz env
(bez argumentů):
$ env | head
SHELL=/bin/bash
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1742,unix/unix:/tmp/.ICE-unix/1742
COLORTERM=truecolor
HISTCONTROL=ignoredups
XDG_MENU_PREFIX=gnome-
HISTSIZE=1000
HOSTNAME=localhost.localdomain
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh
XMODIFIERS=@im=ibus
DESKTOP_SESSION=gnome-xorg
$ env | grep ^LANG=
LANG=cs_CZ.UTF-8
Tyto proměnné má k dispozici jakýkoli program spuštěný z Bashe.
Třeba z Pythonu je přístupné jako slovník os.environ
:
import os
for key, value in os.environ.items():
print(f'{key}={value}')
Proměnné Bashe se ale do prostředí nedostávají automaticky.
Následující příkaz nastaví proměnnou jmeno
.
Pak pomocí env
zjistí hodnotu proměnné prostředí,
která se posílá programům (jako env
a python
) – tam jmeno
není.
Příkaz echo $jmeno
ale obsah proměnné vypíše.
$ jmeno=minotaur.dat
$ env | grep jmeno
$ echo $jmeno
minotaur.dat
Ačkoli je v Bashi jmeno
nastavené a doplňuje se při použití dolaru,
programu env
se neposlalo.
Když ale to samé vyzkoušíš s LANG
, zjistíš že tahle proměnná se progrramu
env
poslala.
Proč?
Proměnné v Bashi mají určité příznaky (angl. attributes/properties).
Nejdůležitější z nich je příznak export, který říká, jestli je proměnná
součástí prostředí, nebo jestli jde jen o „lokální“ proměnnoiu Bashe.
Nastavíš ho příkazem export
.
$ export jmeno
$ env | grep jmeno
jmeno=minotaur.dat
$ echo $jmeno
minotaur.dat
Teď Bash předá proměnnou jmeno
příkazům, které z něj spustíš.
Příkaz export
nekopíruje hodnotu proměnné do prostředí, ale říká Bashi,
že má tuto proměnnou předat každému novému příkazu.
Když tedy proměnnou nastavíš na něco jiného,
změna se projeví v dalším příkazu i bez dalšího export
:
$ jmeno=unicorn.dat
$ env | grep jmeno
jmeno=unicorn.dat
$ echo $jmeno
unicorn.dat
Příznak můžeš vypnout pomocí export -n
:
$ export -n jmeno
$ env | grep jmeno
$ echo $jmeno
unicorn.dat
A taky můžeš nastavit příznak i hodnotu najednou:
$ export jmeno=basilisk.dat
$ env | grep jmeno
jmeno=basilisk.dat
$ echo $jmeno
basilisk.dat
Další příznaky
Proměnné můžou mít i další příznaky, i když většinou nejsou zas tak užitečné.
Například pomocí declare -u velke
můžeš Bashi říct, že v proměnné velke
můžou být jen velká písmenka:
$ declare -u velke
$ velke=Ahoj
$ echo $velke
AHOJ
Více příznaků najdeš v nápovědě příkazu export
.
ls
Jedna z proměnných které máš (na Fedoře) v Bashi automaticky exportované
se jmenuje LC_COLORS
.
Využívá ji příkaz ls
k nastavení barevnosti.
Zaběhni do nějakého adresáře, kde je mix adresářů a normálních souborů:
$ cd ~/Dokumenty/data-shell/data
A zkus si co dělá ls
ve výchozím nastavení:
$ ls
ahoj.txt animal-counts archiv morse.txt planets.txt sunspot.txt
amino-acids.txt animals.txt elements pdb salmon.txt
Potom nastav proměnnou LS_COLORS
na středník a zkus ls
znovu.
(Středník je pro Bash speciální, je ho třeba dát do uvozovek.)
Příkaz ls
si teď vybere jiný způsob obarvení:
$ LS_COLORS=';'
$ ls
Když znáš formát zadávání barev (do čehož teď nebudeme zabíhat), můžeš si barvičky nastavit podle sebe:
$ LS_COLORS='di=38;1;31'
$ ls
Kolem hodnoty jsou uvozovky, aby Bash znak ;
nebral jako oddělovač příkazů.
Proměnnou prostředí můžeš nastavit i pro jeden jediný příkaz,
a to tak, že nastavení (jméno=hodnota
)
připíšeš před jméno příkazu:
$ LS_COLORS='di=38;1;33' ls
$ ls
Tím se nastaví pouze proměnná prostředí – nikoli proměnná Bashe.
$ pozdrav=ahoj env | grep pozdrav
pozdrav=ahoj
$ echo $pozdrav
$ pozdrav=ahoj echo $pozdrav
Stejně jako LS_COLORS
se dají použít všechny ostatní proměnné, které
ovlivňují chování programů, např.
LANG
,FLASK_APP
(pro ty, kdo znají framework Flask),PYTHONVERBOSE
– při nastavení na 1
vypisuje Python např. detaily všech
naimportovaných modulů, neboPAGER
a EDITOR
– viz níže.A některé proměnné Bash nejen používá, ale i nastavuje:
HOSTNAME
: jméno počítačeLC_*něco*
: nastavení formátování různých řetězcůPWD
: aktuální adresářHOME
: domovský adresářNěkteré z nich nastavuje speciálním způsobem, takže
Bash nahrazuje všechny výskyty $jméno
obsahem dané
proměnné.
Dělá to nejen v samostatných argumentech, ale i v jejich částech:
$ komparativ=lepší
$ echo nej$komparativ
nejlepší
Občas, když tohle budeš tohle chtít použít, budeš potřebovat Bashi říct,
co je ještě jméno proměnné.
Pak můžeš jméno uzavřít do „kudrnatých“ závorek,
${jméno}
:
$ majitel=Petr
$ echo $majitelovo jablko # proměnná jménem "majitelovo" neexistuje
jablko
$ echo ${majitel}ovo jablko
Petrovo jablko
Fuguje to vždy; $jméno
bez závorek je jen zkratka.
$ echo ${LANG}
cs_CZ.UTF-8
Proměnné Bash nahrazuje i ve jménech programů, takže můžeš napsat:
$ zpracuj=head
$ $zpracuj sunspot.txt
* Sunspot data collected by Robin McQuinn from *)
* http://sidc.oma.be/html/sunspot.html *)
* Month: 1749 01 *) 58
* Month: 1749 02 *) 63
* Month: 1749 03 *) 70
* Month: 1749 04 *) 56
* Month: 1749 05 *) 85
* Month: 1749 06 *) 84
* Month: 1749 07 *) 95
$ zpracuj='wc -l'
$ $zpracuj sunspot.txt
3080 sunspot.txt
$ zpracuj=less
$ $zpracuj sunspot.txt
Tohle se reálně používá.
V proměnné EDITOR
spousta programů hledá editor, který spustí když
chtějí aby uživatel změnil nějaký soubor – například když se Git ptá na
popis změn.
Ve Fedoře je standardně nastaven na /usr/bin/nano
, ale v ~/.bashrc
si můžeš nastavit
jiný.
(Pozor ale na to, že nastavení jako git config
nebo proměnná GIT_EDITOR
tuhle hodnotu „přebíjí“.)
V proměnné PAGER
zase můžeš nastavit „skrolovátko“.
Opět – spousta programů se tím pak bude řídit.
Tahle proměnná není „od výroby“ nastavená; když je prázdná tak programy
typicky použijí less
.
Některé proměnné prostředí využívá samotný Bash.
Jedna z nejzákladnějších je PS1
, která ovládá výzvu
(angl. prompt; PS
je zkratka prompt string).
Bývá nastavena na docela složitou hodnotu:
[\u@\h \W]\$
Bash v ní nahrazuje sekvence se zpětnými lomítky. (Co které znamená, to můžeš případně dohledat v dokumentaci.)
Když chceš výzvu zkrátit, nastav PS1
na něco kratšího.
Doporučuju výzvu ukončit dolarem (aby bylo jasné že to je výzva) a
mezerou (která musí být v uvozovkách, aby ji Bash bral jako součást hodnoty).
[user@fedora data]$ PS1='$ '
$
Když napíšeš do příkazové řádky víceřádkový příkaz (např. v uvozovkách),
výzva se změní. Poslední znak většinou bude >
místo $
.
Například:
$ echo "jeden řádek
> druhý řádek
> třetí řádek"
jeden řádek
druhý řádek
třetí řádek
Tuto variantu výzvy nastavíš pomocí proměnné PS2
.