Konfiguracja powłoki (shella) w Linuksie i podstawowe komendy, strona 2
Poradnik dla tych, którzy korzystają z jakiegoś shella na Linuksie i nie wiedzą jak poprawnie skonfigurować polskie znaki, ustawić domyślny edytor, czy odpalić coś z automatu po zalogowaniu. Ponadto przedstawiłem kilka podstawowych komend, które ułatwią początkującym pracę w systemie Linux.
Spis treści
Komendy w Linuksie
Może to nie należy już do konfiguracji samego shella, ale czasem warto kilka poznać. Dzięki nim wiele rzeczy będziesz w stanie zrobić znacznie szybciej. Ale zanim poznasz komendy, warto wiedzieć co nieco o strumieniach wejścia/wyjścia.
Przekierowanie strumienia wejścia/wyjścia
W systemie Linux istnieją trzy podstawowe strumienie, na których mogą operować programy. Strumień standardowego wejścia STDIN jest strumieniem, na którym do programu dostarczane są dane np. z klawiatury. Strumień standardowego wyjścia STDOUT to strumień danych wyrzucanych przez program, domyślnie wyświetlane są one w konsoli. Strumień błędów STDERR jest strumieniem, na który powinny trafiać wszystkie informacje o błędach, domyślnie jego zawartość jest wyświetlana w konsoli. Istotnym jest fakt, że strumienie można przekierowywać.
Przekierowanie z i do pliku
Aby przekierować zawartość strumienia wyjścia (domyślnie STDOUT) do pliku, należy użyć znaku większości. Przykład: grep TODO plik.c > todo.txt
– spowoduje wrzucenie do pliku todo.txt wszystkich linijek pliku plik.c, które zawierają słowo TODO. Bez przekierowania, zostałyby one wyświetlone w konsoli. Jeśli plik todo.txt istniał wcześniej, zostanie nadpisany. Aby do niego dopisać na końcu, a nie nadpisać, należy użyć podwójnego znaku większości, czyli grep TODO plik.txt >> todo.txt
.
Jeśli chcemy przekierować do pliku zawartość strumienia błędów (domyślnie STDERR), należy lekko zmodyfikować nasz przykład: grep TODO plik.c 2> bledy.txt
– w tym przypadku plik bledy.txt będzie pusty, bo nie było żadnych błędów. Można przekierować zarówno strumień wyjścia jak i błędów jako grep TODO plik.c > todo.txt 2>bledy.txt
– błędy trafią do pliku bledy.txt, a interesujące nas linijki do todo.txt.
Jeśli chcemy przekierować na wejście (domyślnie STDIN) jakiegoś programu zawartość pliku, można to zrobić następująco: md5sum < plik.c
– zawartość pliku plik.c zostanie przekierowana na wejście programu md5sum (liczącego sumę MD5 tego co dostanie), więc na wyjściu dostaniemy sumę MD5 zawartości pliku plik.c. Można to połączyć np. z przekierowaniem wyjścia do pliku jako md5sum < plik.c > md5_plik.c.txt
– w pliku md5_plik.c.txt będziemy mieć sumę MD5 pliku plik.c.
Przekierowanie strumienia z programu do programu
Aby przekierować wyjście (domyślnie STDOUT) jednego programu na wejście (domyślnie STDIN) drugiego programu, należy użyć znaku pipe, np. grep TODO plik.c | less
– do programu less trafią (do podglądu) te linijki pliku plik.c, które zawierają słowo TODO. Jeśli plik wejściowy zawiera wiele takich linijek, polecenie ma całkiem spory sens :)
Przekierowania można kontynuować dalej: grep TODO plik.c |grep -v "code review" |less
– wszystkie linijki pliku plik.c zawierające słowo TODO, zostaną przekierowane na wejście drugiej instancji programu grep, która odfiltruje te linijki, które zawierają ciąg „code review”, a wszystkie pozostałe zostaną przekierowane na wejście programu less.
Dla użytkowników edytora vim może się okazać istotną informacja, że można do niego przekierować wyjście jakiegoś polecenia w celu późniejszej edycji i np. zapisania na dysku. Przykład: grep -n TODO *.c |vim -
(istotny jest oczywiście argument minus).
Odwrócony apostrof
Odwrócony apostrof pełni bardzo ważną rolę w uruchamianych poleceniach basha. Przy jego pomocy można zawartość wyjścia jednego programu podać jako argument do innego. Uruchomienie echo Jestem w katalogu `pwd`
spowoduje wyświetlenie komunikatu w stylu „Jestem w katalogu /home/leniwy/podkatalog”. Zawartość wyjścia polecenia pwd (czyli nazwa bieżącego katalogu) została podana jako czwarty argument programu echo.
Komendy operacji na plikach i strumieniach
Komenda | Przykład użycia | Opis |
---|---|---|
cd | cd /home cd ~/ |
Zmienia katalog bieżący na podany |
cd - |
Zmienia katalog bieżący na poprzedni katalog, w którym się znajdowałeś | |
cd |
Uruchomione bez parametru, zmienia bieżący katalog na katalog domowy użytkownika | |
mkdir | mkdir ~/abc mkdir abc |
Tworzy nowy katalog |
pwd | pwd | Wyświetla bieżący katalog (print working directory) |
cp | cp plik1 plik2 | Kopiuje plik1 pod nazwą plik2; pliki mogą być podane przez ścieżki względne lub bezwzględne |
mv | mv plik1 plik2 | Przenosi plik lub katalog, lub zmienia jego nazwę |
ls | ls -alh ~/ | Podaje na wyjściu listę plików w podanym katalogu |
find | find . -type f -name "*.txt" | Szuka w określonej ścieżce (kropka oznacza katalog bieżący) plików |
ln | ln -s plik1 plik2 | Tworzy link (lub link symboliczny jeśli podano opcję -s) |
chmod | chmod o-rwx | Zmienia prawa dostępu do pliku. Warto poczytać: man chmod |
chown | chown login1:grupa1 plik | zmienia właściciela i/lub grupę pliku |
cat |
cat <plik> |
Podaje na wyjściu zawartość pliku. Jeśli plik jest długi, będzie wyświetlony cały, bez możliwości przewijania po treści |
zcat | zcat <plik> | Jak wyżej, tylko dla plików skompresowanych (np. tarem) |
less | less <plik> |
Wyświetla zawartość pliku, z możliwością przewijania po treści. Po wciśnięciu Ctrl+f na bieżąco doczytuje zmiany w pliku |
cat <plik> | less |
Wyświetla zawartość otrzymaną na strumieniu wejścia – w tym przykładzie zawartość „wyrzuconą” przez polecenie cat |
|
grep |
grep <słowo> <plik> |
Podaje na wyjściu te linijki pliku <plik>, które zawierają <słowo> (można podać frazę, ujmując ją w cudzysłów) |
cat <plik> | grep <słowo> | Efekt ten sam co powyżej, ale mniej wydajnie. Ważne jest, że grep może czytać ze strumienia wejścia a nie pliku |
|
egrep/rgrep |
egrep <wyrażenie> plik |
Wersja rozszerzona grep’a – zamiast słowa może być wyrażenie regularne |
echo |
echo "jakiś tekst" |
Podaje na wyjściu to, co dostało jako argument |
echo $USER |
Podaje na wyjściu wartość zmiennej środowiskowej USER |
|
head |
head -20 <plik> |
Podaje na wyjściu pierwsze N linijek (tu: 20) danego pliku |
grep <słowo> plik |head -20 | Podaje na wyjściu pierwsze N linijek (tu: 20) z tego, co dostało na wejściu | |
tail | tail -20 <plik> | Podaje na wyjściu ostatnie N linijek (tu: 20) danego pliku |
grep <słowo> plik |tail -20 | Podaje na wyjściu ostatnie N linijek (tu: 20) z tego, co dostało na wejściu | |
which | which grep | Podaje pełną ścieżkę do komendy systemowej |
whereis | whereis grep | Lokalizuje plik binarny, źródłowy lub manual o podanej nazwie |
wc | wc -l <plik> | Zlicza ilość bajtów, linii, słów w danym pliku (opcja -l ogranicza tylko do zliczania linii) |
grep TODO <plik> |wc -l | Zlicza ilość bajtów, linii, słów w strumieniu wejścia (opcja -l ogranicza tylko do zliczania linii) | |
md5sum | md5sum plik | Oblicza sumę MD5 podanego pliku |
echo "abc" |md5sum | Oblicza sumę MD5 danych podanych na wejściu |
Inne przydatne komendy
Komenda | Przykład użycia | Opis |
---|---|---|
man | man passwd | Wyświetla pomoc danego polecenia. Aby poczytać więcej: man man |
passwd | passwd |
Zmienia hasło użytkownika |
ps | ps fux | Podaje na wyjściu listę procesów; w przykładzie: procesów użytkownika |
kill | kill 12345 | Zabija proces systemu. Można zabić tylko własne procesy (aby wyświetlić: ps ux ) |
clear | clear | Czyści okienko terminala |
history | history |grep ls |tail -20 | Podaje na wyjściu historię używanych poleceń |
date | date | Podaje na wyjściu datę; różne opcje mogą ją formatować lub wybrać konkretny dzień |
uptime | uptime | Podaje na wyjściu informacje o czasie działania systemu, ilości użytkowników i obciążeniu serwera |
uname | uname -a | Podaje informacje o jądrze systemu |
host | host leniwy.eu | Narzędzie do pobierania danych z DNS |
top | top -d 2 | Wyświetla (i odświeża) listę procesów systemu |
w | w | Podaje informacje o zalogowanych użytkownikach |
du | du -sch ~/ | Oblicza wielkość plików podanych jako parametry |
df | df -h | Wyświetla informacje o zamontowanych systemach plików |
iconv | iconv -f iso-8859-2 -t utf-8 plik > plik2 | Zamienia sposób kodowania znaków dla danego pliku i wynik podaje na wyjściu |
mc | mc | Uruchamia menadżer plików, wizualnie podobny do Nortona Commandera pod DOS-em |
ssh | ssh login@server.domena | Nawiązuje połączenie ssh do konkretnego serwera, na konkretnego użytkownika |
scp | scp <plik> login@server.domena: | Kopiuje połączeniem szyfrowanym plik na zdalny serwer (lub ze zdalnego serwera) |
screen | screen -S kopiowanie | Uruchamia menadżer okien wirtualnych, który można zostawić działający w tle. Warto poczytać man screen |
lynx | lynx http://leniwy.eu | Uruchamia tekstową przeglądarkę WWW |
links | links http://leniwy.eu | Uruchamia tekstową przeglądarkę WWW, trochę bardziej zaawansowaną od lynx’a |
Aliasy
Do konkretnych poleceń (wraz z argumentami) można tworzyć aliasy. Jeśli np. często wywołujesz polecenie find . -type f -name "*.h"
, możesz zrobić sobie do niego alias poprzez uruchomienie: alias find_h='
find . -type f -name "*.h"
'
. Teraz możesz uruchomić find_h
, co spowoduje wywołanie polecenia find, szukającego w bieżącym katalogu (i podkatalogach) plików *.h. Zapis zdecydowanie krótszy.
Historia poleceń
Jeśli już raz wywoływałeś jakieś złożone polecenie, możesz je ponownie uruchomić, przeszukując historię poleceń. W bashu wciśnij Ctrl+r
, a następnie wpisz kilka pierwszych liter Twojego polecenia. Jeśli jest ono w historii, powinno się pojawić. Aby dla wpisanych liter szukać kolejnego polecenia w historii, powtórz Ctrl+r
.
Całą historię możesz oczywiście zobaczyć przy pomocy polecenia history
.
Skrypty powłoki bash
Bash, tak jak każda inna powłoka, pozwala na pisanie skryptów. Nie da się napisać jakiegoś bardzo zaawansowanego programu w czystym bashu, ale do wielu rzeczy się bardzo dobrze nadaje: umożliwia interakcję przez wprowadzanie danych z klawiatury, można robić pętle i instrukcje warunkowe – w sam raz do prostych rzeczy. Ponadto nic nie stoi na przeszkodzie, żeby w skrypcie bashowym odpalić jakiś program i wynik jego działania obrabiać dalej.
Nie będę się rozpisywał nad tym co się da zrobić i jak to zrobić, bo to nie temat na ten artykuł, ale dla zachęty możesz zerknąć na przykładowy skrypt. Jak po samym kodzie nie wiesz jeszcze co robi – skopiuj do siebie i odpal :)
Przykładowy skrypt
#!/bin/bash
echo s. Listowanie rozmiarow
echo l. Listowanie wszystkich informacji o plikach
echo c. Listowanie plikow C
echo Prosze wprowadzic opcje:
read wybor
case $wybor in
s) ls -s;;
l) ls -l;;
c) ls *.c;;
*) echo Bledna opcja
esac
Inne ciekawostki które mogą się przydać
Pętla for podana „z palca”
Jeśli chodzi o wiersz poleceń, jak wiadomo można z jego poziomu odpalić jakiś program, czy wywołać komendę systemową. Ale nic nie stoi na przeszkodzie, żeby zrobić coś bardziej zaawansowanego – można np. odpalić prostą pętelkę for: for plik in `ls -1 *.txt`; do iconv -f iso-8859-2 -t utf-8 $plik > utf8_$plik; done
– dla każdego pliku w katalogu bieżącym odpali program iconv, który przekonwertuje plik z kodowania iso-8859-2 na utf-8 i zapisze pod nazwą taką jak plik wejściowy, ale z prefiksem utf8_.
Problem z konsolowym mysql i historią zapytań
Jak ktoś korzysta z konsolowego klienta bazy MySQL, to być może na jakimś serwerze trafił na problem z działaniem skrótu Ctrl+r, przywołującego z historii wykonywane wcześniej zapytanie. Podobno (tak wyczytałem kiedyś na jakimś forum) jest to związane ze zmianą biblioteki libreadline na libedit. Aby przywrócić działanie Ctrl+r, załóż plik ~/.editrc i wpisz nim:
bind "^R" em-inc-search-prev