Powłoka i środowisko pracy
Przygotuj się do laboratorium
- Zapoznać się z edytorami:
- vi (konieczny, jeżeli chcesz być prosem!) (ten link może pomóc ogarnąć podstawy: http://vim-adventures.com/)
- emacs (jeżeli chcesz korzystać z niego na SPK, musisz dodać opcję
-X
logując się przez SSH (ssh -X login@host
); dzięki temu na Twoim komputerze wyświetli się okienko emacsa pracującego na SPK) - inne edytory takie jak: nano, mcedit, ew. joe, pico, jed, zile
- Przypomnieć sobie pracę z sftp i scp
- Przeczytać artykuł GNU Bash - Więcej niż Sh
NIEOBOWIĄZKOWO, dla zainteresowanych - warto przejrzeć: 101 Bash Commands and Tips for Beginners to Experts
Wiedza
1. Powłoki w środowisku GNU
- W środowisku Unix istnieje wiele różnych standardów powłok.
- Dwa najważniejsze to: SH (Bourne Shell) i CSH (C Shell).
- Ich implementacje w środowisku GNU to: Bash (Bo(u)rn(e) Again Shell) i tcsh (TENEX-like Csh).
- Najpopularniejszą w środowisku GNU/Linux jest GNU Bash.
- Ciekawą powłoką jest Fish, jednak nie jest ona zgodna ze standardami (specjalnie), dlatego nie będziemy jej tutaj omawiać
(dokumentacja opisuje najważniejsze różnice między Bash a Fish)
2. Środowisko pracy aplikacji
- Powłoka zapewnia środowisko do uruchamiania programów.
- Środowisko to jest określane przez szereg zmiennych środowiskowych.
- Każda zmienna ma nazwę i wartość.
- Wartości zmiennych są napisami.
- W powłokach Sh i Csh występują różnice w sposobie ustawiania zmiennych.
- Typowe zmienne:
PWD USER EDITOR VISUAL HOME TERM PATH MAIL LANG DISPLAY LOGNAME SHLVL SHELL
- Operacje na zmiennych środowiskowych:
## Bash/Sh ## export ZMIENNA=WARTOSC # ustawianie (Bash) ZMIENNA=WARTOSC ; export ZMIENNA # ustawianie (Sh) echo $ZMIENNA # wyświetlanie unset ZMIENNA # usuwanie ## Tcsh/Csh ## setenv ZMIENNA WARTOSC # ustawianie printenv ZMIENNA # wyświetlanie unsetenv ZMIENNA # usuwanie
3. Zmiana znaku zachęty
- Bash (opis w bash(1), “PROMPTING” (ZACHĘTA POWŁOKI))
export PS1='\u@\h:\w '
- Tcsh (tcsh(1), “set prompt”)
set prompt = "%n@%m:%~ "
- Inne prompty to:
PS2 PS3
iprompt1 prompt2
.
4. Re/Definiowanie poleceń (alias)
Polecenie alias widzieliśmy już poprzednio - poznajmy je lepiej!
- Do re/definiowania poleceń powłoki służy alias.
- Do usuwania definicji: unalias.
- Przykłady:
## Bash ## alias ls='ls -F' alias ll='ls -l' unalias ls ##Tcsh## alias ls 'ls -F' alias ll 'ls -l' unalias ls
5. Cytowanie napisów
W środowisku powłoki są używane 3 znaki specjalne pozwalające na konstruowanie/cytowanie napisów:
- cudzysłowy
“TEKST”
, tekst w nich zawarty jest jednym napisem, w którym powłoka może interpretować znaki specjalne, np. podstawiać wartości zmiennych, - apostrofy
'TEKST'
, j.w., tylko BEZ możliwości interpretowania znaków specjalnych – tekst jest dokładnie cytowany, - odwrócone apostrofy
`TEKST`
(obok klawisza Tab), zawartość tekstu jest traktowana jako polecenie, uruchamiana przez kolejna powłokę, a wynik działania polecenia jest podstawiany jako tekst.
6. Przeglądanie plików tekstowych
- po jednym ekranie/linii do przodu: more
- po jednym ekranie/linii w obydwu kierunkach: less (less is more!)
- wyświetlanie zawartości podanych plików:
cat [plik1 plik2 ... plikN]
To help remember the difference between less and more, a common joke is to say, “less > more,” implying that less has greater functionality than more. A similar saying is that “less is more, more or less” (Wikipedia)
7. Inicjalizacja pracy powłok
- Przy początku i końcu pracy powłoki czytają odpowiednie pliki konfiguracyjne.
- Czytane są różne pliki dla non/login shell.
- sh używa innych plików niż csh.
- Pliki są interpretowane, a nie uruchamiane.
- Interpretację podanego pliku można wymusić przez source.
- Komentarze w powłoce wstawia się rozpoczynając od
#
. - Dowolny tekst wypisuje:
echo “tekst”
. - Przeglądanie plików tekstowych (w tym inicjalizacyjnych powłok) jest możliwe przez: more, less, cat
- Pliki inicjalizacyjne:
- Bash (opis w bash(1): INVOCATION, FILES):
/etc/profile ~/.bash_profile ~/.bash_login ~/.profile /etc/bash.bashrc ~/.bashrc ~/.bash_logout
- Tcsh (tcsh(1): Startup and shutdown, FILES):
/etc/csh.cshrc /etc/csh.login ~/.tcshrc ~/.cshrc ~/.login /etc/csh.cshrc ~/.tcshrc ~/.cshrc /etc/csh.logout ~/.logout
8. GNU Readline
- Jest to zaawansowana biblioteka do obsługi linii poleceń.
- Jest dostępna w wielu programach GNU i innych na GPL.
- Rozpowszechaniana na LGPL.
- Umożliwia między innymi dopełnianie linii poleceń (Tab), edycję (polecenia Emacs, Vi) i historię (←↑↓→, Ctrl+P, Ctrl+N, i inne).
9. Edytory tekstu
- Edytory dzielimy na: Emacs, Vi i resztę…
- Notacja zapisu poleceń w Emacs:
C-x
(Ctrl+X),M-x
(M+X)- np.
C-x C-c
(Ctrl+X Ctrl+C),C-x 2
(Ctrl+X2
),M-x shell
(M+Xshell
) - (klawisz M/Meta to najczęściej lewy Alt)
- Reszta często emuluje w pewnym zakresie jeden z tych dwóch.
- Należy znać podstawy użycia Emacs i Vi, np.: poruszanie się po ekranie, obsługa plików, podstawy edycji.
- Vi jest zawsze dostępny - inne edytory niekoniecznie!
- Ciekawy tutorial do nauki VI: VIM Adventures
Ćwiczenia
I. Typy powłok
- sprawdzić typ swojej powłoki logowania:
finger LOGIN
/printenv SHELL
/cat /etc/passwd | grep LOGIN
- uruchomić powłokę przeciwną do tej, w której się pracuje: bash / tcsh
- sprawdzić jak zmieniło się środowisko: printenv
- wyjść z uruchomionej powłoki dodatkowej
II. Zmienne środowiskowe
- oglądnąć ustawienia środowiska: printenv, jeżeli spis nie mieści się na ekranie, użyć
printenv | less
- odnaleźć w spisie zmienne wymienione w opisie laboratorium,
- ustawić własną zmienną, np. ALFA na wybraną wartość, np.
moja
- przećwiczyć dla powłoki bash (
export ZM=wart
) i tcsh (setenv ZM wart
) - zaobserwować dziedziczenie środowiska w powłoce na przykładzie bash (wpisać poniższe):
bash COS=tam printenv COS echo $COS bash printenv COS echo $COS exit export COS printenv COS echo $COS bash printenv COS echo $COS exit exit
- ustawić znaki zachęty w powłoce sh/bash przy pomocy zmiennej
PS1
i tcsh przy pomocyset prompt
- ustawić na wartości:
uzytkownik@komputer katalog
,godzina-katalog
i inne. - przetestować dziedziczenie prompta w sh (ustawiać z i bez
export
)
III. Aliasy
- sprawdzić istniejące aliasy
- zredefiniować (w odpowiedniej powłoce) działanie ls:
alias ls='ls -alF
' (dla sh) - zdefiniować własny alias:
alias ll='ls -l
' - ustawić alias:
alias strona='lynx -display_charset=utf-8 https://fais.uj.edu.pl/'
- sprawdzić istniejące aliasy
- usunąć wybrane aliasy
- dopisać wybrane aliasy do plików inicjalizacyjnych powłoki, zalogować się ponownie i sprawdzić działanie
IV. Cytowanie napisów
Proszę porównać działanie:
echo $SHELL echo "$SHELL" echo '$SHELL' echo \$SHELL echo \\$SHELL echo \$$SHELL echo "system to: uname" echo "system to: 'uname'" echo "system to: `uname`" echo "ls -l" echo 'ls -l' echo `ls -l`
V. Inicjalizacja powłok
- Odnaleźć w dokumentacji odpowiednie fragmenty opisujące inicjalizację powłok:
- bash(1): INVOCATION (WYWOŁANIE), FILES (PLIKI),
- tcsh(1): Startup and shutdown, FILES
- Przy pomocy wybranego edytora (nano, pico, mcedit, emacs, jed, vi, …) stworzyć pliki dla własnej powłoki logowania:
- inicjalizacyjne dla login shell
- inicjalizacyjne dla nonlogin shell
- czytane przy zamykaniu powłoki
- Działanie plików testować przy pomocy polecenia source
- Umieścić w plikach komentarze - znak hash (
#
) i komunikaty - polecenieecho “napis”
- Sprawdzać inicjalizację powłok login i nonlogin uruchamiając:
tcsh tcsh -l bash bash --login
- Wskazówka: Aby przetestować, czy poprawnie zdefiniowali Państwo plik inicjalizacyjny można np. zdefiniować w nim zmienną środowiskową, komunikat wyświetlany przy pomocy
echo
lub alias, a następnie logując się do odpowiedniej powłoki (j.w.) sprawdzić, czy alias jest znany (a zatem poprawnie wczytano i zinterpretowano plik inicjalizacyjny).
- W pliku czytanym przy zamykaniu powłoki umieścić polecenie clear
- Jak “przestawić” login shell, np. z Tcsh na Basha (przy pomocy plików inicjalizacyjnych)?
VI. GNU Readline
Przetestować w GNU Bash:
- historia:
- przeglądanie: Ctrl+P (również: ↑), Ctrl+N (↓)
- szukanie: Ctrl+R
- edycja linii:
- poruszanie się: Ctrl+A, Ctrl+E, M+F, M+B
- czyszczenie: Ctrl+L
- kopiowanie i wklejanie: Ctrl+K, M+D, Ctrl+Y
- dopełnianie (ang. completion): Tab
- przykład (w miejscu <Tab> należy wciskać tabulator):
le<Tab><Tab>ss /e<Tab>/pas<Tab> echo $HO<Tab><Tab>ME cd ~s<Tab><Tab> # może zająć kilka sekund na serwerze SPK