Z-Shell: Powłoka dla (inter)aktywnych 18


Kiedy zaczynałem moją przygodę z Linuksem, w jakiejś książce przeczytałem, że jest to system tak elastyczny, że pozwala na zmianę powłoki! Co z tego? – pomyślałem wtedy – przecież w konsoli wpisuje się tylko polecenia i patrzy, jakie wyniki wypisują się na ekranie. Przez długi czas używałem standardowej, chyba we wszystkich dystrybucjach, powłoki bash. Każdy, kto długo pracuje w konsoli, staje się coraz bardziej leniwy i lenistwo zmusza go do wymyślania kolejnych udogodnień. Jednak program, którego używamy sprawia, że pewnych udogodnień wprowadzić nie można, dlatego postanowiłem zmienić powłokę na zsh. Jest ona tak elastyczna i posiada tyle opcji, że rozszerzanie jej możliwości jest niemal nieograniczone.

Niniejszy poradnik jest przeznaczony dla osób, które dużo czasu pracują w konsoli i które chcą usprawnić tą pracę. Ma on też na celu ułatwić rozpoczęcie pracy z zsh początkującym użytkownikom i pomóc we wstępnym skonfigurowaniu tej powłoki.

Pierwszy kontakt z zsh

Ilość opcji, jakie oferuje powłoka zsh jest przytłaczająca, jednak zestaw opcji domyślnych nie zadowoli żadnego użytkownika. Zsh nie jest też dostarczane standardowo w żadnej dystrybucji, dlatego trzeba poświęcić trochę czasu na początkową konfigurację. Jeśli użytkownik miałby przeczytać tony dokumentacji w celu początkowego ustawienia powłoki, to szybko by się zniechęcił, dlatego podczas pierwszego uruchomienia powłoki, jeśli w naszym katalogu domowym nie ma pliku .zshrc, to program zsh uruchomi dla nas narzędzie zsh-new-user-install, które pozwoli na wstępne dostosowanie powłoki do naszych potrzeb. Program jest prosty w obsłudze. Na każdym kroku podpowiada, co mamy zrobić, prosząc o wciśnięcie odpowiednich klawiszy. Nie będę tu opisywał sposobu konfiguracji zsh przez ten program, bo zajęłoby mi to cały poradnik, zamiast tego powiem, że można go wykonać później, wpisując w zsh następujące komendy:
autoload -U zsh-newuser-install
zsh-newuser-install -f
Jeśli posiadamy rozbudowany plik ~/.zshrc, to warto wcześniej zrobić jego kopię zapasową, bo program ten go nadpisuje.

Osoby słabo znające język angielski mogą mieć problemy z konfiguracją programu w ten sposób. Zalecam im instalację pakietu zsh-lovers. Zawiera on przykładowe pliki konfiguracyjne miłośników tej powłoki. Na pewno znajdzie się tam konfiguracja umożliwiająca wygodną pracę z z wierszem poleceń.

Autouzupełnianie w zsh

Jedną z mocniejszych stron zsh są jego możliwości autouzupełniania. Działa ono inaczej, niż w bash i sprawia, że w moim przypadku praca w konsoli staje się dużo bardziej efektywna. Zachowanie się systemu autouzupełniania można ustawić, dzięki wspomnianemu narzędziu – zsh-new-user-install. Polecam w pliku ~/.zshrc dopisać linię:

zstyle ’:completion:*’ glob 1

Należy ją wstawić przed wywołanie:

autoload -Uz compinit

Plik jest czytany „z góry na dół” i jeśli linia ta znajdzie się poniżej, to system compinit nie będzie miał pojęcia o jej istnieniu. Dodanie tej linii znacznie rozszerza możliwości autouzupełniania. W praktyce oznacza to koniec z wpisywaniem długich nazw plików. Np. w moim Gentoo, kiedy wpisuję w konsolitail -f /v/l/e-fPo wciśnięciu <TAB>, wyrażenie jest rozszerzane dotail -f /var/log/emerge-fetch.log Jeśli więcej, niż jeden plik pasuje do wzorca, to można wybrać właściwy, wciskając klawisz <TAB>, który będzie przełączał nas między kolejnymi możliwościami, a nie tylko wyświetlał podpowiedzi.

Prosta konfiguracja – opcje zsh

Początkowo, kiedy używałem zsh wiele rzeczy mnie w nim drażniło. Np. kiedy wpisywałem polecenie rm *, zsh pytał mnie, czy na pewno chcę usunąć wszystkie pliki w katalogu. Cóż, na ogół, kiedy wpisuję to polecenie, to wiem, co robię i takie pytanie mnie irytowało. Na szczęście w zsh nic nie jest zakodowane „na sztywno” i takie drobne, irytujące rzeczy można zmienić, dzięki opcjom.

