Narzędzia użytkownika

Narzędzia witryny


Pasek boczny

so:redirects

To jest stara wersja strony!


Wyświetlanie linków / tekstu / sekwencji liczb

Wyświetlanie zawartości plików

cat [plik]... wyświetla podane pliki jeden po drugim (lub wyświetla dane przeczytane ze standardowego wejścia jeśli nie podano pliku).
Nazwa bierze się od operacji konkatenacji
Z przełącznikiem -n program cat numeruje linie, a z -v wyświetla bajty reprezentujące niedrukowalne znaki ASCII jako reprezentujący je tekst1).

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 plikach (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 pliki / wejście w tabelę.

od [-t x1] …, hexdump [-C] …, i xxd pokazują pliki binarnie.

Przykłady

Zadanie 1 Wyświetl plik używając cat. Wyświetl dwa pliki naraz używając cat.
(Jeśli nie masz pomysłu jakie pliki wyświetlić, użyj np. /etc/SUSE-brand i /etc/os-release)

Zadanie 2 Uruchom cat, wpisz dowolny tekst, potem naciśnij Enter i Ctrl+d.

Zadanie 3 Wyświetl plik /usr/share/doc/mpich/user.pdf zarówno z przełącznikiem -v jak i bez niego.

Zadanie 4 Użyj paste do połączenia pliku z samym sobą.

Zadanie 5 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 6 Wyświetl binarny plik (np. /usr/share/themes/Breeze/assets/line-h.png).

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

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

Przykłady

Zadanie 7 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'
Sekwencje sterujące ANSI są dobrze opisane tutaj

Zadanie 8 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

Zadanie 9 Wygeneruj sekwencję liczb od 1 do 15.

Zadanie 10 Wygeneruj sekwencję liczb od 64 do 1024 z krokiem co 64.

Standardowe strumienie

K&R C[1] [2]
printf("Wpisz swoje imię:\n")
scanf("%s", name);
Python
print("Wpisz swoje imię:")
name = input()

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 standardowymi strumieniami.)
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.

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ł 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

  1. otwiera plik nazwa_pliku do zapisu,
  2. ucina plik (= ustawia rozmiar pliku na 0, zawartość pliku jest tracona),
  3. zastępuje standardowe wyjście plikiem.

komenda 2> nazwa_pliku

  1. otwiera plik nazwa_pliku do zapisu,
  2. ucina plik (= ustawia rozmiar pliku na 0, zawartość pliku jest tracona),
  3. zastępuje standardowy błąd plikiem.

komenda &> nazwa_pliku      Uwaga: to jest rozszerzenie powłoki Bash

  1. otwiera plik nazwa_pliku do zapisu,
  2. ucina plik (= ustawia rozmiar pliku na 0, zawartość pliku jest tracona),
  3. zastępuje standardowe wyjście i standardowy błąd plikiem.

komenda >> nazwa_pliku

  1. otwiera plik nazwa_pliku w trybie dopisywania (tzn. tryb zapisu w którym pozycja ustawiona jest na koniec pliku),
  2. 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

Zadanie 11 Komenda date wypisuje bieżącą datę. Przekieruj jej wynik do pliku.

Zadanie 12 Dodaj kolejną datę do pliku z poprzedniego zadania.

Zadanie 13 Wykonaj komendę cat /etc/motd /etc/shadow. Przekieruj jej standardowy błąd do pliku.

Zadanie 14 Wykonaj find /var/spool/ (polecenie find będzie omawiane później). Przekieruj standardowy błąd do pliku /dev/null.

Zadanie 15 Przekieruj standardowe wyjście komendy find /var/spool/ do jednego pliku, a standardowy błąd do innego.

Zadanie 16 Przekieruj standardowe wyjście i standardowy błąd komendy find /var/spool/ do tego samego pliku.

Input redirections

komenda < nazwa_pliku

  1. otwiera plik nazwa_pliku do odczytu,
  2. zastępuje standardowe wejście plikiem.

komenda << ogranicznik      (here document)

  1. przed uruchomieniem komenda, powłoka tworzy tymczasowy plik,
  2. powłoka czyta dane ze swojego standardowego wejścia linia po linii i wpisuje te linie do tymczasowego pliku,
  3. do momentu aż linia będzie składać się tylko z ogranicznika,
  4. otwiera tymczasowy plik do odczytu,
  5. zastępuje standardowe wejście plikiem.

