Tech Handbook Null Yard

Shelle w FreeBSD - przegląd

FreeBSD wyraźnie oddziela system bazowy od oprogramowania instalowanego z pakietów, dlatego ścieżka do powłoki ma tu większe znaczenie niż w wielu dystrybucjach Linuksa. Ten artykuł porządkuje powłoki dostępne w systemie bazowym i te instalowane przez pkg.

Praktyczną administrację opisuje FreeBSD - shell, a automatyzację 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 FreeBSD

Terminal i shell to różne rzeczy.

Przykładowe shelle:

  • sh,
  • csh,
  • tcsh,
  • bash,
  • zsh,
  • fish,
  • ksh.

2. System bazowy a dodatkowe oprogramowanie

To bardzo ważne we FreeBSD.

System bazowy zawiera między innymi:

/bin/sh
/bin/csh
/bin/tcsh

Programy instalowane dodatkowo przez pkg trafiają zwykle do:

/usr/local/bin

Dlatego:

/usr/local/bin/bash
/usr/local/bin/zsh
/usr/local/bin/fish

To jedna z podstawowych różnic względem typowego Linuksa.

3. Domyślny shell FreeBSD

We współczesnym FreeBSD podstawowym shellem systemowym jest:

/bin/sh

Typowy układ:

user → /bin/sh
root → /bin/sh

Tcsh nadal pozostaje częścią systemu bazowego.

4. Najważniejsze shelle

Shell Status Typowe zastosowanie
sh system bazowy administracja, skrypty, root
csh system bazowy historyczny shell BSD
tcsh system bazowy rozwinięty C shell
bash pakiet wygodna codzienna praca
zsh pakiet rozbudowany shell interaktywny
fish pakiet wygodna interaktywna konsola
ksh pakiet klasyczny Unix
mksh pakiet lekki Korn shell

5. sh we FreeBSD

FreeBSD ma własny sh jako część systemu bazowego.

Uruchomienie:

sh

Przykład:

#!/bin/sh

NAME="user"

if [ -f /etc/passwd ]; then
    echo "$NAME"
fi

Najważniejsze konstrukcje:

VAR=value
export VAR
if [ -f file ]; then
    echo "jest"
fi
for file in *.txt; do
    echo "$file"
done

6. Konfiguracja sh

Login shell korzysta typowo z:

/etc/profile
~/.profile

Interaktywną konfigurację można powiązać ze zmienną ENV:

ENV="$HOME/.shrc"
export ENV

Dzięki temu możesz trzymać aliasy i ustawienia interaktywne w:

~/.shrc

7. Bash we FreeBSD

Bash nie należy do systemu bazowego.

Instalacja:

sudo pkg install bash

Typowa lokalizacja:

/usr/local/bin/bash

Uruchomienie:

bash

Bash oferuje:

  • historię,
  • aliasy,
  • funkcje,
  • completion,
  • tablice,
  • job control,
  • rozbudowane warunki.

Przykład:

servers=(web db cache)
echo "${servers[0]}"

8. Konfiguracja Basha

Najważniejszy plik:

~/.bashrc

Przykład:

alias ll='ls -lah'
export EDITOR=vim
PS1='\u@\h:\w\$ '

Przeładowanie:

source ~/.bashrc

lub:

. ~/.bashrc

9. Zsh

Instalacja:

sudo pkg install zsh

Uruchomienie:

zsh

Konfiguracja:

~/.zshrc

Przykład:

alias ll='ls -lah'
export EDITOR=vim

autoload -Uz compinit
compinit

Zsh jest bardzo dobrym shellem użytkownika, ale nie należy do systemu bazowego FreeBSD.

10. Fish

Instalacja:

sudo pkg install fish

Uruchomienie:

fish

Konfiguracja:

~/.config/fish/config.fish

Fish nie jest zgodny składniowo z POSIX.

Bash/sh:

export EDITOR=vim

Fish:

set -gx EDITOR vim

11. csh

C shell należy do tradycji BSD.

Przykład:

set name = "user"

Zmienne środowiskowe:

setenv EDITOR vim

Składnia mocno różni się od sh.

12. tcsh

Tcsh jest rozwinięciem C shell i nadal znajduje się w FreeBSD base system.

Uruchomienie:

tcsh

Konfiguracja:

~/.tcshrc

lub:

~/.cshrc

Przykład:

setenv EDITOR vim
alias ll 'ls -lah'
set prompt = "%n@%m:%~%# "

Starsze poradniki FreeBSD często pokazują tcsh jako shell roota. W nowszych wersjach domyślnie używany jest sh.

13. KornShell i mksh

Instalacja:

sudo pkg install ksh

lub:

sudo pkg install mksh

Do administracji FreeBSD ważniejsze jest opanowanie sh, a do wygodnej pracy interaktywnej Basha lub Zsh.

14. Lista dostępnych login shelli

cat /etc/shells

Przykładowo:

