**Te materiały mają pokazać przykładowe narzędzia często używane do ułatwienia pracy z powłoką, często używane w skryptach, i realizujące często potrzebne funkcje.** **Wybór kategorii narzędzi i rodzajów narzędzie jest mocno subiektywny**
# Bezwzględna ścieżka do katalogu w którym jest skrypt:
SCRIPTDIR=$(dirname "$(realpath "$0")")
==== Zamki (muteksy) w shellu ====
W Linuksie jest mechanizm [[https://en.wikipedia.org/wiki/File_locking#In_Unix-like_systems|zamków na plikach]]. Użycie zamków jest dobrowolne – jeżeli program nie zażąda zamku na
pliku, to dostanie dostęp do pliku niezależnie od tego czy zamek jest dostępny
czy zajęty.\\
Z powłoki można zakładać zamki (readers-writers lock) na czas wykonania podanego
polecania programem ''[[https://man7.org/linux/man-pages/man1/flock.1.html|flock]]''.
==== Tworzenie tymczasowych plików ====
Program ''[[https://man7.org/linux/man-pages/man1/mktemp.1.html|mktemp]]'' pozwala tworzy nowy tymczasowy plik. Można podać katalog w jakim ma być stworzony ten plik (''-p''), zażądań tworzenia katalogu zamiast pliku (''-d'') i podać szablon nazwy pliku. Ścieżka do nowo stworzonego pliku jest wypisywana na standardowe wyjście.
MYPROG_TMPFILE="$(mktemp -p /home/student "myProg_XXXXX.tmp")"
==== ulimit ====
Polecenie ''[[https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html#index-ulimit|ulimit]]'' pozwala ustawiać limity na np. ilość otwartych plików, ilość użytej
pamięci operacyjnej, zużyty czas procesora przez bieżącą powłokę i wszystkie jej
procesy potomne.
\\
Polecenie ''ulimit -a'' wyświetli bieżące wartości limitów z opisem czego dotyczą.
==== Multipleksery terminala ====
[[https://en.wikipedia.org/wiki/Terminal_multiplexer|Multipleksery terminala]]
pozwalają m. inn. na:
* uruchomienie powłoki, odłączanie się od niej i ponowne dołączanie do niej (sesje)
* uruchomienie wielu powłok w jednej sesji i przełączanie się między nimi
* dzielenie ekrany na kilka obszarów i uruchomienie w każdym powłoki
Multipleksery terminala są standardowym narzędziem przy pracy ze zdalnymi
maszynami. Przykładowe popularne:
* [[https://en.wikipedia.org/wiki/GNU_Screen|screen]]
* [[https://github.com/tmux/tmux/wiki/Getting-Started|tmux]]
Skrócona instrukcja obsługi [[https://www.cs.put.poznan.pl/jkonczak/sk1:ssh_screen_tmux#gnu_screen|tutaj]].
==== mc ====
[[https://pl.wikipedia.org/wiki/Midnight_Commander|Midnight Commander]],
uruchamiany poleceniem ''mc'', jest menadżerem plików z tekstowym interfejsem
użytkownika.
==== Porównywanie plików ====
* ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/cmp.html|cmp]]'' zwraca czy pliki są identyczne
* ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/diff.html|diff]]'' pokazuje różnice między plikami lub rekurencyjnie między pliki w katalogach
* ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/comm.html|comm]]'' dla odpowiednio posortowanych plików pokazuje linie które są tylko w pierwszym w obu i tylko w drugim pliku
* ''[[https://www.cjmweb.net/vbindiff/|vbindiff]]'' i ''[[https://www.dettus.net/dhex/|dhex]]'' porównują pliki binarne
==== Patch ====
Program ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/patch.html|patch]]''
nakłada wynik programu ''diff''. \\
Np: ''diff -u //oryginał// //poprawiony_plik// > //łatka//'' wyprodukuje łatkę,
a komenda (wykonana np. na innym komputerze) ''patch < //łatka//'' wprowadzi
zmiany wskazane w pliku //łatka// do pliku //oryginał//.
Do generowania i aplikowania różnic plików binarnych służą inne narzędzia, np. ''[[https://en.wikipedia.org/wiki/Xdelta|xdelta]]''.
==== Identyfikacja i metadane plików ====
Program ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/file.html|file]]''
na podstawie treści pliku określa rodzaj pliku ( np.
"''PDF document, version 1.7, 172 pages''",
"''PNG image data, 600 x 688, 8-bit/color RGBA, non-interlaced''",
"''C source, ASCII text''").
\\ ''file -i'' określa typ MIME i kodowanie znaków
Program ''[[https://exiftool.org/#supported|exiftool]]'' odczytuje metadane
plików; uwaga: nazwa jest myląca – narzędzie obsługuje wiele formatów plików
niebędących obrazami, np. PDF, mp3, pliki pakietu Microsoft Office.
\\
Dla niektórych formatów potrafi zmieniać metadane.
==== Użycie miejsca na dysku ====
* ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/df.html|df]] [-h]'' wyświetla zajętość dysków
* ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/du.html|du]] [-h] [-s] [-x]'' podaje rozmiar plików i (rekurencyjnie) sumę rozmiarów plików w katalogu
* ''[[https://en.wikipedia.org/wiki/Ncdu|ncdu]] [-x]'' odpala wygodny tekstowy interfejs z wynikami podobnymi jak ''du''
* ''[[https://man7.org/linux/man-pages/man1/quota.1.html|quota]]'' wyświetla limity użycia dysków; np: \\ ''%%LANG= quota -pws | tail -n+2 | column -to' | '%%''
Uwaga: narzędzia liczące rozmiar katalogu różnie rozwiązują problem zwykłych
dowiązań i kompresji systemów plików.
==== Kompresja plików ====
Do kompresji służą między innymi programy (i pojawiają się wciąż nowe): ''gzip'',
''bzip2'', ''xz'', ''zstd'', ...
\\
Standardowo przełącznik ''-d'' dekompresuje a ''-k'' zachowuje oryginał.
Zwyczajowo z programami kompresującymi są instalowane wersje programu ''cat'',
''grep'', ''less'', ''diff'' które potrafią działać na skompresowanych
plikach, np: ''zcat'', ''zgrep'', ''zless'', ''zdiff'' (gzip), ''bz…'' (bzip2),
''xz…''(xz), ''zstd…'' (zstd).
==== Pakowanie plików do archiwum ====
W systemach uniksopodobnych zwykle inny program zajmuje się kompresją, a inny
tworzeniem archiwum.
\\
Do archiwów (plików zawierającego inne pliki) jest używany powstały w latach
70tych program i format ''[[https://pl.wikipedia.org/wiki/Tar_(informatyka)|tar]]''
(i czasami, choć rzadko, powstały jeszcze wcześniej
''[[https://pl.wikipedia.org/wiki/Cpio|cpio]]'').
Program ''tar'' pozwala, przy użyciu dodatkowych przełączników, automatycznie
skompresować stworzone archiwum wykorzystując wskazany przełącznikiem program
do kompresji.
Przykłady użycia komendy ''tar''((Ze składnią opcji w stylu BSD)):
* ''tar cf //nazwa_archiwum//.tar [//lista_plików//]...'' tworzy archiwum __bez__ kompresji
* ''tar czf …'' / ''tar cjf …'' / ''tar cJf …'' / ''tar cf //nazwa// --zstd …'' tworzy archiwum i używa gzip/bzip2/xz/zstd do kompresji stworzonego archiwum
* ''tar caf //nazwa//.tar.//rozszerzenie// …'' tworzy archiwum i zgaduje jak skompresować archiwum po rozszerzeniu
* ''tar tf //nazwa//'' testuje (listuje) pliki w archiwum, automatycznie wykrywa kompresję; \\ ''tar tvf …'' dodaje szczegółowe informacje
* ''tar xf //nazwa//'' wypakowuje pliki z archiwum, automatycznie wykrywa kompresję
Standard POSIX definiuje format i program ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html|pax]]'', który jednak nie zdobył popularności.
==== Konwersja kodowania plików tekstowych ====
Program ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/iconv.html|iconv]]''
pozwala zmienić kodowania plików, np.
''iconv -f cp1250 -t utf-8 [//plik_źródłowy//] [-o //plik_docelowy//]''
zmieni plik źródłowy korzystający ze starej strony kodowej MS Windows dla Europy
Środkowej do kodowania UTF-8.
Programy ''dos2unix'', ''unix2dos'', ''mac2unix'', ''unix2mac'' zmieniają znaki
końca linii między ''\r\n'' (dos=Windows), ''\n'' (unix) i ''\r'' (mac=starożytne Mac OS).
==== Konwersja obrazów / dźwięku / wideo ====
[[https://imagemagick.org|ImageMagick]] jest powszechnie dostępnym zbiorem narzędzi do
konwersji, prostej wsadowej przeróbki i łączenia obrazów. Składa się m. inn. z
narzędzia ''convert'' (''magick''), ''montage'' oraz ''identify''.
\\
Najprostsza przykładowa komenda przerabiająca png na jpg: ''convert x.png x.jpg''
''[[https://ffmpeg.org|ffmpeg]]'' jest jednym z częściej używanych narzędzi do konwersji
plików audio/wideo.
\\
Najprostsza przykładowa komenda przerabiająca mp4 na webm: ''ffmpeg -i x.mp4 x.webm''.
==== Wyświetlanie "grafiki" w konsoli ====
Poza możliwością przerobienia obrazu na tekst ([[https://pl.wikipedia.org/wiki/AAlib|aalib]]
i [[http://caca.zoy.org/wiki/libcaca|libcaca]]), [[https://arewesixelyet.com|niektóre]]
emulatory terminala pozwalają rysować pojedyncze piksele używając odpowiednich
sekwencji znaków ([[https://en.wikipedia.org/wiki/Sixel|sixel]]).
Pozwala to np. na wykonanie komendy ''convert x.jpg sixel:-'' która wstawi w
konsolę obraz lub ''mpv --vo=sixel --ao=null --quiet x.mp4'' która odtworzy
w konsoli wideo.
Taka możliwość jest czasami przydatna przy pracy z plikami na zdalnej maszynie.
==== Pobieranie plików z Internetu ====
Programy ''[[https://en.wikipedia.org/wiki/Wget|wget]]''
i ''[[https://en.wikipedia.org/wiki/CURL|curl]]'' są popularnymi narzędziami
do m. inn. pobierania wskazanych adresów URL.
\\
''wget'' domyślnie zapisuje ściągnięte dane do pliku i wyświetla postęp
pobierania, ''curl'' domyślnie pobrane dane wypisuje na standardowe
wyjście. Działanie obu programów jest wysoce konfigurowalne opcjami.
Program ''[[https://en.wikipedia.org/wiki/Youtube-dl|yt-dlp]]'' jest
uzupełnieniem dla powyższych programów pozwalając pobierać strumieniowane
audio / wideo.
==== Obsługa standardowych formatów plików tekstowych ====
Dla plików w typowych formatach (json, yaml, xml, html, …) dostępnych jest
wiele narzędzi konsolowych, przez narzędzia porządkujące plik i sprawdzające
jego poprawność (np. ''[[https://html-tidy.org|tidy]]''),
pozwalające ponadto wykonywać proste selekcje z pliku (np.
''[[https://gnome.pages.gitlab.gnome.org/libxml2/xmllint.html|xmllint]]''),
aż po zaawansowane przetwarzanie takich plików (np.
''[[https://en.wikipedia.org/wiki/Jq_(programming_language)|jq]]'').
==== "Nagrywanie" terminala ====
Do zapisu wszystkich działań w terminalu do pliku może posłużyć program
''[[https://en.wikipedia.org/wiki/Script_(Unix)|script]]'' bądź jego
następcy – ''[[https://en.wikipedia.org/wiki/Ttyrec|ttyrec]]'' lub bazujący
na technologiach webowych do odtwarzania ''[[https://asciinema.org|asciinema]]''.
Do tworzenia kodu html tekstu wyświetlanego na terminalu na tej stronie
wykorzystywany był najpierw ''tmux'' z dodaną komendą wzorowaną na hardcopy ze
screen (tylko z zachowaniem kolorów):
''bind H capture-pane -e \; save-buffer ~/tmux.hardcopy \; delete-buffer''
oraz narzędzie ''[[http://www.andre-simon.de/doku/ansifilter/en/ansifilter.php|ansifilter]]''
z przełącznikami ''-fH'' wypluwające gotowy kod html z takiego hardcopy.
==== OpenSSL ====
OpenSSL (i jego forki) udostępniają konsolową komendę ''[[https://wiki.openssl.org/index.php/Command_Line_Utilities|openssl]]'' pozwalającą wykonywać wiele operacji związanych z szeroko pojętą kryptografią – szyfrować dane, generować klucze, wyświetlać informacje o certyfikatach, liczyć sumy kontrolne, szukać liczb pierwszych, generować liczby losowe, etc.
Programy ''md5sum'', ''shasum'', ''sha1sum'', ''sha256sum'', ''sha512sum'' itp. liczą sumy kontrolne.
\\
Program ''mkpasswd'' przerabia hasło na jego solony skrót.
~~META:
language = pl
~~