komenda <<< tekst      (here string) Uwaga: to jest rozszerzenie powłoki Bash

  1. tworzy tymczasowy plik wpisując do niego tekst i znak nowej linii,
  2. otwiera tymczasowy plik do odczytu,
  3. zastępuje standardowe wejście plikiem.

Przykłady

Zadanie 17 Stwórz plik zawierający print("hello " + __file__). Uruchom komendę python, kolejno: podając plik jako argument, i przekierowując plik jako standardowe wejście.

Zadanie 18 Użyj programu hexdump -C do wyświetlenia dowolnego tekstu wpisanego jako here document.
Użyj w tekście wielobajtowego znaku (np. 'Witaj świecie!' zawiera dwubajtowy znak ś).

Zadanie 19 bc jest prostym kalkulatorem. Użyj go żeby policzyć sqrt(2.0000).
Potem policz sqrt(2.0000) w nieinteraktywnym trybie.

Zadanie 20 Użyj bc do policzenia sqrt(2.0000) w nieinteraktywnym trybie i przekieruj wynik do pliku.

Szczegóły

Rozdział o przekierowaniach w standardzie POSIX
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 operatory 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 ustawiona2),
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 '), wykonuje podstawienia3) 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 21 Uruchom cat /etc/motd z zamkniętym deskryptorem standardowego wyjścia.
Uruchom find /var/spool/ z zamkniętym deskryptorem standardowego błędu.

Zadanie 22 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 23 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).

Zadanie 24 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.

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

Process substitution (rozszerzenie Basha)

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 25 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

Dla przypomnienia: standardowe funkcje I/O czytają ze standardowego wejścia, a piszą do standardowego wyjścia.

Uniksopodobne systemy przez długie lata4) trzymały się założenia, że każdy program ma solidnie wykonywać jedno dobrze określone zadanie.
Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze rozwiązywalne przez takie proste programy.

Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu.

  1. Wiesz że ps -ef wypisuje procesy, więc zapisujesz do pliku ich listę: ps -ef > ps_output.
  2. 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.
  3. Ż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.
  4. 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.

W systemie UNIX wprowadzono możliwość połączenia standardowego wyjścia jednego programu ze standardowym wejściem innego programu.
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.
Łą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 potoku5).

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

Zadanie 26 Wykonaj echo '2+2*2'. Potem wynik tego polecenia przekaż przez potok do bc.

Zadanie 27 Użyj echo do wyświetlenia jakiegoś teksu. Potem powtórz komendę przekazując jej wynik w potoku do xxd.

Zadanie 28 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 29 Połącz w potok komendy ps -eF i fold

Zadanie 30 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 readline.
Część programów z przyczyn licencyjnych wybiera do tego samego celu 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:

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

Do wygodnego przeglądania historii można też użyć programu hstr

Zadanie 31 Jakim skrótem czyści się ekran?

Zadanie 32 Jakimi skrótami wyszukuje się wstecz w historii?

Zadanie 33 Jakim skrótem przesuwa się kursor o jedno słowo?

Zadanie 34 Jakim złożeniem skrótów przesuwa się kursor o 5 słów?

Zadanie 35 Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii?

Zadanie 36 Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii?

Zadanie 37 Jakim skrótem zamienia się kolejnością to słowo z poprzednim?

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.

vi jest wpisane w standard POSIX.
Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox.

Zadanie 38 Przejdź całą pierwszą lekcję w vimtutor.

Zadanie 39 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

Emacs jest odwiecznym rywalem vima w konkurencji programów do edytowania tekstu w konsoli.

Po wpisaniu emacs możesz wybrać tutorial skrótem Ctrl+h t.

Inne

1) 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
2) Opcja "noclobber" jest domyślnie wyłączona; można ją włączyć komendą set -C.
3) Np. pod $VAR podstawia wartość zmiennej VAR, `date` jest zastąpione wynikiem komendy date etc.
4) 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. systemd).
5) Inaczej niż przy process substitution, gdzie powłoka czeka tylko na wykonywaną komendę
so/redirects.1679910555.txt.gz · ostatnio zmienione: 2023/03/27 11:49 przez jkonczak