/bin/sh
/bin/csh
/bin/tcsh
/usr/local/bin/bash
/usr/local/bin/zsh
/usr/local/bin/fish

15. Sprawdzanie shella

Login shell:

echo "$SHELL"

Aktualny shell:

ps -p $$ -o comm=

Dodatkowo:

echo "$0"

16. Uruchamianie innego shella

Na przykład:

bash

Powstaje:

sh
 └── bash

Powrót:

exit

17. exec

exec bash

zastępuje aktualny shell Bashem.

18. Zmiana login shella

Najpierw:

cat /etc/shells

Bash:

chsh -s /usr/local/bin/bash

Zsh:

chsh -s /usr/local/bin/zsh

Fish:

chsh -s /usr/local/bin/fish

19. Root - ważna praktyka

Root powinien korzystać z shella należącego do systemu bazowego.

Najbezpieczniej:

root → /bin/sh

Nie warto ustawiać rootowi:

/usr/local/bin/bash

jako jedynego login shella.

Powód: /usr/local zawiera oprogramowanie dodatkowe. W sytuacji awaryjnej root nadal powinien mieć dostęp do shella z systemu bazowego.

Dobry układ:

root → /bin/sh
user → /usr/local/bin/bash

20. sudo -i

sudo -i

uruchamia środowisko loginowe roota.

Jeżeli root ma:

/bin/sh

dostaniesz sh.

Natomiast:

sudo bash

jawnie uruchamia Bash jako root.

21. Shebang

Dla przenośnego skryptu:

#!/bin/sh

Jeżeli potrzebujesz Basha:

#!/usr/bin/env bash

To wygodne, ponieważ Bash znajduje się zwykle tutaj:

/usr/local/bin/bash

22. Dlaczego env bash jest użyteczne

Na różnych systemach Bash może znajdować się w różnych miejscach.

FreeBSD:

/usr/local/bin/bash

Linux:

/usr/bin/bash

Dlatego:

#!/usr/bin/env bash

wyszukuje Basha przez $PATH.

23. Nie zastępuj systemowego sh

FreeBSD sh jest częścią systemu bazowego.

Możesz ustawić inny shell użytkownikowi, ale nie podmieniaj systemowego /bin/sh.

24. Przekierowania

command > file
command >> file
command 2> errors.log
command > output.log 2>&1

25. Potoki

ps aux | grep nginx

Shell tworzy potok między procesami.

26. Zmienne

NAME="user"
echo "$NAME"
export EDITOR=vim
DATE=$(date)

27. Cytowanie

echo "Hello $NAME"
echo 'Hello $NAME'
echo "\$HOME"

28. Globbing

Shell rozwija:

*
?
[abc]

Przykład:

ls *.conf

29. Builtiny

type cd
type ls
command -v pkg

cd jest builtin-em.

30. Aliasy

alias ll='ls -lah'
alias
unalias ll

31. Funkcje

mkcd() {
    mkdir -p "$1" && cd "$1"
}

32. Historia

W Bash:

history

Wyszukiwanie:

Ctrl-R

33. Job control

Uruchomienie:

sleep 1000

Ctrl-Z, a następnie:

jobs
fg
bg

Uruchomienie od razu w tle:

sleep 1000 &

34. $PATH

echo "$PATH"

We FreeBSD szczególnie ważne jest:

/usr/local/bin

bo tam znajdują się programy instalowane przez pkg.

35. Instalowanie shelli przez pkg

sudo pkg install bash
sudo pkg install zsh
sudo pkg install fish
sudo pkg install mksh

Po instalacji:

cat /etc/shells
command -v bash

36. Dobry układ we FreeBSD

Dla roota:

/bin/sh

Dla zwykłego użytkownika:

/bin/sh

jeśli chcesz pracować blisko filozofii FreeBSD,

albo:

/usr/local/bin/bash

jeśli chcesz środowisko podobne do Debiana.

37. Co warto nauczyć się najlepiej

Najważniejsze:

1. FreeBSD sh
2. Bash

sh daje rozumienie systemu i przenośność.

Bash daje wygodę i podobne środowisko jak na Linuksie.

38. Szybka ściąga

echo "$SHELL"
ps -p $$ -o comm=
cat /etc/shells
command -v bash
echo "$PATH"

Instalacja Basha:

sudo pkg install bash

Zmiana shella:

chsh -s /usr/local/bin/bash

39. Najważniejsza zasada

FreeBSD sh jest częścią systemu bazowego, a Bash, Zsh i Fish są dodatkami.

Dlatego:

root → /bin/sh

jest rozsądnym wyborem, a zwykły użytkownik może korzystać z:

/usr/local/bin/bash

lub:

/usr/local/bin/zsh

Oficjalne źródła

  • FreeBSD Handbook - Shells: https://docs.freebsd.org/en/books/handbook/basics/#shells
  • FreeBSD manual pages: https://man.freebsd.org/
  • FreeBSD Ports and Packages: https://docs.freebsd.org/en/books/handbook/ports/