Potega konsoli
środa, 8 marzec 2006, w kategoriach: Linux
Jak już wspominałem pare razy, to, co najbardziej pociąga mnie w Linuxie i w systemach Unixowych wogóle, to rzeczy najbardziej niepozorne, o których rzadko pisują rozmaite popularne serwisy (te wolą zamieszać “screeny dystrybucji”) i które na pierwszy rzut oka są często dziwne i toporne, a kryją w sobie duża moc.
Jedną z takich rzeczy jest właśnie mityczna wręcz “konsola”. To ona najczęściej kojarzy się użytkownikom systemów MS z Linuxem, to ona nadaje Linuxowi ten “h4×0rski” smaczek itp. itd. Ale wiersz poleceń, z całym bogactwem rozmaitych aplikacji wchodzących niejako w jego skład, stanowi nie tylko zabawke dla nastolatków (to ja), ale też bardzo potężne narzędzie, które może być wykorzystane dla ułatwienia sobie życia na wiele sposobów.
Podstawą wiersza poleceń jest powłoka (shell). Jest to program decydujący w jaki sposób interpretowane będą polecenia przez nas wydawane, pośrednik pomiędzy nami, użytkownikami, a systemem. Będziemy tu mówić o powłoce zsh, z prostej przyczyny - na dziś dzień, mimo pewnych wad, jest ona po prostu najpotężniejsza, najbogatsza w funkcje. Jednak aby część poleceń przedstawionych dalej działała, trzeba zsh skonfigurować - dlatego na końcu zamieszczam załącznik z moimi plikiem .zshrc, niezbyt co prawda dopieszczonym, ale można sobie przekleić co trzeba i popróbować jak to wszystko działa.
No więc, co takiego ciekawego możemy zrobić w konsoli?
Załóżmy, że mamy 100 obrazków, nazwanych w konwencji 01_jakis_plik.png, które chcemy skonwertować na jpg, zmieniając nazwy na 01 Jakis Plik.jpg. W tradycyjny sposób wymagałoby to użycia prawdopodobnie conajmniej dwóch różnych programów, klikania, cudowania, zajęłoby to troche czasu. Tym czasem używając standardowych linuxowych narzędzi - zsh i programu “convert” z pakietu ImageMagick załatwimy to paroma poleceniami w kilka sekund:
Przechodzimy do katalogu ze zdjęciami:
cd ~/graphics/photos/costam
Robimy katalog na wynikowe jpg’i:
mkdir jpg/
Konwertujemy pliki na .jpg:
for i in *.png; convert $i jpg/$i:r.jpg;
Linia “for i in *.png”, to znana z języków programowania pętla for, w tym przypadku zmienna $i będzie przybierać po kolei wartość każdej z nazw plików wskazanych przez polecenie “ls *.jpg”. W następnym poleceniu, po średniku, konwertujemy każdy z tych plików, przy generowaniu nazwy pliku wyjściowego korzystając z modyfikatora “:r” obierającego zmienną z nazwą pliku z jego roszerzenia.
Na koniec jeszcze tylko zmieniamy nazwy:
zmv 'jpg/(??)_(*).jpg' 'jpg/$1 ${(C)2:gs/_/ }.jpg'
I już, gotowe. Na początku może się to wszystko wydawać odrobinę “magiczne”, ale po odrobinie zabawy można się nauczyć co i jak działa, a zainwestowany w to czas zwróci się w przyszłości z nawiązką. Polecenie zmv jako argument bierze dwa wzroce, w notacji powiedzmy “regexpowej”. Czyli to ‘jpg/(??)_(*).jpg’ dzieli pierwotną nazwę pliku na dwie grupy - dwa znaki przed pierwszym wystąpieniem znaku “_”, i dowolną ilość znaków przed “.jpg”. Następnie generujemy nazwę wynikową - najpierw odwołujemy się do pierwszej wydzielonej przed chwilą grupy za pomocą “$1″, a następnie wstawiamy grupę drugą z tymże po pierwsze zamieniając pierwsze litery wyrazów na duże za pomocą “(C)” i dokonując zamiany wszystkich podkreśleń na spacje z użyciem “:gs/_/ “.
A teraz spróbujmy wykonać bardziej żartobliwe zadanie - postaramy się wyświetlić wystąpienia słoa a fuck w kodzie źródłowym jądra linuxa, wraz z nazwą pliku w którym słowo to wystąpiło oraz wycinkiem kodu z daną “sprośną” linią. Można to zrobić na wiele różnych sposobów, my użyjemy faktu, że w zsh “**/**” zwraca rekursywną listę wszystkich plików w danym katalogu. Tak więc sprawę załatwia jedna linia:
echo **/** | xargs grep -A2 -B2 'fuck'
Samo “echo **/**” wyświetla poprostu listę wszystkich plików w danym katalogu. Następnie robimy “rurke” za pomocą “|”. Rurki służą do łączenia poleceń np. używania wyjścia jednego polecenia, jako wejścia drugiego, tak jak w tym przypadku. “xargs” sprawia, że każda ścieżka do pliku znaleziona przez “find”, zostaje dołączona jako ostatni argument do polecenia “grep -A2 -B2 ‘fuck’”, które to polecenie wyszukuje wystąpienia słowa fuck, pokazując linię z tym wystąpieniem, oraz 2 poprzednie i 2 następne. Swoją drogą, chłopaki mają poczucie humoru :>
Kolejnym potężnym narzędziem w pracy z terminalem jest GNU Screen. Zdumiewające, jak wielu ludzi daję się nabierać na instalowanie rozmaitych graficznych “multi-terminali”, nie mając pojęcia że ten sam efekt daje się osiągnąć łatwiej i lepiej za pomocą wydawałoby się starego i znanego narzędzia. Program ten jest właśnie “multiplekserem” terminala, czyli pozwala nam na otworzenie kilku sesji w jednym oknie xterma czy czego tam, podzielenie okna na części i w każdej z nich otwarcie innej sesji itp. Można także “odczepić” sesje, co sprawi że będzie ona aktywna nawet wtedy, kiedy np. zamkniemy okno xterma z uruchomioną w nim kompilacją. W każdej chwili można potem do niej wrócić za pomocą polecenia “screen -R”.
Codzienną pracę ułatwiaja też bogaty asortyment sztuczek np. cd ~-0, cd ~-1 itp. cofa nas do katalogów w którym byliśmy poprzednio, na kształt przycisku “wstecz” w przeglądarce www. Możemy też powtórzyć poprzednie polecenie, zastępując jedno słowo innym np. gdybyśmy po wykonaniu poprzedniego przykładu zechcieli poszukać wystąpień słowa shit możemy napisać po prostu “^fuck^shit” co spowoduje wykonanie polecenia “grep -A2 -B2 ’shit’”.
Warto też podefiniować sobie funkcje i aliasy dla najczęściej używanych poleceń. Np. dzięki takiemu czemuś w moim .zshrc:
function e()
{
myemacs $1 &
}
Kiedy chcę otworzyć jakiś plik w już istniejącym oknie emacsa wystarczy że napiszę “e plik.txt”. Użyłem funkcji, a nie aliasów, bo po nazwie pliku chcę umieścić jeszcze “&”, oznaczające że polecenie ma być wykonane w tle. Ale już żeby pisać “w” zamiast “wget” wystarczy:
alias w="wget"
W zsh możemy też definiować “globalne” aliasy, które zostają zamienione nawet jeśli nie występują na początku wiersza, który uruchamiamy. Lepiej zresztą zilustruje to przykład:
alias -g gr="| grep"
I już możemy pisać:
cat cos gr "cosik"
Żeby znaleźć wystąpienia słowa “cosik” w pliku “cos”.
Pisania oszczędza nam też najbardziej znana funkcja zsh - dopełnianie składni dla olbrzymiej ilości programów. Np. kompilując program, piszę:
./configure --
Wciskam TAB i oczom moim ukazuję się menu wszystkich opcji ./configure jakie dany program obsługuję. W standardowej dystrybucji zsh znajdziemy takie inteligentne dopełnianie dla prawie wszystkich programów, wystarczy tylko je skonfiguować.
Ba, odpowiednie opcje zapewnią nie tylko dopełnianie, ale nawet korektę błędów ortograficznych. Jeśli napiszemy “sl” zamiast “ls”, zsh zapyta nas, czy czasem się nie pomylilśmy.
No, to by było na tyle. Z notki wyszedł właściwie całkiem spory artykuł, a ledwo co poruszyliśmy temat. Zachęcam do dalszych samodzielnych poszukiwań - szczególnie czytania manuali od narzędzi o których wspomniałem i nauki wyrażeń regularnych, które ratują skóre w nieskończonej ilości sytuacji…
Linki:
http://www.rayninfo.co.uk/tips/zshtips.html - Najlepsze tricki zsh
http://grml.org/zsh/zsh-lovers.html - Inne, też najlepsze tricki zsh :D
http://www.ugu.com/sui/ugu/show?I=tip.today - GIGANTYCZNE archiwum Unixowych sztuczek
http://zshwiki.org/ - Wiki Zsh
http://zsh.sunsite.dk/Guide/ - Bardzo dobry manual Zsh

Komentarze (RSS):
sztywny, 8 marzec 2006, 6:03 pm
Szymon: Dobry comeback, nie jest zły :> Może nawet przedłoże tu niedługo jakieś dość bliskie Ci treści…
radziel: Witamy w naszych szeregach.