Opcje, podobnie jak całą resztę konfiguracji zsh, ustawiamy w pliku ~/.zshrc. Do ustawiania opcji używamy polecenia setopt, do wyłączania – unsetopt, lub poprzedzamy nazwę opcji słowem no, np. nobeep Nie ma znaczenia, czy nazwę opcji piszemy WIELKIMI, małymi, czy MieSZaNyMI literami. Możemy też w nazwę opcji wstawiać Pod_kreśl_niki. Czasem ułatwia to czytanie.setopt alwaystoend
setopt AlwaysToEnd
setopt always_to_end
Trzy powyższe linie robią dokładnie to samo, tylko pewne wyglądają lepiej od innych. Na stronie manuala zshoptions, znajduje się pełna lista opcji, które można ustawić w powłoce. Polecam zapoznanie się z całą stroną tego manuala i włączenie/wyłączenie interesujących nas opcji. Wystarczy zrobić to raz, potem się nie będzie już do tego wracało.

Poniżej prezentuję kilka ciekawszych opcji:

  • AUTO_CD – poruszanie się po katalogach bez wpisywania cd. Wystarczy wpisać nazwę katalogu
  • ALWAYS_TO_END – przesuń kursor na koniec słowa po wykonaniu autouzupełniania.
  • NO_BEEP – czy ktoś lubi te irytujące dźwięki, które oznaczają, że nie ma możliwości autouzupełnienia?
  • MENU_COMPLETE – po wciśnięciu <TAB>, zamiast wyświetlać listę możliwych uzupełnień, wstawia pierwszy argument (plik, lub opcję, lub coś innego, w zależności od kontekstu) pasujący do wzorca. Po kolejnym wciśnięciu <TAB>, argument jest zamieniany na kolejny, pasujący do wzorca. UWAGA! Ta opcja jest niezwykle użyteczna!
  • HIST_IGNORE_ALL_DUPS – powtarzające się polecenia nie są wstawiane do historii
  • CHECK_JOBS – jeśli próbujemy zamknąć powłokę, która ma pod sobą jakieś zadania, to zostaniemy o tym powiadomieni. Kolejna próba zamknięcia sprawi, że powłoka się zamknie, zabijając tym samym kontrolowane zadania
  • MULTIOS – pozwala na czytanie z/pisanie do wielu plików jednocześnie, np. ls > ls.out | cat zapisuje wynik polecenia ls do pliku ls.out i jednocześnie wypisuje wynik na ekran. Polecenie sort < *.txt posortuje linie we wszystkich plikach z rozszerzeniem txt i wypisze je na ekran. Odpowiednik cat *.txt | sort
  • PRINT_EXIT_VALUE – wypisz kod wyjścia polecenia, jeśli jest on różny od zera (zero oznacza, że polecenie zakończyło się sukcesem)

Rozszerzanie możliwości powłoki – moduły

Opcje w zsh dają nam duże możliwości konfiguracji, jednak prawdziwa siła zsh tkwi w modułach. Pozwalają one, podobnie jak dodatki do Firefoksa, rozszerzać możliwości powłoki w sposób nieograniczony. Pełna lista modułów znajduje się na stronie podręcznika man zshmodules. Aby móc korzystać z modułu, należy najpierw go załadować, za pomocą polecenia:autoload -U nazwa_modułu

