Login shell

Shell, který se spustí při přihlášení se nazývá login shell. Je to například shell, který získá uživatel po přihlášení na textovou konzolu nebo po přihlášení na vzdálený systém pomocí služby SSH.

Každý jiný shell, který nebyl spuštěn systémem automaticky po přihlášení (například jednotlivá okna grafického terminálu) není login shell. Vynutit spuštění login shell-u lze pomocí parametru -l:

1
$ zsh -l

nebo např.:

1
$ bash -l

Interaktivní shell

Shell může být spuštěn buď interaktivně — uživatel s ním komunikuje, nebo jako interpret skriptu. Při interaktivní práci většinou požadujeme jiné chování příkazového interpretu než při spuštění skriptu. (O skriptování pojednává následující článek této série.)

Uživatel může například při interaktivní práci používat sadu “vychytávek”, aliasů a funkcí, které by při spuštění ve skriptu způsobily nepředvídané chování.


Z shell načítá konfigurační soubory v tomto pořadí:

Soubor Login shell Interaktivní shell Všechny shelly
/etc/zsh/zshenv
~/.zshenv
/etc/zsh/zprofile
~/.zprofile
/etc/zsh/zshrc
~/.zshrc
~/.zlogin

Nejdůležitější jsou dva soubory:

  • ~/.zprofile — načítá se jen pro login shell, vhodný pro nastavení prostředí (proměnná PATH apod.)

  • ~/.zshrc — načítá se pro každý interaktivní shell, vhodný pro aliasy, funkce, nastavení promptu apod.

~/.zprofile

Soubor ~/.zprofile je ekvivalentem ~/.profile z Bashe. Typicky se v něm nastavuje proměnná PATH a jiné proměnné prostředí:

1
2
3
4
5
6
7
8
# Uživatelské skripty a programy
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

O proměnné PATH už jsem psal. Adresář ~/bin/ nebo ~/.local/bin/ je typické místo pro uložení vlastních uživatelských skriptů.

~/.zshrc

Soubor ~/.zshrc slouží pro počáteční nastavení interaktivního shellu. Nastavují se v něm aliasy, funkce, prompt, doplňování příkazů a další vychytávky. Ukázky níže ukazují jen základní strukturu — ~/.zshrc zkušeného uživatele bývá podstatně delší. Například zde najdete .zshrc, který používám ve škole v labu.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Zapnout doplňování příkazů
autoload -Uz compinit && compinit

# Historie
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt share_history        # sdílet historii mezi terminály
setopt hist_ignore_dups     # nezdvojovat stejné příkazy

# Aliasy
alias ll='ls -lhF --color=auto'
alias la='ls -lhAF --color=auto'
alias grep='grep --color=auto'

# Prompt (viz níže)
PROMPT='%F{green}%n@%m%f:%F{blue}%~%f$ '

Aliasy

O aliasech už jsem psal. Zde několik příkladů jak to může vypadat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
alias ll='ls -lhF --color=auto'
alias la='ls -lhAF --color=auto'
alias lsmac="ip addr show | grep link.ether | awk '{print \$2}'"

alias duu='du -sh'
alias grep='grep --color=auto'

alias nazeleno='chmod +x'

alias ps.='ps -u $USER --forest --format pid,tty,pcpu,args'
alias netstat.='netstat -nap --inet --inet6'
alias ss.='ss -tnp'

# Bezpečné smazání -- přesun do koše místo rm (balíček trash-cli)
alias rm='trash-put'

Barvy

Terminál umí zobrazovat barevný text pomocí ANSI escape kódů. Barvy se hodí pro přehledný výpis adresáře, zvýraznění výstupu grep apod.

1
2
3
4
5
# Barevný výpis ls
alias ls='ls --color=auto'

# Barvy pro grep
alias grep='grep --color=auto'

Barvy pro příkaz ls jsou konfigurovány proměnnou $LS_COLORS. Výchozí hodnotu lze vygenerovat příkazem dircolors:

1
$ dircolors --print-database    # zobrazí výchozí nastavení

Přehledné vysvětlení barevných escape sekvencí:

Prompt

Prompt (výzva) se nachází vlevo od kurzoru. V Zsh se nastavuje proměnnou PROMPT (nebo PS1). Zsh má bohatý systém prompt expansion — speciální sekvence % se rozvinou na užitečné informace:

Sekvence Význam
%n uživatelské jméno
%m jméno počítače (hostname)
%~ aktuální adresář (zkrácený)
%d aktuální adresář (plný)
%T čas (HH:MM)
%? návratová hodnota posledního příkazu
%# # pro root, $ pro běžného uživatele

Barvy v promptu se nastavují pomocí %F{barva}%f:

1
2
3
4
5
# Zelené jméno@počítač, modré ~, bílý $
PROMPT='%F{green}%n@%m%f:%F{blue}%~%f%# '

# Zobrazit i návratovou hodnotu, pokud není 0
PROMPT='%(?..[%?] )%F{green}%n@%m%f:%F{blue}%~%f%# '

Dokumentace: man zshmisc (sekce EXPANSION OF PROMPT SEQUENCES)

Hotová řešení

Místo ručního ladění promptu lze sáhnout po hotovém frameworku nebo nástroji:

Oh My ZSH!
Populární framework pro správu Zsh konfigurace. Obsahuje stovky témat a pluginů. Snadný start, ale může zpomalit spouštění shellu.
Powerlevel10k
Velmi rychlé téma pro Zsh s interaktivním průvodcem nastavení (p10k configure). Podporuje ikony, git status, virtuální prostředí Pythonu a mnoho dalšího.
Starship
Moderní, rychlý prompt napsaný v Rustu. Funguje v jakémkoli shellu (Zsh, Bash, Fish…). Konfigurace v ~/.config/starship.toml.

Související posty