===== 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