Jak dostosować *nixowy terminal do swoich potrzeb.

Terminal to jedno z ważniejszych narzędzi wielu użytkowników *nixów. Gdy używa się go często i czerpie się garściami z jego walorów, warto jest go dopasować tak, żeby wziąć maksimum. Wymaga to odrobiny pracy, ale myślę, że warto.

Podstawą podstaw jest czytelność. Jeśli nie mamy dobrze dobranej czcionki, dobrze dobranych kolorów, dużo tracimy. W przypadku terminala, sprawa jest dość prosta, bo czcionką zwykle zajmuje się system operacyjny, ale pozostają jeszcze kolory, które bardzo ułatwiają pracę. Pomijając fakt, że warto ustawić w ustawieniach programu powłoki aliasy, które będą uruchamiać programy (na przykład ls) tak, żeby używały kolorów; warto się zająć też samymi kolorami. Nie zawsze są one dobrze dobrane. Na przykład niebieski jest za ciemny, żółty wygląda brzydko, biały za jasny i takie tam. Na szczęście możemy je przedefiniować w bardzo prosty sposób. Jak zapewne wielu osobom wiadomo, terminal używa 8 kolorów, które nazywają się 0=black, 1=red, 2=green, 3=yellow, 4=blue, 5=magneta, 6=cyan, 7=white. Do zmieniania ich definicji używamy sekwencji ze znakiem "escape". Składnia jest bardzo prosta: ^[]Pxrrggbb, gdzie ^[ jest znakiem escape (można go uzyskać na wiele sposobów, na przykład wywołując cat z przekierowaniem do pliku i wciskając ESC), x jest numerem koloru, a rrggbb jest definicją koloru w rgb, szesnastkowo. Ja na przykład mam następującą definicję:

echo "^[]P0000000 ^[]P1ff0000 ^[]P200ff00 ^[]P3ffff00 ^[]P43030ff ^[]P5ff00ff ^[]P600ffff ^[]P7909090"

Oczywiście nie samym terminalem żyje człowiek. Żyjemy w XXI wieku, mamy X11 i używamy wirtualnych terminali. Mamy tu wiele różnych opcji: Konsole, Terminal, klasyczny xterm czy mój faworyt, urxvt. Oczywiście sam wybór odpowiedniego emulatora terminala to no nie wszystko. Trzeba go jeszcze dobrze skonfigurować. W przypadku tych łatwych programów nie jest to trudne, jednak nie każdemu muszą one pasować. Ja na przykład lubię urxvt i pokażę jak go szybko i sprawnie skonfigurować.

Podstawową konfigurację można przeprowadzić za pomocą linii poleceń (opcja dla mało wymagających), używając takich przełączników jak -bg (kolor tła), -fg (kolor tekstu) i -fn (czcionka). Moim zdaniem jednak to za mało, żeby mieć ładny emulator terminala (poza tym ta metoda jest dobra tylko do wywoływania z menu). Dlatego też polecam grzecznie przejrzeć manuala i zabrać się do pracy (lub skorzystać ze ściągawki poniżej :D).

W przypadku (u)rxvt, konfiguracja odbywa się poprzez wpisanie odpowiednich wartości (tzw. resources, wszystkie można znaleźć w manie) do ~/.Xdefaults (choć może to być jeden z kilku innych, też do wyszperania w manie). U mnie wygląda to tak:

URxvt.background: black
URxvt.foreground: white
URxvt.color0: #dddddd
URxvt.color1: #ff0000
URxvt.color2: #00ff00
URxvt.color3: #ffff00
URxvt.color4: #5050ff
URxvt.color5: #ff00ff
URxvt.color6: #00ffff
URxvt.color7: #ffffff
URxvt.cursorColor: #00ff80
URxvt.cursorColor2: #000000
URxvt.font: -*-courier-medium-r-*-*-25-*-*-*-*-*-*-2
URxvt.mfont: -*-dejavu sans-medium-r-*-*-17-*-*-*-*-*-*-u
URxvt.title: Terminal
URxvt.virtualBell: True
URxvt.loginShell: True
URxvt.scrollBar: False
URxvt.termName: xterm

Sprawa jest dość prosta. Jak widać wszystkie wpisy zaczynają się od URxvt. Wpisy colorn (gdzie 0>=n >=7) definiują kolory (numery analogiczne do tych przestawionych poprzednio); cursorColor definiuje kolor kursora; cursorColor2 to kolor tekstu podświetlonego kursorem; font deklaruje standardowy font; mfont -- font dla znaków unikodu; title definiuje nazwę terminala (skrypty mojego systemu nie rozpoznają rxvt-unicode i produkują nieprzyjemny komunikat przy logowaniu); virtualBell emuluje brzęczyk systemowy; loginShell na true sprawia, że terminal standardowo jest login shellem, a scrollBar włącza pasek przewijania.

Ładny wygląd terminala to ciągle nie wszystko. Może nawet mniej ważna część. Bardzo istotną sprawą jest program powłoki, bo pozwala bardzo przyspieszyć pracę (a nie tylko nie spowalniać, jak w przypadku terminala). Oprócz popularnego w świecie Linuksów Basha mamy do dyspozycji jeszcze kilka godnych uwagi programów powłoki. Od siebie polecę zsh (ze względu na bardzo duże możliwości -- taki fvwm wśród shelli ;p) i tcsh którego konfigurację opiszę.

Na początek jednak krótkie wyjaśnienie czemu tcsh. Mianowicie zsh jest jak dla mnie zbyt rozległy, różnorodność wszelakich opcji trochę mnie przytłaczała. Natomiast bash zdaje się być mało wyrafinowany, mało informacji ma w manie i w necie nigdzie nie znalazłem żadnych ciekawych konfiguracji. Za to tcsh ma całkiem spore możliwości i dobrą dokumentację (całą konfigurację udało mi się zrobić na podstawie mana).

Konfiguracja tcsh to przede wszystkim plik .cshrc (ze względu ma to, że jest tylko rozszerzoną wersją csh). Taką konfigurację można podzielić na trzy części. Zanim zacznę jednak, myślę, że należy zaznaczyć, że ciąg znaków ^[ reprezentuje jeden znak "escape". W przypadku bindkey, wersja dwuznakowa powinna działać, w przypadku echo już nie koniecznie. Pierwszą częścią są zmienne konfigurujące program, ustawiane poleceniem set:

set savehist = 100
set addsuffix
set complete = "enhance"
set echo_style = "both"
set path = ( "/bin/" "/usr/local/bin/" "/usr/bin" "." )
set printexitvalue
set prompt = "%{\033[33m%}%c%{\033[31m%}%%%{\033[37m%} "
set rprompt = "[%T][%j]"
set prompt2 = ">"
set rmstar

Zmienna savehist określa ile kolejnych komend powinno być zapisywanych na dysku (jeśli nie ustawione, pamięta tylko komendy z obecnej sesji). Zmienna addsuffix sprawia, że przy dopasowaniu (tab completion) nazwy katalogu, pojawi się za nią znak / zamiast spacji. Ustawienie zmiennej complete na enhance sprawia, że przy dopasowywaniu nie są rozróżniane wielkie i małe litery, a także kropka, podkreślenie i myślnik nie są rozróżniane. Ustawienie zmiennej echo_style na both sprawi, że polecenie echo będzie rozróżniać opcję -n (brak znaku nowej linii na końcu) i będzie rozpoznawać sekwencje ze znakiem "\". Path chyba jest dość oczywisty, poza składnią typową dla csh. Jak ładnie widać, oprócz standardowych "binów" dodałem sobie bierzący katalog. Zmienna printexitvalue sprawia, że jeśli program zwóci wartość niezerową, csh to zakomunikuje. Zmienna rmstar natomiast sprawia, że zostaniemy poproszeni o potwierdzenie w przypadku wywołania magicznego "rm *". Niestety nie dotyczy to np "rm katalog/*".

Zostały nam jeszcze trzy ważne zmienne ustalające prompt. Jest to jedna z kluczowych rzeczy jeśli chodzi o wygodę pracy z powłoką. Podstawowy prompt składa się z dwóch części, podobnie jak w zsh, wyrównanej do prawej i do lewej. Użyte przeze mnie symbole to: %c (nazwa bieżącego katalogu), %% (czyli procent ;)), %T (czyli godzina w systemie 24-godzinnym) i %j (ilość zadań uruchomionych w tle). Warto również zwrócić uwagę na trochę nietypowy sposób ustawiania kolorów (choć w gruncie rzeczy, dużej różnicy w stosunku do np Basha nie ma). Dla nie wtajemniczonych dopowiem, że % jest używany jako znak zachęty dla nie-roota w csh (tak jak $ w bashu). Na koniec zostaje zmienna prompt2, która definiuje znak zachęty podczas definiowania kolejnych linii pętli foreach i while.

Następną część stanowią definicje skrótów klawiszowych.

bindkey "\t" complete-word-fwd
bindkey "^[[Z" complete-word-back
bindkey "^[[3~" delete-char
bindkey "^A" expand-glob
bindkey "^[[6~" i-search-back
bindkey "^[[5~" i-search-fwd

Nie jest tego dużo, ale potrafi sporo. Po pierwsze, na tab mam tab-completion z tą właściwością, że od razu dopasowuje pierwszą możliwość w przypadku gdy jest ich wiele. Na shift+tab (^[[Z) mam działanie odwrotne do taba (tj. wybiera poprzednie dopasowanie). Działanie delete (^[[3~) chyba jest oczywiste. :) Na ctrl+A (^A) mam rozwinięcie globu do pełnej postaci (wypisze wszystkie elementy pasujące). Na page up (^[[5~) i page down (^[[6~]) natomiast mam ustawione przeszukiwanie historii odpowiednio do przodu i do tyłu. Jest to bardzo przydatne, bo w trakcie pisania, powłoka podsuwa odpowiedzi, którą można zatwierdzić escapem lub enterem lub odrzucić w razie niepowodzenia -- CTRL+G.

Trzecią i ostatnią grupą są aliasy, równie przydatne. Wyjaśnię bardzo pobieżnie, bo prawdopodobnie większość będzie oczywista dla większości użytkowników konsoli.

alias df        "df -h"
alias du        "/bin/du -h --max-depth=0"
alias duv       "/bin/du -h --max-depth=1"
alias duvv      "/bin/du -h"
alias for       "foreach"
alias ls        "ls --color -FbxhC"
alias la        "ls -a"
alias ll        "ls -l"
alias lll       "ls -la"
alias mntc0     "sudo mount /dev/hdc /mnt/cd0 -o uid=bartek"
alias mntc1     "sudo mount /dev/hdd /mnt/cd1 -o uid=bartek"
alias mntf      "sudo mount /dev/sda /mnt/flash -o uid=bartek"
alias mntf1     "sudo mount /dev/sda1 /mnt/flash -o uid=bartek"
alias umntc0    "sudo umount /mnt/cd0"
alias umntc1    "sudo umount /mnt/cd1"
alias umntf     "sudo umount /mnt/flash"

Alias df, dość oczywisty; z opcją, która każe wyświetlać wielkości w potęgach kilobajta. Aliasy du, duv i duvv to du z analogiczną opcją do df i w różnych poziomach "wylewności" (ang. verbose :)). W tym przypadku wywołuję du pełną ścieżką, gdyż samo du jest rozpoznawane jako alias. for jest aliasem dla foreach, który jest odpowiednikiem bashowego for w csh. ls, la, ll, lll to chyba dość typowe aliasy dla różnych wariacji na temat ls. Na koniec aliasy do montowania płyt cd i pamięci flash. Ot tak, żeby sobie oszczędzić czasu, bo trochę pisania jest. Podobnie z aliasami do odmonowywania powyższych.

W prawdzie jest jeszcze wiele rzeczy ułatwiających pracę z konsolą, takich jak nauczenie się języka powłoki, seda, awka, perla i całej reszty na fest; aczkolwiek myślę, że TO już daje możliwość uzyskania już dosyć silnego narzędzia. Zwłaszcza że wybrane przeze mnie opcje to nie wszystko co proponują zaprezentowane narzędzia (odsyłam oczywiście do mana).


Komentarze do notki “Jak dostosować *nixowy terminal do swoich potrzeb.”

  1. Asmo 

    Uwazam, ze juz wole stracic troche RAMu, miec wiecej opcji niz potrzebuje (mam 1 GB, a na 2 kompie 512 wiec nie jest tragicznie), stad wybor jest prosty: KDE 4.3. Z czasem sie przekonalem, ze w sumie po prostu nie chce mi sie dokladnie dostrajac poszczegolnych elementow systemu. Poza tym coraz bardziej doceniam GUI, w sumie teraz tak 1/2 z konsola i wygodnie mi sie w tym dziala.

    Wciaz doceniam i lubie narzedzia konsolowe, rzadko mam zamkniety terminal, po prostu nie widze realnych korzysci z uzytkowania rozwiazan lekkich / minimalistycznych na zwyklym biurku. Wydaje mi sie, ze w przypadku desktopu koncepcja minmalistyczna / klasyczna uniksowa po prostu przegrywa z nowoczesnymi, "wszystko-majacymi" molochami.

    Szkoda, tylko ze nie ma to tej samej "magii" co ten piekny, klasyczny OS. Dlatego "lekkii desktop" jest to bardziej cos hobbistycznego, podobnie jak ludzie bawiacy sie stara Amiga lubia miec swoje zabawki tak samo geeki uniksowe maja swoje lekkie desktopy.

    I jest to fajne, ale raczej ciekawostka. Raczej nie dla leniwych. A moze sie myle?

  2. Elwis 

    Konsola właśnie jest dla leni. Z tym, że dla leni którzy mają dużo do zrobienia albo są perfekcjonistami. Obecnie też mam na biórku kde (tyle, że 3.5), co nie zmienia faktu, że na przykład żaden program do ripowania muzyki mnie nie satysfakcjonuje - piszę skrypt. Mam mały dysk, więc dane muszę upychać na cdromach, więc potrzebuję jakiś skrypt, żeby się w tym nie pogubić, itp... Przynajmniej się przygotowuję na wypadek, jakby przyszłoby mi być administratorem serwera.

  3. Asmo 

    Hmm.. pisac skrypt.. Rozumiem, ze ma to sens jak np. chcesz zmienic jakas dana np. tag ID3 we wszystkich plikach wedlug podanego schematu, a masz ich powiedzmy 5 GB. Az prosi sie Ruby (pewnie jest jakas biblioteka) + wyrazenia regularne.

    Ale jak dla mnie lepszym rozwiazaniem do muzyki jest dobry program z GUI do zarzadznia duza biblioteka - jak jest powiedzmy kilkadziesiat GB to przydalyby sie rozne fajne extra feature'y, maly dysk nie przeszkadza, skoro wszystko i tak jest trzymane na serwerze i udostepniane zaleznie od zaslug i potrzeb. Pytanie co to znaczy maly dysk?

    Konsola jest dobra dopiero wtedy jak sie zaczyna uzywac aliasow i mini skryptow na masowa skale - jako wspomagacz do codziennej pracy, ale w pewnych operacjach spowalnia prace jak dla mnie (np. wydajniej sie wykonuje operacje np. na FTP przez takie GUI, chyba ze jest ich duzo to moze lepiej sie pobawic ze screenem itp). Chyba, ze jestesmy w obcym komputerze to jednak w konsoli najwygodniej sie dziala.

    Jak dla mnie GUI + konsola to rozwiazanie najlepsze na zwykly desktop. Jednak wole GUI, ale bez konsoli ciezko zyc.

  4. Elwis 

    mały -> 40GB
    Jak sam mówisz, ciężko żyć bez konsoli, toteż dobrze jest mieć ją ładnie odpicowaną. O ile tobie bez kosoli żyć tak trudno jak mi. :)

  5. Asmo 

    Ogolnie to odpicowana konsola to podstawa. Zaleta jest przenosnosc konfiguracji - czyli na wszystkich kompach te same aliasy, skrypty i nie tylko.

    Po prostu poczatkowo jak pisalem co nieco - bylem bardzo sceptycznie nastawiony do KDE 4. Z czasem doszedlem do wniosku, ze jak sie oswoilem i powylaczalem wiele zbednych bajerow to zaczyna miec sens. Ale na poczatku myslalem sobie bardzo negatywnie o tym rozwiazaniu.

    Jakie korzysci daje mi GUI?

    Pulpit KDE 4 umozliwia dodawanie apletow, oprocz klasycznego pulpitu dodalem do niego 2 widoki katalogow: torrent i storage. Sa to katalogi, w ktorych montuja sie zdalne zasoby o ile sa dostepne - czyli widze ja caly czas na pulpcie. Dzieki temu mam do nich b. szybki dostep, moge np. przegladac zdjecia bez ich otwierania, rozne foldery / cos szybko przekopiowac. Jedyne co zrobic to przesunac mysz i poczekac kilka ms. Tak samo przemieszczac dane miedzy oknami, w KDE 4 jest to IMO duzo wygodniejsze jak w takim Windows XP. Po prostu czasami az nie chce sie odpalac mc czy tez wykonywac recznych operacji na danych (ale tez nie zawsze). Do tego takie quick bar launchery przekryte oknami aby nie szpecily. Nasuwam mysz, 1x klik i odpalam czesto uzywany program szybciej jak konsole. Jak chce sobie zbindowac jakis hotkey to nie musze rozkminiac niskopoziomych narzedzi - dodaje sobie w KDE menu taki skrot klawiszowy i juz mam np. szybkie odpalanie konsoli, firefoksa i inny stuff po ktory nie chce mi sie przesuwac myszy na quick bar launcher. Moze lamerskie, ale wygodne.

  6. maciek 

    Sztuczki fajne, klasyczne i dobre, ale paradoksalnie nie jakieś super praktyczne.

    Co do interfejsu tekstowego ogółem: przydaje się do zdalnego zarządzania n.p. serwerami. Do konfiguracji dużego sprzętu bez durnych kart graficznych... ale wtedy i tak za każdym razem masz do czynienia z n.p. surowym POSIXowym /bin/sh, a nie z jakimiś gadżetami, zaś chodzi o to aby mieć maszynę up and running, a nie o robienie jakichś "sztuczek z shellem": warto stosować jaknajprostsze metody i jaknajmniej zmieniać domyślną konfigurację, i by się nie pomylić :) Któregoś razu zmieniłem - "dla wygody" - domyślną powłokę roota na pewnej maszynie... do demonstracji... rąbnąłem się w ścieżce do basha i przestało działać (nie pozwalało zalogować) - odkręcać trzeba było w single user. Podczas demonstracji sprzętu ;-)

    Interfejs tekstowy czasem może się też przydać na desktop, bo dalej GUI nie dorobiło się praktycznych metafor zastępujących <b>find ... -exec ...\;</b> czy <b>for f in 2007*; do mv $f...</b>, ale ogółem staje się coraz pojemniejsze i kwestią czasu jest zanim w typowym zarządzaniu dokumentami klikane narzędzia okażą się dla użytkownika szybsze :D

  7. Asmo 

    Coz ja z mojego serwera wyrzucilem karte graficzna po uruchomieniu OpenSSH. I nie mam wyjscia, nie przewiduje koniecznosci uzywania GUI (gorzej jak cos sie spieprzy, ale to juz inna sprawa).

  8. maciek 

    To co to za serwer, że do zarządzania POTRZEBNA jest karta grafiki?

    Elwisu : weź zrób coś, bym nie musiał tych 4 cyferek przepisywać za każdymrazem ;-)

  9. Asmo 

    Jest to przerobiony desktop, bo nie mam kasy na nic innego (pliki, shell, www, firewall). A karta grafiki zostala wyrzucona z powodu oszczednosci energii.

    Jak sie spieprzy np. cos z dyskiem i system nie wstanie - raz sie tak zdarzylo - to nie mam wyjscia, musze podlaczyc karte graficzna, usunac wadliwy sprzet i znowu wyjac.

  10. Elwis 

    Żeby tylko KDE4 chodził znośnie na moim sprzęcie to może nawet bym go używał, bo nie jest zły. No ale niestety mój komputer to zgrzybiały staruszek i sobie nie radzi. ;p

  11. maciek 

    Też tak można :) Offline management :)
    Niby na domowym serweru (bo rozumiem, o to chodzi) można tak się męczyć, choć to stresogenne :D

    Na allegrze za grosze są cywilizowane serwery poprzedniej generacji wyposażone w cywilizowany LOM/RSC - zmniejszają stresogenność zarządzania - niestety choć są one często dalej żwawe i mają bardzo atrakcyjny stosunek moc/cena pochodzą z epoki, kiedy oszczędzanie energii w centrum danych nie było w modzie, więc mogą Ci nie przypasować ;-)

  12. Asmo 

    Ze wzgledu na kryzysowe oszczednosci stary sprzet mi wystarcza, zwlaszcza ze dziala calkiem bezawaryjnie. :D
    A jak chcialbym cos kupic to najchetniej jakas plyte ATX dla Atoma o ile powstanie.

  13. maciek 

    Dobra wiadomość : Tak, Atom działa, nawet cośtam policzy (byle nie za dużo).

    Zła wiadomość : Zestaw pod Atoma (jeśli ma mieć "serwerowe" wyposażenie) nie będzie istotnie tańszy od zestawu pod poważne CPU, zaś Atom jako taki może być za słaby na mały domowy serwer plików (software RAID5 przy obecnych szybkościach dysków SATA na prawdę może wykraczać po za możliwości zabawkowego CPU; podobnie TCP na 1GbE). Tak... nie na jakieś cuda, ale i na mały domowy serwer plików warto mieć prawdziwy CPU :(

    Kolejna zła wiadomość : Tani ("desktopowy") zestaw pod Atoma oczywiście nie będzie wspierał zdalnego zarządzania, a do głupiej rekonfiguracji BIOS będziesz potrzebował podłączać grafikę (kartę, monitor, klawiaturę) ;-)

    W skrócie : świetny procesor do netbooków nie będzie w stanie rozsądnie obsłużyć małej domowej sieci z 3 pececikami :) Dziękuję za uwagę :)

Zostaw odpowiedź