Sztuczki w Bashu, część druga

Posted on sierpień 4, 2008
Filed Under Linux, Programowanie | Leave a Comment

KORZYSTANIE Z HISTORII POLECEŃ

Każdorazowe wykonanie polecenia w bashu jest zapisywane. Historię wykonywanych poleceń możesz zobaczyć wpisując w terminalu

$ history
...

Aby obciąć listę do 5 ostatnio wpisywanych poleceń można wpisać:

$ history 5
155 bash
156 echo $FOLDER
157 history
158 history 10
159 history 5

Jeśli chcesz ponownie wykonać jakieś polecenie, nie musisz go wpisywać od nowa. Zapewne oczywistym jest dla Ciebie to, że strzałki w górę i w dół pozwalają na wybieranie ostatnio wpisywanych poleceń. Jeśli chcesz wykonać ostatnie polecenie ponownie naciskasz strzałkę w górę i naciskasz enter. Podobny efekt możesz uzyskać poprzez wpisanie jako komendy dwóch wykrzykników np.:

$ echo tekst
tekst
$ !!
echo tekst
tekst

Niby nic specjalnego. Tak naprawdę, to jedyne zastosowanie tego wynalazku znajdzie się tylko w skryptach lub klawiaturach bez strzałek. Co jednak gdy przeglądamy historię w poszukiwaniu jakiegoś polecenia które zawiera kilkanaście ustawionych flag, a wpisywaliśmy je kilka godzin temu? Jeśli pamiętasz choć fragment polecenia, to możesz zastosować taki myk:

# !?onfig
./configure --with-aspell-lib=/usr/lib/aspell --with-aspell-inc=/usr/include
Configuring Psi ...
Verifying Qt 4 build environment ...
...

Poprzedzenie jakiegoś tekstu znakami !?, uruchamia ostatnie polecenie, które zawiera w sobie ciąg znaków występujący za tymi symbolami (w tym przypadku ostatnim poleceniem zawierającym ciąg znaków config było polecenie uruchamiające konfigurator). Jeśli znamy początek polecenia to możemy zapisać to tak:

# !config
./configure --with-aspell-lib=/usr/lib/aspell --with-aspell-inc=/usr/include
Configuring Psi ...
Verifying Qt 4 build environment ...
...

Już nie musimy wstawiać znaku zapytania.

Przeglądając wynik polecenia history zauważysz po lewej stronie każdego polecenia pewien numer. Dzięki jego znajomości możesz wykonać jakieś polecenie bez latania do niego strzałkami. Pozwala na to polecenie !nr np.:

$ history 10
148 history 5
149 TEKST="to jest jakis tekst"
150 export TEKST
151 touch plik
152 rm plik
153 echo TEKST
154 history 5
155 history 7
156 clear
157 history 10
$ !153
echo TEKST
TEKST

Jeśli chcesz szybko wyświetlić wszystkie polecenia z historii zawierające jakiś ciąg znaków, możesz posłużyć się poleceniem:

$ history | grep polecenie

Spowoduje ono przefiltrowanie całej historii i wyświetlenie wyłącznie linijek zawierających określony ciąg znaków. Teraz łatwiej znajdziesz interesujące Cie polecenie i wykorzystując !n wykonasz je ponownie.

Użytkownik basha ma do dyspozycji kilka skrótów, które ułatwiają poruszanie się po historii poleceń.

Ctrl+r – umożliwia wyszukiwanie polecenia w historii; po wpisaniu części wyszukiwanego polecenia, ponowne wciśnięcie kombinacji pokazuje kolejną propozycję; zatwierdzamy enterem
Ctrl+s – działanie jak poprzednio tylko w druga stronę
Są jeszcze Alt+p oraz Alt+n, które mają podobne zastosowanie.

Czasem zachodzi potrzeba edycji i wykonania kilku linijek poleceń. W takim przypadku warto posłużyć się wbudowanym w powłokę narzędziem fc. Uruchamia ono edytor tekstu w którym możemy dokonać korekty i po zapisaniu oraz wyjściu, polecenia automatycznie się wykonają.