Poniżej przedstawiam listę ciekawszych modułów, z którymi warto się zapoznać:

  • compinit
    Compinit to zdecydowanie najważniejszy moduł. Jest on odpowiedzialny za dopełnianie poleceń. Potrafi nie tylko uzupełniać nazwy plików i poleceń, ale także opcje i poszczególne argumenty. Np. po wpisaniu sudo apt-get ins i wciśnięciu <TAB>, dostaniemy uzupełnienie do sudo apt-get install. Kolejne wciśnięcie <TAB> poda nam listę paczek możliwych do zainstalowania. Ogólnie – system autouzupełniania w zsh działa wszędzie i w zależności od kontekstu. Wystarczy używać magicznego klawisza <TAB> w dowolnym momencie wpisywania polecenia. Zsh będzie wiedział, co robić.

    Moduł compinit ładuje się, dodając do pliku ~/.zshrc nast. linie:autoload -U compinit
    compinit
    Nie zalecam, jednak tego sposobu. Proponuję się posłużyć narzędziem zsh-new-user-install, lub compinstall. Narzędzie compinstall znajduje się w module compinit i należy go wcześniej załadować.

  • promptinit
    Promptinit pozwala nam w łatwy sposób zmieniać wygląd shellowego znaku zachęty. Domyślnie mamy zainstalowanych klika ciekawych promptów. Możemy też oczywiście zdefiniować swój prompt. Jeśli umieścimy go w katalogu, który znajduje się w zmienneś środowiskowej fpath, to wówczas możemy go wybrać poleceniemprompt nazwa_promptu

    Jeśli chcemy korzystać z tego modułu, to wcześniej należy go oczywiście załadować, dodając do pliku ~/.zshrc:autoload -U promptinit
    promptinit
    Po wykonaniu tego kodu, możemy zobaczyć, jakie prompty mamy domyślnie. Wpisujemy w wierszu poleceń prompt i po wciśnięciu klawisza <TAB> możemy zobaczyć, jaki mamy wybór. Jeśli jakiś prompt, nam się spodoba, to dodajemy go do pliku ~/.zshrc.

  • zcalc
    Po co korzystać z graficznego kalkulatora, albo nawet ze zwykłego – kieszonkowego? W zsh mamy dużo bardziej rozbudowany kalkulator, który poza wykonywaniem standardowych obliczeń arytmetycznych, pozwala na znacznie więcej! Przy jego pomocy możemy wykonywać bardziej zaawansowane obliczenia arytmetyczne, zapamiętywać wyniki w zmiennych, oraz posługiwać się standardowymi funkcjami matematycznymi, jak sin, cos, log, czy pow.

    Moduł ładujemy poleceniem:autoload -U zcalcWykoanie zcalc uruchamia interaktywny kalkulator. Nie polecam dodawać tej linii do pliku ~/.zshrc, ponieważ kalkulator będzie się uruchamiał przy starcie powłoki i czasem jednak chcemy zrobić w shellu coś innego, niż tylko wykonywać obliczenia. Kalkulator kończy swoją pracę po wciśnięciu kombinacji klawiszy Control-d.

  • zsh-mime-setup
    Na sam koniec zostawiłem najlepszą rzecz, jaką udało mi się wyszukać w zsh. Moduł zsh-mime-setup dramatycznie zmienia sposób działania powłoki. Oczywiście jest to zmiana na lepsze 🙂 Na podstawie pliku /etc/mailcap przypisuje on plikom z zadanym rozszerzeniem odpowiednie programy. Dzięki temu i omówionej wcześniej opcji autocd praktycznie nie musimy wpisywać poleceń w konsoli!. Wystarczy, że będziemy wpisywali nazwy plików, bądź katalogów. Zsh za nas wykona odpowiednią operację. Np. kiedy w otwartym oknie terminala wpiszemy nazwę pliku ./plik.png, to zsh otworzy skojarzoną z tym rozszerzeniem przeglądarkę grafiki. Jaką? To zależy od środowiska graficznego i od tego, co mamy aktualnie w systemie zainstalowane. Jeśli zamiast pliku graficznego zdecydujemy się na otwarcie pliku .txt, to plik ten zostanie wyświetlony przez program less.

    Połączenie tej opcji z możliwościami dopełniania, jakie oferuje nam ta powłoka sprawiają, że w zsh pracuje się niezwykle szybko. Np, jeśli mamy plik ~/zdjecia/wakacje/plaza.jpg, to wystarczy, że wpiszemy w linii poleceń: ~/z/w/p.j i wciśniemy magiczny klawisz <TAB> o ile nasz skrót nie jest wieloznaczny, to otrzymamy dopełnienie do nazwy naszego pliku. Jeśli jednak w katalogach mamy więcej plików pasujących do wzorca, to kolejne wciśnięcia klawisza <TAB> będą nas przełączać między kolejnymi dopasowaniami.

    Ale do rzeczy. Moduł ładuje się w standardowy sposób, dopisując w pliku ~/.zshrc nast. linie:
    autoload -U zsh-mime-setup
    zsh-mime-setup
    Teraz możemy już śmiało zapomnieć o wpisywaniu standardowych komend. Wystarczy, że będziemy wpisywać pliki 🙂

    Oczywiście poza załadowaniem modułu, możemy go też skonfigurować. Polecam jednak z zapoznaniem się z dokumentacją modułu. Tutaj wymienię tylko najważniejszą opcję, mianowicie zmianę programu skojarzonego z danym plikiem. Należy tylko przed załadowaniem modułu wpisać linię:zstyle ':mime:.avi' handler mplayer %s
    zstyle ':mime:.avi' flags needsterminal
    Pierwsze polecenie skojarzy mplayera z plikami avi. '%s’ to nazwa pliku, który mplayer będzie otwierał. Druga opcja jest konieczna, gdyż domyślnie zsh-mime-setup uruchamia programy w tle, a mplayer tego nie lubi. Ogólnie – dodajemy tą flagę, kiedy program musi działać w konsoli, na pierwszym planie. Jeśli jakieś rozszerzenie chcemy skojarzyć z aplikacją okienkową, to możemy nie dodawać drugiej opcji i pozwolić programowi działać w tle.

