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

  1. Co to jest shell (strona 1)
  2. Powłoka bash – konfiguracja (strona 1)
  3. Ustawianie zmiennych środowiskowych powłoki bash (strona 1)
  4. Lista najważniejszych zmiennych środowiskowych (strona 1)
  5. Komendy w Linuksie
  6. Skrypty powłoki bash
  7. Inne ciekawostki które mogą się przydać

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

KomendaPrzykład użyciaOpis
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

KomendaPrzykład użyciaOpis
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