$ history 10
260 echo$
261 echo $*
262 echo 1
263 echo 2
264 echo 3
265 echo 4
266 echo 5
267 echo 6
268 echo 7
269 history 10
$ fc 262 269
echo 7
7
echo 6
6
echo 5
5
echo 4
4
echo 3
3
echo 2
2
echo 1
1

Edytor który służy do edycji, ustala się w zmiennej FCEDIT, która domyślnie nie jest zdefiniowana, więc uruchamia się domyślny edytor. Edytor wykorzystywany przez fc można też podać ręcznie poprzez przełącznik „-e edytor”.

Zachowaniem historii możemy sterować. Ustawienia te ustala się za pomocą zmiennych. Plik, w którym zapisywane są wykonane polecenia można ustawić przypisując ścieżkę do zmiennej HISTFILE. U mnie ma ona wartość:

$ echo $HISTFILE
/home/owca/.bash_history

Po wyświetleniu tego pliku widać całą historię poleceń. Po dłuższym korzystaniu z systemu, wydawałoby się, że plik ten będzie miał ogromne rozmiary. Jednak Bash, korzystając ze zmiennych HISTSIZE oraz HISTFILESIZE usuwa stare polecenia z historii i wstawia tam nowe. Podane zmienne określają liczbowo długość historii oraz maksymalną ilość linii które może pomieścić plik HISTFILE i powinny mieć takie same wartości, gdyż mogłoby to doprowadzić do obcięcia pliku z historią i utraty części poleceń.

Zachowaniem mechanizmu historii można częściowo sterować poprzez zmienną HISTCONTROL. Po nadaniu jej wartości ignorespace, historia nie będzie zapamiętywała poleceń zaczynających się od spacji. Przypisanie jej ignoredups sprawi, że wpisanie polecenia identycznego jak poprzednio wpisany również nie zostanie zapamiętane. Wpisanie ignoreboth łączy obie poprzednie właściwości. Jeśli HISTCONTROL nie będzie miała przypisanej żadnej wartości lub będzie ona inna od już wymienionych, o tym czy polecenie powinno być zapamiętane świadczyć będzie tylko wartość zmiennej HISTIGNORE. Użytkownik ustala w niej oddzielone dwukropkami wzorce (korzystając z wyrażeń regularnych o których będzie później) dla poleceń które powinny być zapamiętane.

POTOKI I PRZEKIEROWYWANIE

Bash oferuje możliwość zapisywania rezultatów poleceń do pliku, wczytywania danych z pliku oraz przekazywania wyników do innych poleceń. Wszystkie te mechanizmy są bardzo proste w obsłudze. Aby zapisać wynik komendy do pliku posługujemy się metaznakiem „>”, np.:

$ seq 999 > plik
$ echo plik
...

Wynik polecenia seq (wypisującego liczby od 1 do podanej jako argument (w tym przypadku 999)) został zapisany do pliku. Wykonaj teraz to samo polecenie, tylko z niższym parametrem. Zawartość pliku została nadpisana. Gdy chcemy dopisać coś na końcu pliku, musimy użyć podwójnego metaznaku „>>” np.:

$seq 100 >> plik

Spora część programów korzysta z tzw. wyjścia błędów. Służy ono do wypisywania błędów oraz danych diagnostycznych. Dane te możemy przekierować do innego pliku poprzez metaznak „2>” np.:

