Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ===== 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:<code> PWD USER EDITOR VISUAL HOME TERM PATH MAIL LANG DISPLAY LOGNAME SHLVL SHELL</code> * Operacje na zmiennych środowiskowych: <code bash> ## 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 </code> === 3. Zmiana znaku zachęty === * Bash (opis w //bash(1)//, "PROMPTING" (ZACHĘTA POWŁOKI)) <code bash>export PS1='\u@\h:\w '</code> * Tcsh (//tcsh(1)//, "set prompt") <code bash>set prompt = "%n@%m:%~ "</code> * 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: <code bash> ## Bash ## alias ls='ls -F' alias ll='ls -l' unalias ls ##Tcsh## alias ls 'ls -F' alias ll 'ls -l' unalias ls </code> === 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 <key>Tab</key>), 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: <code bash>cat [plik1 plik2 ... plikN]</code> > 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): <code> /etc/profile ~/.bash_profile ~/.bash_login ~/.profile /etc/bash.bashrc ~/.bashrc ~/.bash_logout </code> * Tcsh (//tcsh(1)//: Startup and shutdown, FILES): <code> /etc/csh.cshrc /etc/csh.login ~/.tcshrc ~/.cshrc ~/.login /etc/csh.cshrc ~/.tcshrc ~/.cshrc /etc/csh.logout ~/.logout </code> === 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ń (<key>Tab</key>), edycję (polecenia Emacs, Vi) i historię (<key>Left</key><key>Up</key><key>Down</key><key>Right</key>, <key>C-p</key>, <key>C-n</key>, i inne). === 9. 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</key> ''2''), ''M-x shell'' (<key>M-x</key> ''shell'') * (klawisz <key>M</key>/<key>Meta</key> to najczęściej lewy <key>Alt</key>) * 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): <code bash> 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 </code> * 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: <code bash>alias strona='lynx -display_charset=utf-8 https://fais.uj.edu.pl/'</code> * 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: <code bash> 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` </code> === 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: <code bash> tcsh tcsh -l bash bash --login </code> * //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: <key>C-p</key> (również: <key>Up</key>), <key>C-n</key> (<key>Down</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> * przykład (w miejscu <Tab> należy wciskać tabulator): <code> le<Tab><Tab>ss /e<Tab>/pas<Tab> echo $HO<Tab><Tab>ME cd ~s<Tab><Tab> # może zająć kilka sekund na serwerze SPK </code> courses/unix/lab_shell.txt Last modified: 4 years agoby 127.0.0.1