===== 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 **emacs**a pracującego na SPK)
* inne edytory takie jak: **nano**, **mcedit**, ew. **joe**, **pico**, **jed**, **zile**
* Przypomnieć sobie pracę z **sftp** i **scp**
* Przeczytać artykuł {{gjn-bash.pdf|GNU Bash - Więcej niż Sh}}
NIEOBOWIĄZKOWO, dla zainteresowanych - warto przejrzeć: [[https://dev.to/awwsmm/101-bash-commands-and-tips-for-beginners-to-experts-30je|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 [[https://fishshell.com/|Fish]], jednak nie jest ona zgodna ze standardami (specjalnie), dlatego nie będziemy jej tutaj omawiać \\ (dokumentacja opisuje [[https://fishshell.com/docs/current/fish_for_bash_users.html|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'' i ''prompt1 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" ([[wp>less_(Unix)|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ę (LeftUpDownRight, C-p, C-n, i inne).
=== 9. Edytory tekstu ===
* Edytory dzielimy na: Emacs, Vi i resztę...
* Notacja zapisu poleceń w Emacs: ''C-x'' (C-x), ''M-x'' (M-x)
* np. ''C-x C-c'' (C-x C-c), ''C-x 2'' (C-x ''2''), ''M-x shell'' (M-x ''shell'')
* (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: [[https://vim-adventures.com/|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 pomocy ''set 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 - polecenie ''echo "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: C-p (również: Up), C-n (Down)
* szukanie: C-r
* edycja linii:
* poruszanie się: C-a, C-e, M-f, M-b
* czyszczenie: C-l
* kopiowanie i wklejanie: C-k, M-d, C-y
* dopełnianie (ang. //completion//): Tab
* przykład (w miejscu należy wciskać tabulator):
less /e/pas
echo $HOME
cd ~s # może zająć kilka sekund na serwerze SPK