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