Tech Handbook Null Yard

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/sh to 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/