Shelle w Debianie - przegląd
Ten artykuł porządkuje role Basha, Dasha, Zsh, Fish i innych powłok w Debianie. Najważniejsze jest rozróżnienie powłoki interaktywnej, login shella oraz interpretera wskazanego w shebangu skryptu.
Praktyczną pracę z poleceniami opisuje Debian - shell, a pisanie skryptów Programowanie w shellu.
1. Czym jest shell?
Shell, czyli powłoka, to program pośredniczący między użytkownikiem a systemem operacyjnym.
Schemat:
Ty
↓
terminal
↓
shell
↓
program
↓
kernel
Terminal i shell to dwie różne rzeczy. GNOME Terminal, Konsole, xterm czy terminal SSH to terminale. Bash, sh, dash, zsh czy fish to shelle.
2. Najważniejsze pojęcia
Login shell
Shell przypisany do Twojego konta:
echo "$SHELL"
Typowo:
/bin/bash
Aktualny shell
Shell, w którym właśnie pracujesz:
ps -p $$ -o comm=
/bin/sh
W Debianie /bin/sh wskazuje zwykle na Dash:
ls -l /bin/sh
Typowy wynik:
/bin/sh -> dash
Interpreter skryptu
Określa go shebang:
#!/bin/sh
albo:
#!/usr/bin/env bash
3. Jak Debian używa shelli
Typowy układ:
użytkownik
↓
/bin/bash
/bin/sh
↓
dash
Bash służy do codziennej pracy interaktywnej. Dash wykonuje wiele skryptów systemowych zgodnych z POSIX.
4. Najważniejsze shelle
| Shell | Rola |
|---|---|
bash |
główny shell interaktywny |
dash |
interpreter /bin/sh |
sh |
przenośne skrypty POSIX |
zsh |
rozbudowany shell interaktywny |
fish |
wygodny shell interaktywny |
ksh |
klasyczny shell unixowy |
mksh |
lekki Korn shell |
tcsh |
shell z rodziny C shell |
5. Bash
Uruchomienie:
bash
Wyjście:
exit
Bash oferuje historię, completion, aliasy, funkcje, tablice, job control i rozbudowane skrypty.
Przykład:
for file in *.log; do
echo "$file"
done
Tablica:
servers=(web db cache)
echo "${servers[0]}"
Warunek:
if [[ -f config.ini && -r config.ini ]]; then
echo "OK"
fi
6. Konfiguracja Basha
Najważniejszy plik:
~/.bashrc
Przykład:
alias ll='ls -lah'
alias grep='grep --color=auto'
export EDITOR=vim
PS1='\u@\h:\w\$ '
Po zmianie:
source ~/.bashrc
lub:
. ~/.bashrc
Login shell może korzystać także z:
/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
7. Dash
Dash jest małym i szybkim shellem zgodnym z POSIX.
Uruchomienie:
dash
Jeśli skrypt zaczyna się od:
#!/bin/sh
nie używaj bashizmów.
Nieprzenośne:
[[ -f file ]]
Przenośne:
[ -f file ]
Nieprzenośne:
array=(one two three)
Tablice Basha nie należą do POSIX sh.
8. sh w Debianie
Skrypt:
#!/bin/sh
NAME="user"
if [ -f /etc/passwd ]; then
echo "$NAME"
fi
powinien używać tylko składni POSIX.
9. Zsh
Instalacja:
sudo apt install zsh
Uruchomienie:
zsh
Konfiguracja:
~/.zshrc
Przykład:
alias ll='ls -lah'
export EDITOR=vim
autoload -Uz compinit
compinit
10. Fish
Instalacja:
sudo apt install fish
Uruchomienie:
fish
Konfiguracja:
~/.config/fish/config.fish
Fish nie jest zgodny składniowo z POSIX.
Bash:
export EDITOR=vim
Fish:
set -gx EDITOR vim
11. ksh i mksh
Przykładowa instalacja:
sudo apt install ksh
albo:
sudo apt install mksh
To ważne historycznie shelle unixowe, nadal spotykane w starszych środowiskach enterprise.
12. tcsh
Instalacja:
sudo apt install tcsh
Uruchomienie:
tcsh
Przykład:
setenv EDITOR vim
alias ll 'ls -lah'
13. Lista dostępnych login shelli
cat /etc/shells
14. Sprawdzanie shella
Login shell:
echo "$SHELL"
Aktualny shell:
ps -p $$ -o comm=
Dodatkowo:
echo "$0"
15. Uruchamianie innego shella
zsh
Powstaje:
bash
└── zsh
Powrót:
exit
16. exec
exec zsh
zastępuje bieżący shell Zsh-em.
17. Zmiana login shella
Bash:
chsh -s /bin/bash
Zsh:
chsh -s /usr/bin/zsh
Fish:
chsh -s /usr/bin/fish
18. Shebang
POSIX:
#!/bin/sh
Bash:
#!/usr/bin/env bash
Zsh:
#!/usr/bin/env zsh
19. Nie zmieniaj /bin/sh
Nie podmieniaj /bin/sh tylko dlatego, że wolisz Bash. Shell użytkownika i systemowy /bin/sh pełnią inne role.
20. Przekierowania i potoki
command > file
command >> file
command 2> errors.log
command > output.log 2>&1
ps aux | grep nginx
21. Zmienne
NAME="user"
echo "$NAME"
export EDITOR=vim
DATE=$(date)
22. Cytowanie
echo "Hello $NAME"
echo 'Hello $NAME'
echo "\$HOME"
Double quotes interpretują zmienne. Single quotes traktują tekst literalnie.
23. Globbing
Shell rozwija:
*
?
[abc]
Przykład:
ls *.txt
24. Builtiny i programy
type cd
type ls
command -v vim
cd jest builtin-em shella.
25. Aliasy
alias ll='ls -lah'
alias
unalias ll
26. Funkcje
mkcd() {
mkdir -p "$1" && cd "$1"
}
27. Historia
history
history | grep ssh
!!
Wyszukiwanie historii:
Ctrl-R
28. Job control
sleep 1000
Ctrl-Z, a potem:
jobs
fg
bg
Uruchomienie w tle:
sleep 1000 &
29. Login i interactive shell
bash -l
bash -i
Skrypt:
./backup.sh
uruchamia shell nieinteraktywny.
30. $PATH
echo "$PATH"
Shell szuka programów kolejno w katalogach z $PATH.
31. Praktyczny wybór
Najbardziej sensowny zestaw:
interaktywnie: Bash
skrypty systemowe/przenośne: POSIX sh
/bin/sh: Dash
Najwięcej warto nauczyć się:
Bash + POSIX sh
32. Szybka ściąga
echo "$SHELL"
ps -p $$ -o comm=
cat /etc/shells
command -v bash
type cd
echo "$PATH"
33. Najważniejsza zasada
W Debianie
/bin/shto nie Bash.
Jeśli piszesz:
#!/bin/sh
pisz zgodnie z POSIX.
Jeśli potrzebujesz funkcji Basha:
#!/usr/bin/env bash
Oficjalne źródła
- Debian Reference - podstawowe środowisko Unix i shelle: https://www.debian.org/doc/manuals/debian-reference/ch01.en.html
- Debian Reference - programowanie w shellu: https://www.debian.org/doc/manuals/debian-reference/ch12
- Debian manpages: https://manpages.debian.org/