przejście do zawartości
Jan Kończak
Narzędzia użytkownika
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Ostatnie zmiany
Menadżer multimediów
Indeks
Jesteś tutaj:
start
»
so
»
redirects
so:redirects
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
===== Wyświetlanie linków / tekstu / sekwencji liczb ===== ==== Wyświetlanie zawartości plików ==== ''**cat** [//plik//]...'' wyświetla podane //plik//i jeden po drugim (lub wyświetla dane przeczytane ze standardowego wejścia jeśli nie podano //plik//u). \\ Nazwa bierze się od operacji <html><a href="https://pl.wikipedia.org/wiki/Konkatenacja">kon<u>kat</u>enacji</a></html> \\ Z przełącznikiem ''-n'' program ''cat'' numeruje linie, a z ''-v'' wyświetla bajty reprezentujące niedrukowalne znaki ASCII jako reprezentujący je tekst((Możesz sprawdzić jaki tekst odpowiada któremu bajtowi (poza ''\t'' i ''\n'', zastąpionym przez ''X''), wykonując: \\ ''perl -e'for(0..15){printf"\t%x_",$_};print"\n";for$l(0..15){printf"_%x",$l;for$h(0..15){$c=$h<<4|$l;$c=88 if $c==9||$c==10;printf("\t%c",$c)}print"\n"}'|cat -v'')). ''**paste** //plik_1// [//plik_2//]...'' czyta po jednej linii z każdego z plików i wypisuje je oddzielone tabem, powtarzając to do wyczerpania najdłuższego pliku. ''**fold** [-w //szer//] [//plik//]...'' wyświetla podane pliki (lub standardowe wejście) wstawiając znak nowej linii kiedy tylko wypisywana linia miałaby być dłuższa niż //szer// (domyślnie 80). \\ ''fold -s …'' wstawia nowe linie w miejsce ostatniej spacji przed //szer// (chyba że nie ma ich w wierszu, wtedy wstawia je na //szer//-1). ''**column** [-x] [//plik//]...'' działa jak ''cat'' jeśli najdłuższa linia w //plik//ach (bądź standardowym wejściu) nie zmieściłaby się dwukrotnie na szerokość w terminalu; w innym wypadku, wypisuje dane w tylu kolumnach ile mieści się na szerokość terminala, uzupełniając wpierw kolumny (albo, z ''-x'', wiersze). \\ ''**column -t** [//plik//]...'' robi coś zupełnie innego: wykrywa kolumny w liniach (rozdzielone separatorem, domyślnie białymi znakami) i formatuje //plik//i / wejście w tabelę. ''**od** [-t x1] …'', ''**hexdump** [-C] …'', i ''**xxd** …'' pokazują pliki binarnie. ++++ Przykłady | {{page>so:redirects:cat&inline}} ++++ ~~Zadanie.#~~ Wyświetl plik używając ''cat''. Wyświetl dwa pliki naraz używając ''cat''. \\ <small>(Jeśli nie masz pomysłu jakie pliki wyświetlić, użyj np. ''/etc/SUSE-brand'' i ''/etc/os-release'')</small> ~~Zadanie.#~~ Uruchom ''cat'', wpisz dowolny tekst, potem naciśnij //Enter// i //Ctrl+d//. <small> ~~Zadanie.#~~ Wyświetl plik ''/usr/share/doc/mpich/user.pdf'' zarówno z przełącznikiem ''-v'' jak i bez niego. </small> ~~Zadanie.#~~ Użyj ''paste'' do połączenia pliku z samym sobą. <small> ~~Zadanie.#~~ Wyświetl plik ''/etc/mtab'' formatując go jako tabelę. \\ Używając przełącznika ''-s'' do wybrania separatora wyświetl ''/etc/passwd'' formatując go jako tabelę. ~~Zadanie.#~~ Wyświetl binarny plik (np. ''/usr/share/themes/Breeze/assets/line-h.png''). </small> ==== Wyświetlanie tekstu ==== ''**echo** //tekst//'' wypisuje //tekst// i znak nowej linii (to ostatnie można wyłączyć podając ''-n''). \\ Przełącznik ''-e'' powoduje zamianę sekwencji takich jak ''\t'' czy ''\n'' na odpowiadające im znaki (tutaj: tab i nowa linia). ''**printf** //format// [//argument//]...'' działa jak funkcja ''printf'' z języka C (z pewnymi dodatkami). <small> ''**figlet** [//tekst//]'' wypisuje //tekst// (lub standardowe wejście) rysowane ascii-art'ową czcionką. ''**cowsay** [//tekst//]'' wyświetla krowę mówiącą //tekst// (lub standardowe wejście). </small> ++++ Przykłady | {{page>so:redirects:echo&inline}} ++++ ~~Zadanie.#~~ Sprawdź działanie ''echo -e 'foo\n\nbaz' '' \\ oraz ''echo -e '\n\n one \033[A \033[A two \033[B \033[B \n \033[1;31m red \033[0m' '' \\ <small>[[https://en.wikipedia.org/wiki/ANSI_escape_code|Sekwencje sterujące ANSI]] są dobrze opisane [[https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797|tutaj]]</small> ~~Zadanie.#~~ Sprawdź działanie ''printf "|%4.2f|%3s|%-16s|\n|%4.2f|%3s|%-16s|\n" 3,1428 pi obwod/srednica 9,8 g grawitacja'' ==== Generowanie sekwencji liczb ==== ''**seq** [//start// [//krok//]] //granica//'' generuje sekwencje liczb zaczynające się od //start//, zwiększanego o //krok// dopóki nie zostanie przekroczona //granica//. \\ Jeśli nie podano, //start// i //krok// mają wartość 1. \\ Opcja ''-w'' dopisuje taką ilość zer, by liczby miały tyle samo znaków (np. ''seq -w 8 11'' wypisze 08, 09, 10 i 11). ++++ Przykłady | {{page>so:redirects:seq&inline}} ++++ ~~Zadanie.#~~ Wygeneruj sekwencję liczb od 1 do 15. ~~Zadanie.#~~ Wygeneruj sekwencję liczb od 64 do 1024 z krokiem co 64. ===== Standardowe strumienie ===== | K&R C[[https://archive.org/details/TheCProgrammingLanguageFirstEdition|[1]]] [[https://en.wikipedia.org/wiki/C_(programming_language)#K&R_C|[2]]]<code c>printf("Wpisz swoje imię:\n") scanf("%s", name);</code> | Python<code python>print("Wpisz swoje imię:") name = input()</code> | Czy zastanawiałeś się skąd program wie skąd czytać dane wejściowe i gdzie funkcje takie jak print powinny wypisywać? **W "uniksowym" świecie program oczekuje że w momencie uruchomienia będzie mieć otwarte trzy pliki – standardowe wejście, standardowe wyjście i standardowy błąd. (Które razem są nazywane [[https://en.wikipedia.org/wiki/Standard_streams|standardowymi strumieniami]].)** \\ <small> Bazuje na tym standardowa biblioteka wejścia/wyjścia z języka C – ''stdio.h''. C zostało stworzone przez jednego z autorów UNIXa. </small> W większości języków programowania podstawowe funkcje I/O czytają ze standardowego wejścia i piszą do standardowego wyjścia. \\ Standardowy błąd w założeniu ma służyć do raportowania co poszło nie tak. Języki programowania często mają dedykowane funkcje piszące do tego strumienia. W uniksopodobnych jak i kompatybilnych z POSIX-em systemach system operacyjny zajmuje się faktyczną realizacją dostępu do pliku, a użytkownik tylko zleca jakie operacje mają być wykonane. Otwierając plik użytkownikowi zwracany jest jego identyfikator – **deskryptor pliku** – liczba całkowita będąca w rzeczywistości indeksem w odpowiedniej tablicy systemu operacyjnego. \\ Zlecając operacje take jak np. odczyt danych, użytkownik podaje ten numer, rodzaj operacji i jej szczegóły, np. dla odczytu podaje ile bajtów odczytać i gdzie umieścić odczytane bajty. Proces potomny dziedziczy wszystkie deskryptory rodzica. **Trzy standardowe strumienie to pliki wskazywane przez trzy pierwsze deskryptory: \\ 0 jest zawsze standardowym wejściem, 1 wyjściem, a 2 błędem.** W uniksopodobnych systemach "plik" niekoniecznie jest danymi na dysku, system UNIX próbował [[https://en.wikipedia.org/wiki/Everything_is_a_file|wszystko]] reprezentować jako pliki. Na przykład, dla systemu terminal jest plikiem (nawet jeśli jest podłączoną do komputera maszyną do pisania). Domyślnie powłoki mają otwarty terminal jako pliki 0, 1 i 2. ===== Przekierowania ===== Zgodne z POSIX-em powłoki potrafią zastąpić standardowe strumienie wskazanymi przez użytkownika. ==== Często używane przekierowania ==== === Przekierowanie wyjścia === ''komenda **>** nazwa_pliku'' - otwiera plik //nazwa_pliku// do zapisu, - ucina plik (= ustawia rozmiar pliku na 0, zawartość pliku jest tracona), - zastępuje standardowe wyjście plikiem. ''komenda **2>** nazwa_pliku'' - otwiera plik //nazwa_pliku// do zapisu, - ucina plik (= ustawia rozmiar pliku na 0, zawartość pliku jest tracona), - zastępuje standardowy błąd plikiem. ''komenda **&>** nazwa_pliku'' <small> Uwaga: to jest rozszerzenie powłoki Bash</small> - otwiera plik //nazwa_pliku// do zapisu, - ucina plik (= ustawia rozmiar pliku na 0, zawartość pliku jest tracona), - zastępuje standardowe wyjście i standardowy błąd plikiem. ''komenda **>>** nazwa_pliku'' - otwiera plik //nazwa_pliku// w trybie dopisywania (tzn. tryb zapisu w którym pozycja ustawiona jest na koniec pliku), - zastępuje standardowe wyjście plikiem. **''/dev/null''** jest urządzeniem które zaakceptuje każdy zapis i zignoruje przekazane dane ("czarna dziura"). ++++ Przykłady | {{page>so:redirects:out&inline}} ++++ ~~Zadanie.#~~ Komenda ''date'' wypisuje bieżącą datę. Przekieruj jej wynik do pliku. ~~Zadanie.#~~ Dodaj kolejną datę do pliku z poprzedniego zadania. ~~Zadanie.#~~ Wykonaj komendę ''cat /etc/motd /etc/shadow''. Przekieruj jej standardowy błąd do pliku. <small> ~~Zadanie.#~~ Wykonaj ''find /var/spool/'' (polecenie ''find'' będzie omawiane później). Przekieruj standardowy błąd do pliku ''/dev/null''. </small> ~~Zadanie.#~~ Przekieruj standardowe wyjście komendy ''find /var/spool/'' do jednego pliku, a standardowy błąd do innego. <small> ~~Zadanie.#~~ Przekieruj standardowe wyjście i standardowy błąd komendy ''find /var/spool/'' do tego samego pliku. </small> === Input redirections === ''komenda < nazwa_pliku'' - otwiera plik //nazwa_pliku// do odczytu, - zastępuje standardowe wejście plikiem. ''komenda << ogranicznik'' (here document) - przed uruchomieniem //komenda//, powłoka tworzy tymczasowy plik, - powłoka czyta dane ze swojego standardowego wejścia linia po linii i wpisuje te linie do tymczasowego pliku, - do momentu aż linia będzie składać się tylko z //ogranicznik//a, - otwiera tymczasowy plik do odczytu, - zastępuje standardowe wejście plikiem. ''komenda <<< tekst'' (here string) <small> Uwaga: to jest rozszerzenie powłoki Bash</small> - tworzy tymczasowy plik wpisując do niego //tekst// i znak nowej linii, - otwiera tymczasowy plik do odczytu, - zastępuje standardowe wejście plikiem. ++++ Przykłady | {{page>so:redirects:in&inline}} ++++ ~~Zadanie.#~~ Stwórz plik zawierający ''<nowiki>print("hello " + __file__)</nowiki>''. Uruchom komendę ''python'', kolejno: podając plik jako argument, i przekierowując plik jako standardowe wejście. ~~Zadanie.#~~ Użyj programu ''hexdump -C'' do wyświetlenia dowolnego tekstu wpisanego jako //here document//. \\ Użyj w tekście wielobajtowego znaku <small>(np. ''<nowiki>'Witaj świecie!'</nowiki>'' zawiera dwubajtowy znak ''ś'')</small>. ~~Zadanie.#~~ ''bc'' jest prostym kalkulatorem. Użyj go żeby policzyć ''sqrt(2.0000)''. \\ Potem policz ''sqrt(2.0000)'' w nieinteraktywnym trybie. ~~Zadanie.#~~ Użyj ''bc'' do policzenia ''sqrt(2.0000)'' w nieinteraktywnym trybie i przekieruj wynik do pliku. ==== Szczegóły ==== [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07|Rozdział o przekierowaniach w standardzie POSIX]] \\ [[https://www.gnu.org/software/bash/manual/html_node/Redirections.html|Dokumentacja Basha o przekierowaniach]] Każde przekierowanie ma postać: **''[//deskryptor_pliku//]//operator// //słowo//''** **Domyślny //deskryptor_pliku// to 0 jeśli //operator// zawiera ''<'' albo 1 w przeciwnym wypadku** \\ Czyli: ''komenda < plik'' jest identyczna z ''komenda 0< plik'', a ''komenda >> plik'' jest identyczna z ''komenda 1>> plik''. \\ Standard POSIX wymaga by deskryptory od 0 do 9 były do dyspozycji użytkownika. To jak można wykorzystywać inne numery zależy od użytej powłoki. Dostępne //operator//y to: | ''<'' | otwiera plik //słowo// do odczytu i zastępuje //deskryptor_pliku// nowo otwartym| | ''>'' | wyświetla błąd jeśli plik //słowo// istnieje i opcja "noclobber" jest ustawiona((Opcja "noclobber" jest domyślnie wyłączona; można ją włączyć komendą ''set -C''.)),\\ otwiera plik //słowo// do zapisu, ucina go i zastępuje //deskryptor_pliku// nowo otwartym plikiem | | ''>|'' | otwiera plik //słowo// do zapisu, ucina go i zastępuje //deskryptor_pliku// nowo otwartym plikiem \\ (niezależnie czy plik //słowo// istnieje) | | ''>>'' | otwiera plik //słowo// do dopisywania i zastępuje //deskryptor_pliku// nowo otwartym | | ''<>'' | otwiera plik //słowo// do odczytu i zapisu, oraz zastępuje //deskryptor_pliku// nowo otwartym | | ''<<'' | 1) tworzy tymczasowy plik \\ 2) czyta linię ze standardowego wejścia\\ 3) jeśli cała linia to dokładnie //słowo//, idź do 6 \\ 4) jeśli w //słowie// nie ma cudzysłowów (pary ''"'' lub <html><code>'</code></html>), wykonuje podstawienia((Np. pod ''$VAR'' podstawia wartość zmiennej ''VAR'', ''`date`'' jest zastąpione wynikiem komendy ''date'' etc.)) w linii \\ 5) pisze linię do pliku tymczasowego \\ 6) otwiera plik tymczasowy do odczytu \\ 7) zastępuje //deskryptor_pliku// nowo otwartym \\ 8) uruchamia komendę | | ''<<-''| działa jak ''<<'', ale po kroku 2 dodaje jeszcze krok: \\ 2a) usuwa wszystkie początkowe tabulatory (''\t'') \\ uwaga: spacje nie są usuwane| | ''<<<''| Uwaga: to jest rozszerzenie powłoki Bash \\ 1) tworzy tymczasowy plik \\ 2) pisze //słowo// do pliku tymczasowego \\ 3) pisze znak nowego wiersza do pliku tymczasowego \\ 4) otwiera plik tymczasowy do odczytu \\ 5) zastępuje //deskryptor_pliku// nowo otwartym \\ 6) uruchamia komendę | | ''<&'' | jeśli //słowo// jest deskryptorem pliku //p// otwartym w trybie pozwalającym na odczyt: duplikuje deskryptor //p// tak żeby zarówno //słowo// jak i //deskryptor_pliku// odnosiły się do tego samego \\ jeśli //słowo// jest ''-'': zamyka //deskryptor_pliku// | | ''>&'' | jeśli //słowo// jest deskryptorem pliku //p// otwartym w trybie pozwalającym na zapis: duplikuje deskryptor //p// tak żeby zarówno //słowo// jak i //deskryptor_pliku// odnosiły się do tego samego \\ jeśli //słowo// jest ''-'': zamyka //deskryptor_pliku// | | ''&>'' | Uwaga: to jest rozszerzenie powłoki Bash \\ Uwaga: ten operator nie pozwala podawać //deskryptora_pliku// (''&'' jest odczytywane jako deskryptor) \\ otwiera plik //słowo// do zapisu, ucina go, duplikuje go i zastępuje zarówno 1 jak i 2 nowo otwartym plikiem | | ''&>>''| Uwaga: to jest rozszerzenie powłoki Bash \\ Uwaga: ten operator nie pozwala podawać //deskryptora_pliku// (''&'' jest odczytywane jako deskryptor) \\ otwiera plik //słowo// do dopisywania, duplikuje go i zastępuje zarówno 1 jak i 2 nowo otwartym plikiem | ~~Zadanie.#~~ Uruchom ''cat /etc/motd'' z zamkniętym deskryptorem standardowego wyjścia. \\ Uruchom ''find /var/spool/'' z zamkniętym deskryptorem standardowego błędu. <small> ~~Zadanie.#~~ Przekieruj standardowe wyjście i standardowy błąd komendy ''cat /etc/motd /etc/shadow'' do jednego pliku bez użycia nieprzenośnej składni ''&>''. ~~Zadanie.#~~ Skopiuj duży plik tekstowy (np. ''/etc/services'') do pliku //p//. \\ Uruchom ''hexdump'' przekierowując wejście z pliku //p// używając operatora ''<>'', i zduplikuj standardowe wejście do standardowego wyjścia. Sprawdź co się stało. \\ Uwaga: nie używaj ''<>'' dwukrotnie z z tym samym plikiem dla standardowego wejścia i standardowego błędu (chyba że jesteś gotowy ponieść konsekwencje swojego czynu). </small> ~~Zadanie.#~~ Zamień miejscami standardowe wyjście i standardowy błąd komendy ''cat /etc/motd /etc/shadow''. \\ Sprawdź działanie dodając ''|rev'' na koniec (co odwróci kolejność znaków na standardowym wyjściu). === Przekierowania standardowych strumieni bieżącej powłoki === Wykonanie przekierowania na komendzie ''exec'' spowoduje przekierowanie standardowych strumieni bieżącej powłoki. <code bash> exec 3>&1 # duplikuje standardowe wyjście do deskryptora 3 exec 1>plik # zastępuje standardowe wyjście plikiem 'plik' date # wypisuje datę na standardowe wyjście (którym jest teraz 'plik') fortune # " fortunkę " exec 1>&3 3>&- # przywraca poprzednie wyjście (duplikując je z deskryptora 3) i zamyka 3 </code> === Process substitution (rozszerzenie Basha) === [[https://www.gnu.org/software/bash/manual/html_node/Process-Substitution.html|Dokumentacja Basha na temat process substitution]] Składnia ''komenda1 <(komenda2)'' i ''komenda1 >(komenda2)'' __nie__ są przekierowaniami. Bash zastępuje ''<(komenda)'' nazwą tymczasowego pliku (pipe), uruchamia w tle polecenie ''komenda'' ustawiając jego standardowe wyjście na plik tymczasowy. Bash zastępuje ''>(komenda)'' nazwą tymczasowego pliku (pipe), uruchamia w tle polecenie ''komenda'' ustawiając jego standardowe wejście na plik tymczasowy. ~~Zadanie.#~~ Wykonaj i zrozum wyniki poleceń: * przydatnych: * ''paste <(hostname) <(date +%Y.%m.%d) <(uptime)'' * ''cat /etc/motd /etc/shadow 2> >(rev) > >(hexdump -C)'' * prezentujących działanie process substitution: * ''/bin/ls -l >(echo a) >(echo b) <(echo c)'' * ''stat >(echo c)'' * ''stat >(sleep 3; fortune)'' * ''cat <(echo a)'' * ''echo 'abc' > >(rev)'' * ''cat <(date) > >(rev)'' * ''cat < <(date) > >(rev)'' * ''cat <(date) <(date) <(date) > >(rev)'' * ''cat <(date) <(date) < <(date) > >(rev)'' ===== Potoki ===== <small>Dla przypomnienia: standardowe funkcje I/O czytają ze standardowego wejścia, a piszą do standardowego wyjścia.</small> Uniksopodobne systemy przez długie lata((Od jakiegoś czasu wiele dystrybucji opiera się na programach które robią jak najwięcej się da i rozrosły się do tego stopnia że nikt już do końca nie panuje nad tym co i w jaki sposób robią (jak np. [[https://en.wikipedia.org/wiki/Systemd|systemd]]).)) trzymały się założenia, że każdy program ma [[https://en.wikipedia.org/wiki/Unix_philosophy|solidnie wykonywać jedno dobrze określone zadanie]]. \\ Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze rozwiązywalne przez takie proste programy. <small> Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu. - Wiesz że ''ps -ef'' wypisuje procesy, więc zapisujesz do pliku ich listę: ''ps -ef > ps_output''. - Potrzebujesz tylko pierwszej kolumny – nazwy użytkownia, \\ Żeby wyciąć tylko pierwszą (oddzielaną spacją) kolumnę, używasz komendy ''cut --delimiter ' ' --field 1 < ps_output > cut_output''. - Żeby skorzystać z programu który liczy powtarzające się linie, musisz mieć je obok siebie. \\ Więc komendą ''sort < cut_output > sort_output'' sortujesz plik. - Na końcu korzystasz z komendy ''uniq --count < sort_output'' która pomija powtarzające się linie i przed każdą linię wpisuje ile razy się powtórzyła. Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki ''ps_output'', ''cut_output'' i ''sort_output''. </small> W systemie UNIX wprowadzono możliwość połączenia standardowego wyjścia jednego programu ze standardowym wejściem innego programu. \\ <small>Zamiast wykonywać powyższe komendy, można uruchomić ''ps -ef | cut --delimiter ' ' --field 1 | sort | uniq --count'' które robi to samo bez tworzenia żadnych plików na dysku.</small> \\ Łączenie standardowego wyjścia jednego programu ze standardowym wejściem innego jest technicznie wykonywane za pomocą specjalnego rodzaju pliku nazwanego **potokiem** (//pipe//). Powłoka tworzy taki plik (w RAMie), zastępuje standardowe wyjście jednego programu tym plikiem oraz zastępuje standardowe wejście drugiego programu tym samym plikiem. Odczyt z potoku blokuje się do czasu aż pojawią się na nim dane lub aż wszyscy piszący do potoku go nie zamkną. **Składnia ''//cmd_a// | //cmd_b//'' łączy standardowe wyjście //cmd_a// ze standardowym wejściem //cmd_b//.** \\ Takie komendy są uruchamiane współbieżnie. \\ Po uruchomieniu potoku powłoka czeka na zakończenie wszystkich procesów w potoku((Inaczej niż przy process substitution, gdzie powłoka czeka tylko na wykonywaną komendę)). Programy trzymające się "filozofii UNIX'a" czytają z plików o ile podano je w argumentach __lub ze standardowego wejścia jeśli nie podano plików w argumentach__. Dodatkowo standardowe wejście jest używane ilekroć ''-'' pojawia się w kontekście nazwy pliku. Do wykonania ''//cmd_a// | //cmd_b//'' powłoka tworzy **potok nienazwany** (anonimowy). \\ Można stworzyć **potok nazwany** używając komendy ''**mkfifo** //nazwa_pliku//''. \\ Dane zapisane do potoków, zarówno nazwanego jak i anonimowego, są przechowywane w pamięci operacyjnej – nie są zapisywane na dysk. Odczytanie danych z potoku usuwa je z pamięci. Otwarcie potoku od odczytu domyślnie blokuję się aż inny proces otworzy potok do zapisu. ++++ Przykłady | {{page>so:redirects:pipes1&inline}} ++++ ~~Zadanie.#~~ Wykonaj ''echo '2+2*2'<nowiki></nowiki>''. Potem wynik tego polecenia przekaż przez potok do ''bc''. ~~Zadanie.#~~ Użyj ''echo'' do wyświetlenia jakiegoś teksu. Potem powtórz komendę przekazując jej wynik w potoku do ''xxd''. ~~Zadanie.#~~ Wypisz listę plików w katalogu domowym. \\ Powtórz komendę przekazując w potoku jej wyniki do programu ''cat''. \\ Dodaj na koniec poprzedniej komendy przekazanie jej wyniku do ''cat -n''. ~~Zadanie.#~~ Połącz w potok komendy ''ps -eF'' i ''fold'' ~~Zadanie.#~~ Stwórz nazwany potok //p//. Przekieruj wejście programu ''fold'' z //p// w jednym terminalu, a w drugim przekieruj wyjście ''ps -eF'' do //p//. Powtórz komendy wykonując ''ps'' przed ''fold''. ===== Edycja linii poleceń ===== Bash (i wiele innych programów) korzysta do odczytywania komend ze standardowego wejścia biblioteki [[https://en.wikipedia.org/wiki/GNU_Readline|readline]]. \\ Część programów z przyczyn licencyjnych wybiera do tego samego celu [[https://thrysoee.dk/editline/|libedit]]. Readline pozwala na wygodną edycję linii poleceń i tworzenie historii poleceń. Lista sensownych skrótów klawiszowych do edycji linii poleceń (nie uwzględniająca strzałek) jest tutaj: https://readline.kablamo.org/emacs.html \\ Pełna lista komend i przypisanych do nich skrótów jest w podręczniku systemowym \\ (''man readline'' i ''man bash''). \\ Konwencja zapisu skrótów klawiszowych to: * ''^//x//'' lub ''C-//x//'' to //Ctrl+x// (uwaga:''^//X//'' lub ''C-//X//'' to //Ctrl+Shift+x//), * ''M-//x//'' to zwykle //Alt-x// (patrz: https://en.wikipedia.org/wiki/Meta_key), * ''//a// //b//'' to wciśnięcie po skrócie //a// skrótu //b//. Bash domyślnie dopisuje historię wykonanych poleceń do pliku ''**~/.bash_history**'' w momencie wyjścia z powłoki. \\ Historię (tą z pliku połączoną z bieżącą) można wyświetlić komendą ''**history**''. (W ''man bash_builtins'' znajduje się opis przełączników.) <small> Do wygodnego przeglądania historii można też użyć programu [[https://dvorka.github.io/hstr/|hstr]] </small> ~~Zadanie.#~~ Jakim skrótem czyści się ekran? ~~Zadanie.#~~ Jakimi skrótami wyszukuje się wstecz w historii? ~~Zadanie.#~~ Jakim skrótem przesuwa się kursor o jedno słowo? <small> ~~Zadanie.#~~ Jakim złożeniem skrótów przesuwa się kursor o 5 słów? ~~Zadanie.#~~ Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii? ~~Zadanie.#~~ Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii? ~~Zadanie.#~~ Jakim skrótem zamienia się kolejnością to słowo z poprzednim? </small> ===== Edycja plików w konsoli ===== === vi i vim === ''vi'' jest często jedynym domyślnie instalowanym edytorem tekstowym. ''vim'' to ulepszona wersja ''vi''. Żeby nauczyć się ''vim'', uruchom ''vimtutor''. <small> ''vi'' jest wpisane w standard [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html|POSIX]]. \\ Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox. </small> ~~Zadanie.#~~ Przejdź całą pierwszą lekcję w ''vimtutor''. <small> ~~Zadanie.#~~ Przejdź pozostałe lekcje w ''vimtutor''. === nano === Nano jest stosunkowo prostym edytorem tekstowym. Podstawowe skróty są wyświetlone na dole ekranu. Więcej na: https://www.nano-editor.org/docs.php === Emacs === [[https://www.gnu.org/software/emacs/|Emacs]] jest [[https://en.wikipedia.org/wiki/Editor_war|odwiecznym rywalem]] ''vim''a w konkurencji programów do edytowania tekstu w konsoli. Po wpisaniu ''emacs'' możesz wybrać tutorial skrótem //Ctrl+h t//. === Inne === * [[https://joe-editor.sourceforge.io/joe]] * mcedit – edytor zintegrowany z [[https://en.wikipedia.org/wiki/Midnight_Commander|mc]] * [[https://micro-editor.github.io/|micro]] * [[https://neovim.io/|neovim]] * [[https://helix-editor.com/|hx]] </small> ~~META: language = pl ~~
so/redirects.1679911620.txt.gz
· ostatnio zmienione: 2023/03/27 12:07 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry