MC, 20:52 sobota, 26.05.2012 r.
Ilustracja do artykułu: Linux - Jak zagnieździć komendy w innej komendzie terminala

Linux - Jak zagnieździć komendy w innej komendzie terminala

Ten artykuł poświęcony zostanie zagadnieniu zagnieżdżania komend na systemach Linux. Przy okazji dotkniemy również tematu używania polecenia date i formatowania jego wyników, oraz pokażemy jak periodycznie wykonywać kolejne kopie zapasowe wskazanego pliku.

O co chodzi w zagnieżdżaniu poleceń?

Przejdźmy od razu do meritum. Zagnieżdżanie komend polega na użyciu rezultatu jednej komendy, wewnątrz wywołania drugiej, również jako jednego z wielu fragmentów. Na pewno nie brzmi to zrozumiale, ale przykład, który przytoczę za moment, na pewno wyklaruje sprawę. Nim jednak to nastąpi, należy wspomnieć o bardzo ważnej rzeczy, jaką jej sposób użycia zagnieżdżeń. Otóż zagnieżdżenie umieszcza się wewnątrz znaków ``, które nie są apostrofami! Znak ` dostępny jest na tym samym przycisku co tylda/falka ~. Dobrze, teraz możemy przejść do przykładu.
Polecenie whoami zwraca nam nazwę zalogowanego użytkownika:
$ whoami
mateusz
Wykorzystajmy to w następujący sposób: przejdziemy do głównego katalogu systemu, a następnie przejdziemy do katalogu naszego użytkownika, używając zagnieżdżonego polecenia whoami.
$ cd /
$ cd /home/`whoami`/
Jak widać wykorzystaliśmy to co zwróciło polecenie whoami jako fragment wywołania polecenia cd. Oto czym jest zagnieżdżanie, które tak ciężko opisać słowami, ale i którego prostotę obnaża dowolny przykład.

Jak wykorzystać zagnieżdżanie?

Myślę, że nietrudno się domyślić, że zagnieżdżanie jest bardzo wygodną i często używaną opcją podczas pracy z terminalem. Ja chciałbym pokazać przykład, który uważam za ciekawy a przy tym praktyczny. Wyobraźmy sobie, że pracujemy nad jakimś plikiem tekstowym o nazwie dokument.txt i jest on dla nas na tyle ważny, że chcielibyśmy co jakiś zdefiniowany czas robić jego kopię zapasową, ale w taki sposób, by poprzednie kopie również się zachowały na wypadek konieczności powrotu do którejś z nich (czyli interesuje nas taki wyciosany krzemieniem system kontroli wersji). Oczywiście jesteśmy zbyt leniwi, żeby robić to ręcznie, a właściwie nie po to mamy komputer, żebyśmy musieli robić to ręcznie. Zatem do 60 sekund kopiujmy edytowany plik do innej lokacji, do jego nazwy dołączając datę i czas wykonania kopii.

Pomocne nam będzie polecenie date. Zobaczmy co zwraca:

$ date
sob, 26 maj 2012, 20:33:54 CEST
Widać, że zwraca wszystko, co nam potrzebne, a nawet więcej, dlatego zdefiniujmy format, jaki chcemy uzyskać i wykorzystać w nazwie pliku kopii.
$ date +%d.%m.%Y-%H:%M:%S
26.05.2012-20:34:58
Znacznie lepiej. Mamy już wszystko, co nam potrzeba do wykonania zamierzonego zadania. Stwórzmy więc skrypt o nazwie backup.sh i zawartości:
#!/bin/bash/

cp $1 /ścieżka_do_trzymania_kopii_zapasowych/$1_`date +%d.%m.%Y-%H:%M:%S`
echo "Wykonano kopię zapasową: $1 -> $1_`date +%d.%m.%Y-%H:%M:%S`"
Skrypt jest bardzo prosty. Użyta zmienna $1 będzie pierwszym parametrem wywołania naszego skryptu, czyli nazwą pliku, którego kopię chcemy wykonać. Jak widać do nazwy pliku dokleimy datę uzyskaną za pomocą zagnieżdżenia polecenia date. Pamiętajmy o podaniu poprawnej ścieżki do katalogu, w którym chcemy trzymać kopie zapasowe!

Skoro mamy gotowy skrypt, sprawdźmy jak działa:

$ sh backup.sh dokument.txt
Wykonano kopię zapasową: dokument.txt -> dokument.txt_26.05.2012-20:45:38
Jak widać, skrypt zadziałał zgodnie z naszym oczekiwaniem.

Jak zapętlić wykonywanie kopii?

Jakiś czas temu pisałem na temat polecenia watch, które umożliwia wykonywanie programów i skryptów co pewien, zdefiniowany czas (Linux watch). Nada się ono tutaj idealnie. Wydajmy więc polecenie, by móc cieszyć się automatycznie wykonywanymi kopiami zapasowymi co 60 sekund.
watch -n 60 -x sh backup.sh dokument.txt

Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!

Imię:
Treść: