====== Powłoka i środowisko pracy ======
===== DO PRZYGOTOWANIA =====
Samodzielnie należy przed tym laboratorium przygotować:
* podstawy pracy z //Vi// (ten link może pomóc: http://vim-adventures.com/)
* podstawy pracy z //Emacs//
* zapoznać się z innymi edytorami, takimi jak **pico**, **nano**, **mcedit**, ew. czy **joe** **pico** **jed** **zile**
* przypomnieć sobie pracę z **sftp**, **ftp** i **scp**
* przeczytać artykuł {{:pl:dydaktyka:unix:gjn-bash.pdf|GNU Bash - Więcej niż Sh}}
NIEOBOWIĄZKOWO, dla zainteresowanych: [[https://dev.to/awwsmm/101-bash-commands-and-tips-for-beginners-to-experts-30je|101 Bash Commands and Tips for Beginners to Experts]]
===== WPROWADZENIE =====
==== 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//.
==== Ś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
==== Definiowanie zmiennych środowiskowych ====
Ustawianie w Sh:
ZMIENNA=WARTOSC ; export ZMIENNA
Bash:
export ZMIENNA=WARTOSC
Usuwanie:
unset ZMIENNA
Csh:
setenv ZMIENNA WARTOSC
Usuwanie:
unsetenv ZMIENNA
Wyświetlanie (w przypadku zmiennej wyexportowanej):
printenv ZMIENNA
W powłoce Sh (Bash):
echo $ZMIENNA
==== 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''.
==== Re/Definiowanie poleceń ====
Do re/definiowania poleceń powłoki służy **alias**.
Do usuwania definicji: **unalias**.
Bash:
alias ls='ls -F'
alias ll='ls -l'
unalias ls
Tcsh:
alias ls 'ls -F'
alias ll 'ls -l'
unalias ls
==== Cytowanie napisów ====
W środowisku powłoki są używane 3 znaki specjalne pozwalające na konstruowanie/cytowanie napisów:
'' " ''
- cudzysłowy '' " '', tekst w nich zawarty jest jednym napisem, w którym powłoka może interpertować znaki specjalne, np. podstawiać wartości zmiennych,
- apostrofy ''''', j.w. tylko BEZ możliwości interpretowania znaków specjalnych - tekst jest dokładnie cytowany,
- odwrócone apostrofy ''`'' (obok klawisza Tab), zawartość tekstu jest traktowana jako polecenie, uruchamiana przez kolejna powłokę, a wynik działania polecenia jest podstawiany jako tekst.
==== Przeglądanie plików tekstowych ====
* po jednym ekranie/linii do przodu: **more**
* po jednym ekranie/linii 2 kierunki: **less**
* wyświetlanie zawartości podanych plików:
cat [plik1 plik2 ... plikN]
==== 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ę przez ''#''.
* 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
==== 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ń (tabulator), edycję (polecenia Emacs, VI) i historię (strzałki, C-p, C-n, i inne).
==== 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 ''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.
* Ciekawy tutorial do nauki VI: [[https://vim-adventures.com/|VIM Adventures]]
===== ĆWICZENIA =====
==== - Typy powłok ====
* sprawdzić typ swojej powłoki logowania: ''finger KONTO''
* sprawdzić typ powłoki w której się pracuje: ''printenv SHELL''
* 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.
==== - 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'')
==== - 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=iso-8859-2 http://galaxy.uci.agh.edu.pl/~gjn/dydaktyka'
* sprawdzić istniejące aliasy
* usunąć wybrane aliasy
* dopisać wybrane aliasy do plików inicjalizacyjnych powłoki, zalogować się ponownie i sprawdzić działanie.
==== - 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`
==== - 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
* 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)?
//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 (patrz kolejna sekcja), a następnie logując się do odpowiedniej powłoki (np. poprzez ''bash --login'', ''tcsh'') sprawdzić, czy alias jest znany (a zatem poprawnie wczytano i zinterpretowano plik inicjalizacyjny).
==== - GNU Readline ====
Testować w GNU Bash, notacja funkcji GNU Emacs:
* historia:
* przeglądanie: C-p, C-n
* 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.
Poniższe ćwiczenie należy wykonać na w powłoce bash, zamiast należy wciskać tabulator:
less /e/pas
echo $HOME
cd ~s
Należy przeglądać podręcznik do basha, część Readline, Completion. Zaobserwować działanie Readline w innych programach GNU, np. Emacs: uruchomić edytor, C-c C-f TabTab.
===== Dla poszerzenia wiedzy =====
* [[http://www.catonmat.net/blog/bash-emacs-editing-mode-cheat-sheet/]]
* Howard Dahdah //[[http://www.computerworld.com.au/article/279011/-z_programming_languages_bourne_shell_sh|The A-Z of Programming Languages: Bourne shell, or sh (An in-depth interview with Steve Bourne, creator of the Bourne shell, or sh)]]// 05/03/2009.