|
|
pl:dydaktyka:unix:lab_powloka [2018/10/22 08:04] kkutt [6 GNU Readline] |
pl:dydaktyka:unix:lab_powloka [2019/06/27 15:50] |
====== 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}} | |
| |
===== 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 <key>Tab</key>), 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, <key>C-p</key>, <key>C-n</key>, i inne). | |
| |
| |
==== Edytory tekstu ==== | |
| |
* Edytory dzielimy na: Emacs, VI i resztę... | |
* Notacja zapisu poleceń w Emacs: ''C-x'' (<key>C-x</key>), ''M-x'' (<key>M-x</key>), np. ''C-x C-c'' (<key>C-x</key> <key>C-c</key>), ''C-x 2'' (<key>C-x 2</key>), ''M-x shell'' (<key>M-x shell</key>) (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: <key>C-p</key>, <key>C-n</key> | |
* szukanie: <key>C-r</key> | |
* edycja linii: | |
* poruszanie się: <key>C-a</key>, <key>C-e</key>, <key>M-f</key>, <key>M-b</key> | |
* czyszczenie: <key>C-l</key> | |
* kopiowanie i wklejanie: <key>C-k</key>, <key>M-d</key>, <key>C-y</key> | |
* dopełnianie (ang. //completion//): <key>TAB</key>. | |
Poniższe ćwiczenie należy wykonać na w powłoce bash, zamiast <T> należy wciskać tabulator: | |
| |
le<T><T>ss /e<T>/pas<T> | |
echo $HO<T><T>ME | |
cd ~s<T><T> | |
| |
Należy przeglądać podręcznik do basha, część Readline, Completion. Zaobserwować działanie Readline w innych programach GNU, np. Emacs: uruchomić edytor, <key>C-c C-f</key> <key>Tab</key><key>Tab</key>. | |
| |
| |
| |
===== 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. | |