Podsumowanie

Zsh jest powłoką dla ludzi, którzy pracując przy komputerze, wpisują dużą liczbę poleceń w terminalu. Jeśli dobrze się wykorzysta możliwości, jakie oferuje ta powłoka, to nasza produktywność znacznie wzrośnie. Trzeba tylko poświęcić trochę czasu na dostrojenie powłoki do swoich upodobań, ponieważ standardowo powłoka nie oferuje nic nadzwyczajnego, nawet „domaga się” dostrojenia, przez wywołanie programu zsh-new-user-install. Polecam tą powłokę też osobom, które dużo operują na plikach. Standardowe menadżery plików pozostają daleko w tyle za zsh z jego możliwościami autouzupełniania i modułem zsh-mime-setup.

Dodatkowa lektura:


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

18 komentarzy do “Z-Shell: Powłoka dla (inter)aktywnych

  • soltys_83

    Osobiście jestem leniwy – ale po wysileniu się i 10 minutach testów stwierdzam, że uwielbiam zsh – tak dostosowanej dla leniwych powłoki jeszcze nie widziałem 😉
    @kwalo – świetny artykuł!

  • Ktos

    Niestety opis nie jest „dobry”,

    Na frugalware, udało się zainstalować (pacman -S zsh), ale
    I tak nie działa.

    ja@frugalware [~]::) % autoload -U zsh-newuser-install
    ja@frugalware [~]::) %

    i/lub

    ja@frugalware [~]::) % autoload -U zsh-newuser-install -f
    ja@frugalware [~]::) %

    Więc przeszło bez błędów, ale
    Plik .zshrc nie został utworzony, więc go utworzyłem ręcznie. Ale to nic nie pomaga. Moduły poładowane ale nie działają.
    Dopełnianie nie działa (/home/moj/.zshrc:1: no matches found: âM-^@M-^X:completion:*âM-^@M-^Y)

    Jak ktos moze poradzić coś to będę wdzięczny.

  • emm

    [quote post=”278″](…)czy to normalne, ze w zsh nie dzialaja klawisze DEL, HOME, END ? [/quote]
    Poradzilem sobie, bindkey 'kod klawisza’ beginning-of-line itp.

  • kwalo Autor wpisu

    [quote post=”278″]autoload -U zsh-newuser-install -f[/quote]
    Powinno być:
    autoload -U zsh-new-user-install
    zsh-new-user-install -f
    Proponuję czytać uważnie opisy, zanim stwierdzisz, że występuje w nich błąd

    [quote post=”278″]czy to normalne, ze w zsh nie dzialaja klawisze DEL, HOME, END ? Jakis ficzer na to jest ?[/quote]
    To zabawne. Już od dłuższego czasu używam zsh i nigdy ten fakt mi nie przeszkadzał 🙂 Pewnie dlatego, że jestem przyzwyczajony do skrótów w emacsie – Ctrl-a -> Home Ctrl-e -> End

    Można oczywiście, tak jak radzisz, emm.

    Dodatkowe, przydatne skróty: Ctrl-u – kasowanie całego wiersza
    Ctrl-k – Kasowanie od kursora do końca wiersza

    Alt-. – wkleja ostatni argument z ostatniego polecenia

  • kwalo Autor wpisu

    [quote post=”278″]… jak zrobić żeby zsh uruchamiał się zamiast basha?[/quote]
    Wstyd, że zapomniałem tego napisać, po prostu skupiałem się na możliwościach samej powłoki, a nie na takich rzeczach, jak ustawienie jej jako domyślnej.

    Powłokę zmienisz poleceniemchsh -s /bin/zsh

  • Uzytkownik

    [quote comment=”7171″]Art dobry ale…
    czy to normalne, ze w zsh nie dzialaja klawisze DEL, HOME, END ? Jakis ficzer na to jest ?[/quote]
    Wklej do .zshrc takie linijki:
    autoload zkbd
    [[ ! -d ~/.zkbd ]] && mkdir ~/.zkbd
    [[ ! -f ~/.zkbd/$TERM-$VENDOR-$OSTYPE ]] && zkbd
    source ~/.zkbd/$TERM-$VENDOR-$OSTYPE
    [[ -n ${key[Home]} ]] && bindkey „${key[Home]}” beginning-of-line
    [[ -n ${key[End]} ]] && bindkey „${key[End]}” end-of-line
    [[ -n ${key[Insert]} ]] && bindkey „${key[Insert]}” overwrite-mode
    [[ -n ${key[Delete]} ]] && bindkey „${key[Delete]}” delete-char
    [[ -n ${key[Up]} ]] && bindkey „${key[Up]}” up-line-or-history
    [[ -n ${key[Down]} ]] && bindkey „${key[Down]}” down-line-or-history
    [[ -n ${key[Left]} ]] && bindkey „${key[Left]}” backward-char
    [[ -n ${key[Right]} ]] && bindkey „${key[Right]}” forward-char

    i przeloguj się – zkbd zada Ci kilka prostych pytań, gdy będziesz logować sie z nowej konsoli (np. żebyś nacisnął klawisz Home etc.).

  • azhag

    > Zsh nie jest też dostarczane standardowo w żadnej dystrybucji

    owszem jest – w grml (www.grml.org), nawiasem mówiąc właśnie twórcy są autorami zsh-lovers, o którym wspominasz w tekście

  • kuku

    to moze jeszcze powiedzcie jak zrobić żeby dzialal page up i page down jak w bashu (dokańczanie poleceń tym co mamy w historii)
    bo jak narazie to zmienia mi ostatnią litere na DUŻĄ

  • qx

    Zsh jest nie tylko dostarczany w dystrybucjach, jest DOMYŚLNĄ POWŁOKĄ przynajmniej kilku ezoterycznych dystrybucji – najpopularniejsza z nich to chyba dyne:bolic.

  • cla

    > Zsh jest nie tylko dostarczany w dystrybucjach, jest DOMYŚLNĄ POW�?OKĄ przynajmniej kilku
    > ezoterycznych dystrybucji – najpopularniejsza z nich to chyba dyne:bolic.

    Nie ma powodu, żeby zsh było dostarczane domyślnie. Wolność wyboru – tym właśnie charakteryzuje się Linux. Kto lubi zsh, chce korzystać z tej powłoki – instaluje ją sobie. Ktoś, kto jest przyzwyczajony do basha (znam takich wielu) nie potrzebuje mieć standardowo zainstalowanego zsh.

  • Krzysztof

    > to moze jeszcze powiedzcie jak zrobić żeby dzialal page up i page down jak w bashu (dokańczanie
    > poleceń tym co mamy w historii)
    > bo jak narazie to zmienia mi ostatnią litere na DUŻĄ

    Działanie takie uzyskuje się wciskając Alt-P.

  • acidburnpl

    Jest kilka denerwujących rzeczy w ZSH. Pierwsza to że nie działają znaki uzupełniające np. *, druga to że jak uruchamiam jakąś aplikację w konsoli, po czym przenoszę ją w tło, abym mógł zamknąć konsolę bez uruchomionej aplikacji … to w ZSH nie działa. Nawet jak aplikacja jest w tle to i tak dostaję komunikat, że zamknięcie konsoli spowoduje wyłączenie danego programu. Strasznie to denerwuje.

  • kwalo Autor wpisu

    [quote post=”278″]Jest kilka denerwujących rzeczy w ZSH.[/quote]
    Pierwsza zasada, kiedy spotkasz się z denerwującą rzeczą w zsh – poszukaj opcji, która to zmieni. To się tyczy każdego programu, który uchodzi za wysoce konfigurowalny. Jak czegoś się w zsh nie da zmienić, to można to uznać za błąd krytyczny 😉 Jedyną wadą w takim podejściu jest to, że trzeba przysiąść i przewertować dokumentację. Takie coś się odpłaca w przyszłości. Możesz zaoszczędzić duużo czasu, jeśli na początku ustawisz sobie program „pod siebie”.
    [quote post=”278″]Pierwsza to że nie działają znaki uzupełniające np. *[/quote]
    Widocznie nie dodałeś modułu compinit. Wszystko jest w tekście.[quote post=”278″]jak uruchamiam jakąś aplikację w konsoli, po czym przenoszę ją w tło, abym mógł zamknąć konsolę bez uruchomionej aplikacji … to w ZSH nie działa[/quote]
    To jest standardowe zachowanie każdej powłoki. Jak ją zamykasz, to wszystkie procesy się również zamykają. Tak masz w bashu, csh i wszystkich innych *sh, nawet w ssh.

    Żeby po zamknięciu powłoki program dalej pracował, musisz go uruchomić przez nohup.
    Więcej informacji:
    info nohup