**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**
 
==== Sprawdzanie czym jest komenda / gdzie jest plik wykonywalny ==== * ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/type.html|type]]'' * ''[[https://en.wikipedia.org/wiki/Which_(command)|which]]'' * ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html|command -v]]'' oraz ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html|command -V]]'' ==== Rozwiązywanie ścieżek do bezwzględnych ==== * ''[[https://man7.org/linux/man-pages/man1/readlink.1.html|readlink -f]]'' * ''[[https://man7.org/linux/man-pages/man1/realpath.1.html|realpath]]'' # 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 ~~