$ ls
Desktop śmieci
$ rm nieistniejący\ plik 2> wyjscie.err
$ cat wyjscie.err
rm: cannot remove `nieistniejący plik': No such file or directory

Dane można również wczytywać. Służy do tego metaznak „<” np.:

$ cat wejscie
wiersz1
wiersz2
wiersz3
wiersz4
wiersz5
wiersz6
wiersz7
wiersz8
wiersz9
wiersz10
$ head -n 3 < wejscie
wiersz1
wiersz2
wiersz3

Przekazał on do programu head zawartość pliku wejscie.

Jeśli chcemy przekazać wynik jednego programu do drugiego możemy użyć mechanizmu potoku. Znak | (umieszczony z reguły pod lub nad enterem na klawiaturze) wstawiony pomiędzy dwoma poleceniami przekaże wynik działania jednego polecenia do drugiego np.:

$ cat plik
fsdfs
xcvz
gdfg
cxvg
oin
agff
$ cat plik | sort
agff
cxvg
fsdfs
gdfg
oin
xcvz

Program cat w drugim poleceniu odczytał zawartość pliku, ale nie wysłał go na ekran tylko do programu sort. Ten z kolei posortował alfabetycznie zawartość i wyświetlił na ekranie.
Potoki to bardzo wygodne narzędzia. Oto niektóre z zastosowań.

Do wygodnego przeglądania długich plików i wyników pleceń możemy wykorzystać program less, more itp., np.:

$ cat /etc/bash.bashrc | less

Jeśli chcemy z długiego polecenia wyciągnąć tylko linijki z podanym ciągiem tekstu, wykorzystajmy do tego grep-a:

$ dpkg -l


$ dpkg -l | grep nvidia
ii nvidia-cg-toolkit 2.0.0012.deb6 NVIDIA Cg Toolkit Installer

Jeśli zawartość pliku powinna być posortowana, posłużmy się sort-em:

$ cat lista\ osób
Nowak Andrzej
Kamieniecki Jan
Wrocławska Barbara
Osińska Monika
Adamczyk Maciej
$ cat lista\ osób | sort
Adamczyk Maciej
Kamieniecki Jan
Nowak Andrzej
Osińska Monika
Wrocławska Barbara
$ cat lista\ osób
Nowak Andrzej
Kamieniecki Jan
Wrocławska Barbara
Osińska Monika
Adamczyk Maciej

Sztuczki w Bashu, część pierwsza

Posted on sierpień 4, 2008
Filed Under Linux, Programowanie | Leave a Comment

Bash jest domyślną powłoką wielu systemów operacyjnych. Na co dzień korzysta z niej wiele osób, które mozolnie wklepują polecenia wykorzystując praktycznie wyłącznie tabulator, jako ułatwienie swojej pracy. Na szczęście powłoka oferuje wiele udogodnień które naprawdę potrafią umilić życie.

EDYCJA WIERSZA

Chyba najważniejszym faktem, którego musisz być świadomy jest to, że sposób edycji wiersza nie jest przypadkowy. Otóż bash korzysta domyślnie z edytora wiersza wziętego z emacs-a. Dzięki temu użytkownik ma do dyspozycji szereg udogodnień zaimplementowanych w tym edytorze. Możemy przez to wykorzystać między innymi następujące skróty (nie wszystkie pochodzą od emacs-a):

Alt+f lub Ctrl+→ - przesuniecie kursora o jeden wyraz dalej
Alt+b lub Ctrl+← - przesunięcie kursora o jeden wyraz wstecz
Ctrl+a lub Home – przejście na początek wiersza
Ctrl+e lub End – przejście na koniec wiersza
Ctrl+k – usuwanie wszystkiego od kursora do końca linii
Ctrl+u – usuwanie wszystkiego od początku linii do kursora
Ctrl+w – usuwanie słowa znajdującego się na lewo od kursora
Alt+d – usuwanie słowa znajdującego się na prawo od kursora
Ctrl+l – wyczyszczenie całego ekranu
Ctrl+t – zamiana miejscami sąsiadujących z kursorem znaków
Alt+t – zamiana miejscami sąsiadujących z kursorem słów
Alt+u – zamienia słowo na prawo od kursora na pisane wielkimi literami
Alt+l – zamienia słowo na prawo od kursora na pisane małymi literami
Alt+c – zamienia pierwszy znak wyrazu na prawo od kursora na wielką literę, a pozostałe na małe
Ctrl+Shift+- – cofa ostatnio wykonaną operację

Jeśli bardzo Ci przeszkadza sposób edycji wiersza, to możesz do tego wykorzystać inny edytor taki jak np. vi. Uzyskasz to poprzez wydanie polecenia set -o vi. Teraz jakakolwiek edycja będzie możliwa po wejściu w tryb wstawiania, a wszelkie ułatwienia uzyskasz w trybie poleceń, po naciśnięciu klawisza Esc.

ZMIENNE

Zapewne wiesz, że bash umożliwia definiowanie zmiennych. Wykonując polecenie typu:

$ZMIENNA=tekst

nakazujemy bashowi stworzenie nowej zmiennej (lub nadpisanie już istniejącej) o nazwie ZMIENNA (w poleceniu nie może występować spacja; sprawdź co się stanie gdy ją podasz przed i po znaku równości). Teraz w naszych poleceniach wpisanie nazwy zmiennej poprzedzone znakiem dolara ($ZMIENNA) poskutkuje zamianą zmiennej na jej wartość np.:

$ TEKST=słowo
$ echo $SŁOWO
słowo

Jeśli chcemy do zmiennej przypisać kilka słów powinniśmy treść umieścić pomiędzy znakami “” lub ” np.:

$ ZMIENNA=”w Szczebrzeszynie chrząszcz brzmi w trzcinie”
$ echo $ZMIENNA
w Szczebrzeszynie chrząszcz brzmi w trzcinie

Czym się różni sposób z cudzysłowem od apostrofu? W przypadku cudzysłowów możemy wewnątrz używać innych zmiennych np.:

$ TEKST=”jakiś tekst”
$ ZMIENNA1=”to jest $TEKST”
$ ZMIENNA2='to jest $TEKST'
$ echo $ZMIENNA1
to jest jakiś tekst
$ echo $ZMIENNA2
to jest $TEKST

Do zmiennych możemy tez przypisywać wynik działania jakiegoś polecenia np.:

$ CYFERKI=`seq 10`

W tym przypadku wykorzystuje się odwrócony apostrof, który znajdziemy na przycisku z tyldą, pod Esc.

Jeśli chcemy wykorzystać jakąś zmienną w potomnych powłokach powinniśmy ją wyeksportować poleceniem export np.:

TEXT=”jakiś tekścik”
export TEXT

Możemy to wykonać od razu:

export FOLDER=”/var/www”

Należy pamiętać, że zmienna w powłoce potomnej jest kopią oryginału i zmiana wartości jednej z nich nie wpływa na drugą.

Zmienną – gdy nie jest już potrzebna – usuwamy poleceniem unset np.:

unset CYFERKI ZMIENNA ZMIENNA1 ZMIENNA2

Do czego w ogóle wykorzystuje się zmienne? Za ich pomocą sterujemy ustawieniami wielu programów. W zmiennych ustawiamy zestaw znaków wykorzystywany przez użytkownika, zachowanie mechanizmu historii poleceń (o tym będzie później), domyślny edytor wykorzystywany do edycji pliku /etc/sudoers itp. Zastosowań jest bardzo wiele. Praktyczne przykłady przedstawię już wkrótce.

Ściąganie z rapida pod Linuksem

Posted on sierpień 4, 2008
Filed Under Programowanie | 1 Comment

Osoby które posiadają konto premium na rapidshare.com i zarazem są użytkownikami Linuksa mają pewien problem ze ściąganiem wielu plików. Można co prawda do ściągania wykorzystać przeglądarkę internetową, ale w przypadku długiej listy plików jest to niewygodne. Kolejnym rozwiązaniem które przychodzi na myśl jest wykorzystanie jakiegoś menadżera ściągania z Windows poprzez Wine. Jest to jakieś rozwiązanie, bo sam z niego korzystałem przez jakiś czas. Najlepszą jednak alternatywą jest wykorzystanie do ściągania plików tekstowego programu wget. Całość sprowadza się do wklepania takiego polecenia:

$ wget -c --http-user=użytkownik --http-passwd=hasło --auth-no-challenge
↳link1 link2 link3

Gdzie -c oznacza wznawianie połączenia (jeśli byśmy ściągali pliki na raty)­, –http-user służy do podania nazwy użytkownika na rapidshare, a –http-passwd jego hasła. Parametr –auth-no-challenge oznacza przesyłanie nazwy użytkownika oraz hasła jako zwykły, niezaszyfrowany tekst. Opcja ta została dodana w wersji 1.11.1 programu (wcześniej jej działanie było jedynym możliwym) i nie jest zalecana (prawdopodobnie nie mamy tu wyboru). Na chwilę obecną nie wiem jak przesłać login i hasło zaszyfrowane (jeśli ktoś wie jak to zrobić, proszę o informację). Kolejne parametry to oczywiście linki do plików które chcemy ściągać. Możemy podać ich dowolną ilość pamiętając, aby rozdzielić je przecinkami.

Symfonia C++

Posted on sierpień 4, 2008
Filed Under Książki, Programowanie | Leave a Comment

W drugiej klasie technikum do mojego zestawu przedmiotów szkolnych dołączył nowy - programowanie strukturalne i obiektowe. Przez całe pierwsze półrocze “uczyłem się” Pascala, by w kolejnym półroczu mieć już jakiekolwiek podstawy do nauki zdecydowanie lepiej rozwiniętego języka - C++. Na jednej z pierwszych lekcji nauczycielka poleciła nam książkę do nauki - Symfonię C++ autorstwa Jerzego Grębosza (pozdro dla autora). Zebraliśmy w klasie chętnych do zakupu tej książki.

Po kilku dniach książka była już w moich rękach. Po jakimś czasie przeczytałem ją całą i o dziwo nie miałem z jej zrozumieniem najmniejszych problemów (przynajmniej nic sobie nie przypominam). Wkrótce, w ramach przypomnienia przeczytałem ja ponownie i byłem już pewny, że kupno tej książki było mądrym wyborem. Za cenę 80zł (twarda okładka) otrzymałem ogromną porcję łatwo przyswajalnej wiedzy o języku C++.

Książka opisuje znaczną część języka w sposób bardzo przystępny. Po jej przeczytaniu mamy wrażenie że autor jest moim wieloletnim przyjacielem. Co trudniejsze tematy zostały porównane do rzeczywistości, aby czytelnik mógł łatwiej pojąć na czym polega dana technika. Podejście to jest genialne, ale niespotykane w innych książkach. Zakres materiału jest bardzo szeroki, więc książka została podzielona na dwa tomy. Z książki dowiemy się między innymi o:

  • operatorach
  • instrukcjach sterujących
  • typach danych i operatorach
  • funkcjach
  • tablicach
  • wskaźnikach
  • klasach
  • dziedziczeniu i polimorfizmie
  • przeładowywaniu funkcji i operatorów
  • bibliotekach string i wejścia/wyjścia
  • sterowaniu preprocesorem
  • projektowaniu orientowanym obiektowo

Każdy z tematów jest opisany bardzo szczegółowo z wyróżnieniem zagadnień których znajomość nie jest obowiązkowa. Książkę czyta się lekko, bez znudzenia. Przy odpowiednich warunkach można się zaczytać na kilka godzin (czego miałem okazję doświadczyć). Zawarte w książce przykłady są często rozwiązaniami problemów z którymi autor spotkał się w swojej pracy. Aby sprawdzić stopień opanowania nowo nabytej wiedzy, można wykonywać ćwiczenia, które znajdują się na końcu każdego z rozdziałów.

Podsumowując, książkę mogę polecić każdemu kto chce zacząć swoją przygodę z C++, ale nie wie od czego zacząć. Po przeczytaniu jej, czytelnik nie będzie miał już problemu z samodzielnym tworzeniem aplikacji. Będzie w stanie zrozumieć dokumentację większości zewnętrznych bibliotek i skorzystać z nich.

« go back
wholesale cell phone chargers vinnica