Skrypty sieciowe Bash. Inne przydatne programy Czym są i-węzły?

Ogólne zmienne środowiskowe
PATH — Ustawia ścieżkę wyszukiwania dla dowolnego wykonywalnego polecenia. Podobny do zmiennej PATH w MSDOS.
HOME — katalog domowy użytkownika.
POCZTA — zawiera ścieżkę do miejsca przechowywania poczty użytkownika.
IFS — zawiera ciąg znaków, które są używane jako ograniczniki w wierszu poleceń. Wiersz zwykle składa się ze spacji, tabulatorów i nowej linii. Aby je zobaczyć, będziesz musiał zrobić zrzut ósemkowy w ten sposób:

$ echo $IFS | od-bc

PS1 i PS2 - Główny i dodatkowy monit w bash. PS1 jest domyślnie ustawione na $, a PS2 jest ustawione na ">". Aby zobaczyć drugorzędne, po prostu uruchom polecenie:

$$ls |

I naciśnij Enter.

USER - nazwa użytkownika logowania.
TERM - wskazuje typ używanego terminala. Musi być poprawnie skonfigurowany, aby edytory takie jak vi działały poprawnie.
SHELL — określa typ powłoki, którą widzi użytkownik podczas logowania.
Uwaga: Aby dowiedzieć się, jakie są wartości powyższych zmiennych środowiskowych, uruchom polecenie echo z nazwą zmiennej zaczynającą się od $. Na przykład:

$ echo $USER
Ravi

Pobierz wartość przechowywaną w zmiennej USER.

Niektóre zasady skryptowania powłoki bash
1) Pierwsza linia twojego skryptu powinna wyglądać tak:

#!/kosz/bash

Czyli najpierw #, potem!, potem ścieżka do powłoki. Ta linia pozwala poznać lokalizację pliku powłoki.

2) Przed wykonaniem skryptu należy uczynić skrypt wykonywalnym. Odbywa się to za pomocą następującego polecenia:

$ chmod ugo+x twój_skrypt_powłoki.sh

3) Zwykle skrypt ma rozszerzenie .sh. Dzięki temu użytkownik wie, że plik jest skryptem.

Wyrażenia warunkowe
oświadczenie „jeśli”


jeśli warunek_jest_prawdziwy
następnie
wykonywać polecenia
w przeciwnym razie
wykonywać polecenia
fi

jeśli pozwala również na gałęzie. Oznacza to, że możesz ocenić wiele warunków, jeśli poprzednie warunki zostały odrzucone.


jeśli warunek_jest_prawdziwy
następnie
wykonywać polecenia
elif inny_stan_jest_prawdziwy
następnie
wykonywać polecenia
w przeciwnym razie
wykonywać polecenia
fi


jeśli grep "linuxhelp" ten plik.html
następnie
echo "Znaleziono słowo w pliku"
w przeciwnym razie
echo "Przepraszam, nie ma szczęścia!"
fi

jeśli jest uzupełniony opcją -test Test oceni wyrażenie po prawej stronie i zwróci prawdę lub fałsz. Używane są do tego następujące operatory:

Operatory porównania

-eq Równa się
-le Mniejsze lub równe

Testuj pliki plik x plik p plik x - plik x - plik d plik-s Prawda, jeśli plik istnieje i ma rozmiar większy niż zero.

-f plik Prawda, jeśli plik istnieje i jest zwykłym plikiem
-r plik Prawda, jeśli plik istnieje i można go odczytać
-w plik Prawda, jeśli plik istnieje i jest zapisywalny
-x plik Prawda, jeśli plik istnieje i jest wykonywalny
-d plik Prawda, jeśli plik istnieje i jest katalogiem
-s plik Prawda, jeśli plik istnieje i jest większy niż
niż zero.

Testowanie ciągów

-n str Prawda, jeśli str nie jest null
-z str Prawda, jeśli str jest null
str1 == str2 Prawda, jeśli oba ciągi są równe
str1 != str2 Prawda, jeśli ciągi nie są równe
str Prawda, jeśli ciąg str ma przypisaną wartość
i nie równe null

Test pozwala również przetestować więcej niż jedno wyrażenie w tym samym wierszu.

-a To samo co AND
-o To samo co OR

Test $d -eq 25 ; echo $d

Co oznacza, że ​​jeśli wartość w zmiennej d wynosi 25, wypisujemy wartość w.

Przetestuj $s -lt 50; zrób_coś, jeśli [ $d -eq 25 ]
następnie
echo $d
fi

W powyższym przykładzie użyłem nawiasów kwadratowych zamiast słowa kluczowego test - jest to inny sposób na zrobienie tego samego.


if [ $str1 == $str2 ]
następnie
Zrób coś
fi

if [ -n "$str1" -a -n "$str2" ]
następnie
echo "Zarówno $str1 i $str2 nie są puste"
fi

Jeśli oba ciągi nie są puste, wykonaj polecenie echo. Kilka rzeczy do zapamiętania podczas używania test Jeśli używasz nawiasów kwadratowych zamiast test, musisz wstawić spację po [ i przed ]. Uwaga: test testuje tylko wartości całkowite. Jedynki ułamkowe są po prostu obcinane. Nie używaj masek do testowania równości ciągów.

Instrukcja case jest drugą instrukcją warunkową obsługiwaną przez powłokę. Składnia:

wyrażenie wielkości liter w
wzorzec1) wykonuj polecenia ;;
wzorzec2) wykonuje polecenia ;;
...
esac

Słowa kluczowe to case i esac. ";;" używany jako opcja zakończenia. Używa również ")", aby oddzielić szablon od akcji. Przykład:

...
echo "Wpisz swoją opcję: "
przeczytaj ja;

przypadek $i w
1) ls-1;;
2) ps-aux ;;
3) datę;;
4) kto;;
5) wyjście
esac

Uwaga: w tym ostatnim przypadku;; nie wymagane, ale jeśli chcesz, możesz je umieścić. Oto kolejny przykład:

przypadek `data |wytnij -d" " -f1` in
Pn) polecenia ;;
Wt) komendy ;;
Śr) komendy ;;
...
esac

Case obsługuje również więcej niż jeden wzorzec na przypadek w wyrażeniu. Do dopasowywania wzorców można również używać symboli wieloznacznych.

...
echo "Czy chcesz kontynuować? (t/n)"
przeczytaj i

przypadek $ans in
Y|y ;;
) ;;
N|n ) wyjście ;;
) Wyjście ;;
* ) echo "Nieprawidłowe polecenie"
esac

W powyższym przypadku, jeśli wpiszesz TAK, TAK, TAK lub dowolną ich kombinację, wartość zostanie znaleziona.

Cykle
Cykl podczas gdy
Składnia:

podczas gdy warunek_jest_prawdziwy
robić
wykonywać polecenia
Gotowe
podczas gdy [ $liczba -gt 100 ]
robić
spać 5
Gotowe

podczas gdy:
robić
wykonać kilka poleceń
Gotowe

Powyższy kod implementuje nieskończoną pętlę. Możesz również napisać „gdy fair” zamiast „a:”. W tym miejscu chciałbym przedstawić dwa słowa kluczowe w związku z zapętleniem warunkowym. Zrywają się i kontynuują. Break — to słowo kluczowe powoduje wyjście kontrolki z pętli. next — to słowo kluczowe wstrzymuje wykonywanie wszystkich instrukcji znajdujących się po nim i przełącza sterowanie na początek pętli do następnej iteracji.
Cykl aż do
Pętla jest wykonywana, dopóki wyrażenie nie stanie się fałszywe. Składnia:

aż do fałszu
robić
wykonywać polecenia
Gotowe
...
do [ -r mój plik ]
robić
spać 5
Gotowe

Powyższy kod jest powtarzany aż do odczytania pliku myfile.
Cykl dla
Składnia:

dla zmiennej na liście
robić
wykonywać polecenia
Gotowe
...
dla x w 1 2 3 4 5
robić
echo "Wartością x jest $x";
Gotowe

Wydrukuj pięć liczb od 1 do 5. Oto kolejny przykład:

dla var w $PATH $MAIL $HOME
robić
echo $zmienna
Gotowe

Załóżmy, że masz katalog z plikami java i chcesz je skompilować. Możesz napisać taki skrypt:

...
dla pliku w *.java
robić
javac $plik
Gotowe

Uwaga: W skryptach możesz używać wyrażeń z symbolami wieloznacznymi.

Kilka znaki specjalne i ich wartości skryptów powłoki w.r.t

$* - Oznacza to, że wszystkie parametry są przekazywane do skryptu
w momencie jego wykonania.. W tym 1 $, 2
i tak dalej.
$0 — nazwa wykonywanego skryptu.
$# — liczba argumentów określonych w wierszu poleceń.
$? - Status wyjścia ostatniego polecenia.

Powyższe symbole są znane jako parametry pozycyjne. Pozwólcie, że wyjaśnię parametry pozycyjne na przykładzie. Załóżmy, że mam skrypt o nazwie my_script.sh. Teraz wykonajmy ten skrypt w wierszu poleceń w następujący sposób:

$ ./mój_skrypt.sh linux to solidny system operacyjny

Jak widać powyżej określiłem 5 parametrów skryptu. Zgodnie z tym skryptem wartości parametrów pozycyjnych są następujące: $ * - "linux "," is "," "," zaufany "," OS". $0 - my_script.sh - nazwa wykonywanego skryptu. $ # - $ $ - 1 $ - 2 $ - $* - będzie zawierało wartości „linux","is","a","robust","OS".
$0 — będzie zawierał wartość my_script.sh — nazwę skryptu w czasie wykonywania.
$# - zawiera wartości 5 - całkowita liczba parametrów.br>

$$ — Zawiera identyfikator procesu bieżącej powłoki. Możesz użyć tej opcji, aby jednoznacznie nazwać dowolne pliki tymczasowe tworzone w czasie wykonywania.

$1 - zawiera wartości "linux"
$2 - zawiera wartość "jest"

$ ustaw `datę`
$ echo $1
$ echo $*
$ echo $#
$ echo $2

zmiana Przykład:

$ ustaw `datę`
$ echo $1 $2 $3
$przesunięcie
$ echo $1 $2 $3
$przesunięcie
$ echo $1 $2 $3

Aby znaleźć identyfikator procesu bieżącej powłoki, spróbuj wykonać następujące czynności:

$ echo $$
2667

Aby sprawdzić, czy jest to ta sama wartość, uruchom następujące polecenia:

$ ps -f |grep bash

Operator czytać
Spraw, aby Twój skrypt był interaktywny. read pozwoli użytkownikowi wprowadzać wartości podczas działania skryptu. Gdy program czeka na dane wejściowe, zatrzymuje się. Identyfikator wprowadzony z klawiatury jest odczytywany i program jest kontynuowany.
Na przykład:

#!/kosz/sz
echo "Wpisz swoje imię: "
przeczytaj imię
echo "Witaj $name , miłego dnia."

Status wyjścia ostatniego polecenia

Każde polecenie zwraca wartości po wykonaniu. Ta wartość jest nazywana kodem zakończenia lub wartością zwracaną przez polecenie. Polecenie zgłasza prawdę, jeśli się powiedzie, i fałsz, jeśli nie. Można to sprawdzić w skrypcie za pomocą $?.

Zaktualizowano: 07 października 2009 r. Wyświetlenia: 10041

Po przeczytaniu tego artykułu dowiesz się, co to jest grzmotnąć(standardowa powłoka linux), dowiedz się, jak obsługiwać standardowe polecenia: ls, cp, mv...zrozumieć przeznaczenie i-węzłów, twardych i symbolicznych dowiązań i nie tylko.

Ten samouczek jest przeznaczony dla tych, którzy są nowicjuszami w Linuksie i chcą przejrzeć lub poprawić swoje zrozumienie podstawowych pojęć Linuksa, takich jak kopiowanie i przenoszenie plików, tworzenie łączy, używanie standardowych poleceń Linuksa wraz z przekierowaniami i potokami. W tym artykule znajdziesz wiele przykładów wyjaśniających prezentowany materiał. Dla początkujących większość informacji będzie nowa, ale dla bardziej zaawansowanych użytkowników ten materiał może być doskonałym narzędziem do podsumowania posiadanej wiedzy i umiejętności.

Wprowadzenie do bash

Powłoka

Jeśli używasz Linuksa, to wiesz, że po zalogowaniu zostaniesz przywitany przez znak zachęty interpretera poleceń. Na przykład to:

\$

Jeśli po zalogowaniu ładowana jest powłoka graficzna, to aby dostać się do interpretera poleceń, musisz uruchomić emulator terminala (gnome-terminal, xfce4-terminal, konsole, xterm, rxvt...) lub przełączyć się na jeden z terminali wirtualnych przez pilny klawisz kontrolnyAltF1 lub klawisz kontrolnyAltF2 itp.

Monit powłoki na twoim komputerze może różnić się od tego, co pokazano w przykładzie. Może zawierać nazwę użytkownika, nazwę komputera i nazwę bieżącego katalogu roboczego. Ale pomimo tych wszystkich różnic program, który wyświetla ten monit, nazywa się „ powłoka" (powłoka) i najprawdopodobniej twoja powłoka to program o nazwie grzmotnąć.

Prowadzisz bash?

Możesz sprawdzić, czy bash działa za pomocą następującego polecenia:

\$ echo \$SHELL/bin/bash

Jeśli pojawi się błąd w wyniku wykonania tego polecenia lub jego dane wyjściowe różnią się od tego w przykładzie, możliwe, że bash nie jest używany jako powłoka poleceń w twoim systemie. Mimo to większość materiałów będzie istotna, ale nadal zalecamy przejście na bash. Można to zrobić (jeśli w systemie jest zainstalowany bash) za pomocą polecenia:

\$ grzmotnąć

Co to jest bash

Bash (akronim dla „ B nasz- a osiągać CII ell") jest standardowym interpreterem poleceń w większości systemów Linux. Jest odpowiedzialny za przetwarzanie i wykonywanie poleceń, którymi użytkownik steruje komputerem. Po zakończeniu pracy możesz wyjść z procesu interpretera poleceń. Po naciśnięciu klawiszy klawisz kontrolnyD, polecenia Wyjście lub Wyloguj proces powłoki zostanie zakończony, a ekran ponownie poprosi o podanie nazwy użytkownika i hasła.

Korzystanie z „cd”

Zacznijmy używać bash do nawigacji w systemie plików. Aby rozpocząć, wpisz następujące polecenie:

$ płyta CD /

Za pomocą tego polecenia powiedzieliśmy bashowi, że chcemy przejść do katalogu głównego - / . Wszystkie katalogi w systemie są zorganizowane w strukturę drzewa i / to jest jego początek (lub korzeń). Zespół płyta CD służy do zmiany bieżącego katalogu roboczego.

Sposoby

Aby dowiedzieć się, gdzie w systemie plików się aktualnie znajdujesz (bieżący katalog roboczy), wpisz:

\$ pwd /

W powyższym przykładzie / - argument polecenia płyta CD- nazywa ścieżka. To jest lokalizacja systemu plików, do której chcemy się przenieść. W tym przypadku / - ścieżka bezwzględna, co oznacza, że ​​ścieżka jest względna do katalogu głównego.

Ścieżki absolutne

Oto kilka przykładów ścieżek absolutnych

/dev /usr /usr/bin /usr/local/bin

Jak mogłeś zauważyć, wszystkie te ścieżki łączy fakt, że zaczynają się od / . Określanie ścieżki /usr/local/bin jako argumentu polecenia płyta CD mówimy mu, aby przeszedł do katalogu głównego / , potem do katalogu usr, potem do lokalnego i bin. Ścieżki absolutne zawsze zaczynają się od /

Ścieżki względne

Drugi rodzaj ścieżek nazywa się względnymi. grzmotnąć, zespół płyta CD a inne polecenia liczą te ścieżki względem bieżącego katalogu. Względne ścieżki nigdy nie zaczynają się od / . Na przykład, jeśli jesteśmy w /usr

\$ cd /usr

Następnie możemy przejść do /usr/local/bin przy użyciu ścieżki względnej

\$ lokalna płyta CD/bin \$ pwd/usr/local/bin

Stosowanie ".."

Ścieżki względne mogą zawierać jeden lub więcej katalogów ".." . „..” wskazuje katalog nadrzędny naszego katalogu roboczego. Przykład:

\$ pwd/usr/local/bin\$ płyta CD.. \$ pwd/usr/lokalny

Jak widać polecenie płyta CD..„przenosi nas na wyższy poziom”.

Mogę dodać .. do ścieżki względnej. Spowoduje to przeniesienie do katalogu, który jest na tym samym poziomie, co ten, w którym się znajdujemy. Przykład:

\$ pwd/usr/lokalny\$ cd ../udostępnij \$ pwd/usr/share

Przykłady z wykorzystaniem ścieżek względnych

Ścieżki względne mogą być dość trudne. Oto kilka przykładów. Wynik wykonania poleceń nie jest wyświetlany, spróbuj określić, w którym katalogu się znajdziesz, używając basha.

\$ cd /bin \$ cd ../usr/share/zoneinfo \$ cd /usr/X11R6/bin \$ cd ../lib/X11 \$ cd /usr/bin \$ cd ../bin/../bin

Katalog roboczy "."

Zanim skończysz mówić o zespole płyta CD, należy wspomnieć o kilku innych rzeczach. Po pierwsze, jest inny specjalny katalog "." , który wskazuje na bieżący katalog. Ten katalog jest używany do uruchamiania plików wykonywalnych znajdujących się w bieżącym katalogu.

\$ ./myprog

W ostatnim przykładzie myprog jest plikiem wykonywalnym w bieżącym katalogu, który zostanie wykonany.

cd i katalog domowy użytkownika

Aby przejść do katalogu domowego, wpisz

\$ płyta CD

Bez argumentów cd przeniesie cię do twojego katalogu domowego. Dla superużytkownika katalogiem domowym jest zwykle /root, a dla zwykłych użytkowników jest to /home/nazwa_użytkownika/. Ale co, jeśli chcemy określić konkretny plik znajdujący się w katalogu domowym. Na przykład jako argument do programu "mojprog"? Możesz pisać:

\$ ./myprog /home/user/myfile.txt

Jednak korzystanie z bezwzględnych ścieżek plików nie zawsze jest wygodne. Tę samą operację można wykonać za pomocą ~ –tyldy:

\$ ./mójprog ~/mójplik.txt

~ to specjalna nazwa, która wskazuje na katalog domowy użytkownika w bash.

Katalogi domowe innych użytkowników

Ale co, jeśli musimy wskazać plik w katalogu domowym innego użytkownika? Aby to zrobić, po tyldzie musisz podać nazwę tego użytkownika. Na przykład, aby wskazać plik fredsfile.txt znajdujący się w katalogu domowym użytkownika fred:

\$ ./myprog ~fred/fredsfile.txt

Polecenia Linuksa

Wprowadzenie do ls

Prawdopodobnie znasz już drużynę ls, który wywołany bez argumentów wyświetla listę plików przechowywanych w katalogu roboczym:

\$ cd /usr \$ ls X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 include libexec portage share tmp distfiles i686-linux info lokalne portage.old src

Jeśli określisz opcję -a, będziesz mógł zobaczyć wszystkie pliki, w tym ukryte (którego nazwy zaczynają się od kropki).

\$ ls-a. bin gentoo-x86 include libexec portage share tmp .. distfiles i686-linux info lokalne portage.old src X11R6 doc i686-pc-linux-gnu lib man sbin ssl

Szczegółowa lista katalogów

Po komendzie ls jako argument można podać jeden lub więcej plików lub katalogów. Jeśli podasz nazwę pliku, to polecenie ls wyświetli informacje tylko o tym pliku. A jeśli podasz nazwę katalogu, ls pokaże całą jego zawartość. Opcja „-l” polecenia ls może być bardzo przydatne, jeśli chcesz wiedzieć więcej niż tylko nazwy plików dokładna informacja o nich (uprawnienia do pliku, nazwa właściciela, czas ostatniej modyfikacji pliku i jego rozmiar).

Poniższy przykład pokazuje użycie opcji „-l” aby wyświetlić informacje o plikach przechowywanych w katalogu /usr

\$ ls -l / usr drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles lrwxrwxrwx 1 root root 9 22 grudnia 20:57 doc -> share/doc drwxr-xr-x 62 root root 1856 27 grudnia 15:54 gentoo-x86 drwxr-xr-x 4 root root 152 12 grudnia 23:10 i686-linux drwxr-xr-x 4 root root 96 Lis 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 root root 5992 Gru 24 22:30 include lrwxrwxrwx 1 root root 10 Dec 22 20:57 info -> share/info drwxr-xr -x 28 root root 13552 Dec 26 00:31 lib drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec drwxr-xr-x 8 root root 240 Dec 22 20:57 local lrwxrwxrwx 1 root root 9 Dec 22 20 :57 man -> share/man lrwxrwxrwx 1 root root 11 grudnia 8 07:59 portage -> gentoo-x86/ drwxr-xr-x 60 root root 1864 8 grudnia 07:55 portage.old drwxr-xr-x 3 root root 3096 22 grudnia 20:57 sbin drwxr-xr-x 46 root root 1144 24 grudnia 15:32 udostępnij drwxr-xr-x 8 root root 25 ssl lrwxrwxrwx 1 root root 10 22 grudnia 20:57 tmp -> ../var/tmp

Pierwsza kolumna zawiera informacje o uprawnieniach dla każdego pliku na liście. (Nieco później wyjaśnię, która litera oznacza co). Następna kolumna pokazuje liczbę linków do każdego elementu listy. Trzecia i czwarta kolumna to odpowiednio właściciel i grupa pliku. Piąta kolumna to rozmiar. Szósty to czas ostatniej modyfikacji pliku („czas ostatniej modyfikacji” lub mtime). Ostatnia kolumna to nazwa pliku lub katalogu (jeśli jest to link, to po znaku „ –> „ to nazwa obiektu, do którego się odnosi).

Jak przeglądać tylko katalogi

Czasami istnieje potrzeba przeglądania informacji tylko o katalogach, a nie o całej ich zawartości. Opcja pomoże w tym zadaniu. "-d", który mówi poleceniu, aby wyświetlało tylko informacje o katalogach. Przykład:

\$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share drwxr-xr-x 4 root root 96 18 grudnia 18:17 ../share drwxr-xr-x 17 root root 576 24 grudnia 09:03 /usr /X11R6/bin drwxr-xr-x 2 root root 14576 27 grudnia 08 :56 /usr/bin

Lista rekurencyjna i informacje o i-węźle

Akcja opcji "-R" działanie przeciwne "-d". Pozwala na rekurencyjne wyświetlanie informacji o plikach w katalogu. Zawartość katalogu jest pokazana jako pierwsza. Najwyższy poziom, następnie po kolei zawartość wszystkich podkatalogów i tak dalej. Dane wyjściowe tego polecenia mogą być dość duże, więc nie podajemy jego przykładu, ale możesz spróbować samodzielnie, wpisując „ ls -R" lub " ls-RL".

I wreszcie opcja "-i" używany do wyprowadzania i-węzłów każdego obiektu systemu plików.

\$ ls -i / usr 1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 lokalny 13408 udostępnij 8316 pliki dystrybucyjne 1517 include 776 man 23779 src 43 doc 1386 info 93892 portage 36737 ssl 70786 15. gentoo- 784 tmp

Czym są i-węzły?

Każdy obiekt systemu plików (plik, katalog...) ma swój własny unikalny numer zwany i-węzeł(numer i-węzła). Ta informacja może wydawać się nieistotna, ale zrozumienie funkcji i-węzłów pomoże ci zrozumieć wiele operacji na systemie plików. Na przykład spójrzmy na "." oraz ".." jak linki obecne w każdym katalogu. Aby zrozumieć, czym jest katalog ".." , znajdź i-węzeł katalogu /use/local

\$ ls -id /usr/local 5120 /usr/lokalny

Jak widać, i-węzeł katalogu /usr/local to 5120. Zobaczmy teraz, jaki i-węzeł ma katalog /usr/local/bin/..:

\$ ls -id /usr/local/bin/.. 5120 /usr/lokalny/bin/..

Okazuje się, że i-węzły katalogów /usr/local i /usr/local/bin/.. są takie same! Oznacza to, że dwie nazwy odnoszą się do i-węzła 5120: /usr/local i /usr/local/bin/.. To znaczy, są to dwie różne nazwy dla tego samego katalogu. Każdy i-węzeł wskazuje określoną lokalizację na dysku.

Z każdym i-węzłem może być powiązanych wiele nazw obiektów systemu plików. Liczba „synonimów” pliku (obiekty systemu plików odnoszące się do jednego i-węzła) pokazuje liczbę w drugiej kolumnie „ ls-l".

\$ ls -dl /usr/local drwxr-xr-x 8 root root 240 22 grudnia 20:57 /usr/local

W tym przykładzie widać (druga kolumna), że do katalogu /usr/local odwołuje się 8 różnych obiektów systemu plików. Oto ich imiona:

/usr/lokalny /usr/lokalny/. /usr/local/bin/.. /usr/local/games/.. /usr/local/lib/.. /usr/local/sbin/.. /usr/local/share/.. /usr/local/ nauka/..

mkdir

Rzućmy okiem na polecenie mkdir. Służy do tworzenia nowych katalogów. Poniższy przykład demonstruje tworzenie trzech nowych katalogów (tic, tac, toe) w katalogu /tmp

\$ cd /tmp $ mkdir kółko i krzyżyk

Domyślne polecenie mkdir nie można utworzyć zagnieżdżonej struktury katalogów. Dlatego jeśli potrzebujesz utworzyć kilka katalogów zagnieżdżonych ( wspaniale), wtedy będziesz musiał wywołać to polecenie trzy razy po kolei:

\$ mkdir wygrał/der/pełny mkdir: nie można utworzyć katalogu "won/der/ful": Brak takiego pliku lub katalogu \$ mkdir wygrał \$ mkdir wygrał/der \$ mkdir wygrał/der/pełny

Możesz uprościć tę operację, dodając opcję "-p" do polecenia mkdir. Ta opcja umożliwia utworzenie zagnieżdżonej struktury katalogów:

\$ mkdir -p łatwe/jako/pie

Aby dowiedzieć się więcej o możliwościach tego narzędzia, przeczytaj pomoc wywoływaną przez polecenie mężczyzna mkdir. Pomoc jest dostępna dla prawie wszystkich poleceń w tym podręczniku (na przykład mężczyzna jest), Oprócz płyta CD, dlatego jest wbudowany w bash (dla takich poleceń pomoc nazywa się tak: CD z pomocą)

dotykać

Przejdźmy do nauki poleceń cp oraz mv, używany do kopiowania, zmiany nazwy i przenoszenia plików i katalogów. Ale wcześniej utwórzmy pusty plik w katalogu /tmp za pomocą polecenia dotykać:

\$ cd /tmp \$ dotknij kopiuj

Zespół dotykać aktualizuje czas ostatni dostęp do pliku (szósta kolumna wyjścia polecenia) ls-l), jeśli już istnieje, lub tworzy nowy pusty plik, jeśli jeszcze nie istnieje. Po tej operacji powinniśmy mieć pusty plik /tmp/kopiuj.

Echo

Teraz, gdy mamy pusty plik, napiszmy do niego ciąg tekstowy za pomocą polecenia Echo, który wypisuje przekazany do niego argument na standardowe wyjście (w naszym przypadku terminal tekstowy).

\$ echo "pierwszy plik" pierwszy plik

Aby zapisać ciąg do naszego pliku, przekierowujemy do niego wyjście polecenia Echo:

\$ echo "pierwszy plik" > kopiuj

Podpisać > (więcej) wskazuje powłokaże musisz przekierować dane wyjściowe polecenia po lewej stronie do pliku, którego nazwa znajduje się po prawej stronie. Jeśli plik o tej samej nazwie nie istnieje, zostanie utworzony automatycznie. A jeśli taki plik już istnieje, to zostanie nadpisany (cała jego zawartość zostanie usunięta przed zapisaniem naszej linii). Zespół „ls-l” pokaże, że rozmiar naszego pliku wynosi teraz 10 bajtów - dziewięć bajtów zajmuje słowo "pierwszy plik", a jeden bajt to znak nowego wiersza.

\$ ls -l kopiuj-rw-r--r-- 1 root root 10 grudnia 28 14:13 copyme

kot i cp

Aby wyświetlić zawartość pliku na terminalu, użyj polecenia kot:

\$ kot kopia pierwszy plik

Teraz możemy zacząć analizować podstawową funkcjonalność polecenia cp. To polecenie przyjmuje dwa argumenty. Pierwsza to nazwa już istniejącego pliku ("copyme"), druga to nazwa nowej kopii, którą chcemy wykonać ("copyme").

\$ cp copyme skopiowane

Możemy się upewnić, że nowa kopia plik ma inny numer i-węzła (oznacza to, że otrzymaliśmy naprawdę nowy oddzielny plik, a nie tylko link do starego)

\$ ls -i kopiuję skopiowany 648284 kopia

mv

Teraz zastosujmy polecenie mv zmienić nazwę pliku ("copiedme" –> "movedme"). Numer i-węzła po tej operacji nie zmienia się, zmienia się tylko nazwa pliku.

\$ mv skopiował-mnie-przeniósł-mnie \$ ls - przeniosłem się 648284 przeniósł mnie

Numer i-węzła nie zmienia się, chyba że plik o zmienionej nazwie pozostaje w tym samym systemie plików, co plik oryginalny. W dalszej części tego samouczka przyjrzymy się bliżej rozmieszczeniu systemów plików.

Zespół mv pozwala nie tylko zmieniać nazwy plików, ale także je przenosić. Na przykład, aby przenieść plik /var/tmp/mojplik.txt do katalogu /dom/użytkownik musisz wydać polecenie:

\$ mv /var/tmp/mójplik.txt /home/użytkownik

Plik zostanie przeniesiony do katalogu domowego użytkownika użytkownik nawet jeśli znajduje się w innym systemie plików (w tym przypadku plik zostanie skopiowany do nowej lokalizacji, a oryginał zostanie usunięty). Jak można się domyślić, przeniesienie pliku do innego systemu plików zmienia jego i-węzeł. Dzieje się tak, ponieważ każdy system plików ma własny zestaw i-węzłów.

Należy zauważyć, że istnieje możliwość, że nowy przypisany numer i-węzła może być taki sam jak stary, ale jest bardzo mały.

Aby przenieść kilka plików jednocześnie do jednego katalogu, musisz napisać:

\$ mv /var/tmp/mójplik1.txt /var/tmp/mójplik2.txt /home/użytkownik \$ mv -t /home/user /var/tmp/mójplik1.txt /var/tmp/mójplik2.txt

Jeśli dodasz opcję "-v", na ekranie zostanie wyświetlony raport z wykonanej operacji:

\$ mv -vt /home/user /var/tmp/mójplik1.txt /var/tmp/mójplik2.txt"/var/tmp/mójplik1.txt" -> "/home/user/mójplik1.txt" "/var/tmp/mójplik2.txt" -> "/home/użytkownik/mójplik2.txt"

Tworzenie linków i usuwanie plików

Twarde linki

Wspomniałem już o słowie „link”, kiedy mówiłem o katalogach i i-węzłach. W Linuksie są właściwie dwa rodzaje łączy. Pierwszy typ to dowiązania twarde. Z każdym i-węzłem może być powiązanych wiele łączy twardych. Okazuje się więc, że plik występuje w systemie pod kilkoma różnymi nazwami. Plik istnieje tak długo, jak co najmniej jedna nazwa jest powiązana z jego i-węzłem. Terminy „twarde łącze do pliku” i „nazwa pliku” są synonimami. Nowe twarde dowiązania do pliku można utworzyć za pomocą polecenia ja

\$ cd /tmp \$ dotknij pierwszego linku \$ W pierwszym linku drugim linku \$ ls -i pierwsze łącze drugie łącze 15782 pierwsze ogniwo 15782 drugie ogniwo

Jak widać na przykładzie, dowiązania twarde działają na poziomie i-węzła, wskazując na określony plik. W systemie Linux dowiązania twarde mają kilka ograniczeń. Po pierwsze, możesz tylko dołączyć pliki, a nie katalogi. Zgadza się, pomimo faktu, że w systemie są twarde linki do katalogów (" . " oraz " .. "), nawet superużytkownik nie może tworzyć dodatkowych twardych dowiązań do katalogów. Po drugie, niemożliwe jest utworzenie twardego dowiązania do pliku znajdującego się w innym systemie plików, ponieważ każdy system plików ma swój własny, unikalny zestaw i-węzłów.

Dowiązania symboliczne

W praktyce dowiązania symboliczne (lub dowiązania symboliczne). Dowiązanie symboliczne to specjalny rodzaj pliku, który łączy się z innym plikiem według nazwy, a nie bezpośrednio do i-węzła. Dowiązania symboliczne nie uniemożliwiają usunięcia pliku. Jeśli plik zostanie usunięty, dowiązanie symboliczne do niego przestanie działać (lub złamany).

Dowiązania symboliczne są tworzone przez polecenie ja z opcją "-s":

\$ ln -s drugie łącze trzecie łącze \$ ls -l pierwsze dowiązanie drugie dowiązanie trzecie dowiązanie-rw-rw-r-- 2 agriffis agriffis 0 31 grudnia 19:08 pierwszy link -rw-rw-r-- 2 agriffis agriffis 0 31 grudnia 19:08 drugi link lrwxrwxrwx 1 agriffis agriffis 10 31 grudnia 19:39 trzeci link -> drugi link

Dowiązanie symboliczne można rozpoznać po danych wyjściowych polecenia ls-l: po pierwsze, w pierwszej kolumnie dowiązań symbolicznych znajduje się litera „ja”(pierwsza litera angielskiego słowa link to link), a po drugie, rozmiar dowiązania symbolicznego jest równy liczbie liter w nazwie pliku, do którego się odnosi ( "drugi link" w naszym przypadku), po trzecie, ostatnia kolumna, oprócz nazwy linku, zawiera po znaku nazwę pliku, do którego się odnosi –>

Więcej o dowiązaniach symbolicznych

Rozważmy sytuację, w której chcemy utworzyć dowiązanie symboliczne, które wskazuje na /usr/local/bin i znajduje się w katalogu /tmp/. Możemy pisać:

\$ ln -s /usr/local/bin bin1 \$ ls -l bin1 lrwxrwxrwx 1 root root 14 stycznia 1 15:42 bin1 -> /usr/local/bin \$ ln -s ../usr/local/bin bin2 \$ ls -l bin2 lrwxrwxrwx 1 root root 16 stycznia 1 15:43 bin2 -> ../usr/local/bin \$ ls -l bin2 lrwxrwxrwx 1 root root 16 stycznia 1 15:43 bin2 -> ../usr/local/bin \$ mkdir mójnowydir \$ mv bin2 mynewdir \$ cd mynewdir \$ pojemnik na cd2 bash: cd: bin2: Brak takiego pliku lub katalogu

Ponieważ nie ma katalogu /tmp/usr/local/bin/, nie możemy zmienić katalogu roboczego na bin2; innymi słowy, po przeprowadzce łącze przestało działać (stało się „zepsute”).

Z tego powodu czasami warto unikać tworzenia dowiązań symbolicznych za pomocą ścieżek względnych. Ale czasami jest to wygodne. Rozważmy następujący przypadek: powiedzmy, że chcemy utworzyć link do programu w /usr/bin (lub innymi słowy nadać temu programowi alternatywną nazwę):

# ls -l /usr/bin/brelok-rwxr-xr-x 1 root root 10150 12 grudnia 20:09 /usr/bin/keychain

Superużytkownik (root) może chcieć połączyć się z programem „brelok” o krótszej nazwie „kc”. W tym przykładzie mamy dostęp do systemu jako root, o czym świadczy zmiana bash na "#" . Potrzebujemy uprawnień administratora, ponieważ normalni użytkownicy nie mogą tworzyć plików w katalogu /usr/bin/. Teraz możemy stworzyć alternatywną nazwę dla naszego programu w imieniu roota:

# cd /usr/bin # ln -s /usr/bin/brelok kc # ls -l brelok-rwxr-xr-x 1 root root 10150 12 grudnia 20:09 /usr/bin/keychain # ls -l kc lrwxrwxrwx 1 root root 17 marca 27 17:44 kc -> /usr/bin/keychain

W tym przykładzie stworzyliśmy dowiązanie symboliczne kc odnoszące się do /usr/bin/keychain.

# mv /usr/bin/brelok /usr/bin/kc /usr/local/bin # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 marca 27 17:44 kc -> /usr/bin/keychain

Ponieważ podczas tworzenia łącza użyliśmy ścieżki bezwzględnej, nadal wskazuje ona na plik /usr/bin/keychain, który już nie istnieje. Ale gdybyśmy użyli ścieżki względnej podczas tworzenia linku, to nadal działałoby.

Często oba rodzaje dowiązań symbolicznych (bezwzględne i względne oraz ścieżki) działają dobrze. Poniższy przykład pokazuje sposób tworzenia dowiązania symbolicznego, które nadal działa po przeniesieniu go i pliku, do którego się odnosi, do innego katalogu:

# cd /usr/bin # ln -s brelok kc # ls -l kc lrwxrwxrwx 1 root root 8 stycznia 5 12:40 kc -> pęk kluczy # mv keychain kc /usr/local/bin # ls -l /usr/local/bin/brelok-rwxr-xr-x 1 root root 10150 12 grudnia 20:09 /usr/local/bin/keychain # ls -l /usr/local/bin/kc lrwxrwxrwx 1 root root 17 marca 27 17:44 kc -> pęk kluczy

Teraz możemy uruchomić program "brelok", otwierając go jako /usr/local/bin/kc

rm

Teraz, gdy wiemy, jak działają polecenia cp, mv oraz ja czas nauczyć się usuwać pliki. Zwykle usuwanie odbywa się za pomocą polecenia rm. Aby usunąć wiele plików, po prostu podaj ich nazwy oddzielone spacjami w wierszu poleceń jako argumenty rm:

\$ cd /tmp \$ dotknij plik1 plik2 \$ ls -l plik1 plik2-rw-r--r-- 1 root root 0 sty 1 16:41 plik1 -rw-r--r-- 1 root root 0 sty 1 16:41 plik2 \$ rm plik1 plik2 \$ ls -l plik1 plik2 ls: plik1: Brak takiego pliku lub katalogu ls: plik2: Brak takiego pliku lub katalogu

Zapamietaj to usunięte pliki niemożliwe do odzyskania (choć możesz spróbować). Dlatego wielu początkujących użytkowników Linuksa korzysta z tej opcji "-i" polecenia rm, co wymaga, aby użytkownik został poproszony o potwierdzenie usunięcia każdego pliku.

\$ rm -i plik1 plik2 rm: usunąć zwykły pusty plik `file1"? tak rm: usunąć zwykły pusty plik `file2"? tak

W ostatnim przykładzie, przed usunięciem każdego pliku, polecenie rm pyta: czy użytkownik naprawdę chce usunąć plik? Aby potwierdzić usunięcie należy żmudnie nacisnąć klawisz „y” na klawiaturze, a odmowy skasowania - klawisz "n".

Możesz przerwać wykonywanie dowolnego polecenia (jeśli coś poszło nie tak zgodnie z przeznaczeniem), naciskając kombinację klawisz kontrolnyC.

Spraw, aby polecenie rm poprosiło o potwierdzenie usunięcia każdego pliku, nawet bez opcji "-i" można dodać do pliku ~/.bashrc używając ulubionej linii edytora tekstu:

alias rm="rm -i"

rmdir

Są dwa sposoby usuwania katalogów: możesz usunąć całą zawartość katalogu jeden po drugim, a następnie użyć polecenia rmdir aby usunąć sam katalog:

\$ mkdir mydir \$ dotknij mójkatalog/plik1 \$ rm mójkatalog/plik1 \$ rmdir mydir

Ta metoda jest powszechnie nazywana „metodą przegranego usuwania katalogów”. O wiele wygodniej jest używać polecenia "rm -rf" aby usunąć katalog z całą jego zawartością.

\$ rm -rf mydir

Używaj tego polecenia ostrożnie, ponieważ niedoświadczonemu administratorowi (zwłaszcza z prawami roota) bardzo łatwo jest złamać drewno opałowe (i systemy Linux) z jego pomocą.

Korzystanie z symboli wieloznacznych

Czym są symbole wieloznaczne

W codziennym użytkowaniu Linuksa często pojawiają się sytuacje, kiedy trzeba je wykonać prosta obsługa(jak rm) w wielu plikach. W takim przypadku nie jest zbyt wygodne, aby wyświetlić wszystkie nazwy plików w wierszu poleceń:

\$ rm plik1 plik2 plik3 plik4 plik5 plik6 plik7 plik8

Możesz rozwiązać ten problem za pomocą wzorców zastępczych (wildcards). Powłoka Linuksa obsługuje możliwość określania wielu plików za pomocą symboli wieloznacznych (zwanych również „globbingiem” ze względów historycznych). Bash i inne polecenia Linuksa wybierają tylko pliki pasujące do wzorca. Tak więc, jeśli chcesz usunąć pliki z pliku 1 do pliku 8, napisałbyś:

\$ plik rm

A jeśli potrzebujesz usunąć wszystkie pliki, których nazwy zaczynają się od słowa plik i pliku o nazwie plik:

\$ plik rm*

Próbka * dopasowuje dowolny znak, sekwencję znaków lub „brak znaku”. Oczywiście wzorców można używać nie tylko do usuwania plików, co zostanie pokazane poniżej.

Jeśli nie znaleziono dopasowania

Jeśli chcesz wyświetlić listę plików w katalogu /etc/, których nazwy zaczynają się na literę "g" i plik o nazwie "g" (jeśli istnieje), napisałbyś:

\$ ls -d /etc/g*/etc/gconf /etc/ggi /etc/gimp /etc/gnome /etc/gnome-vfs-mime-magic /etc/gpm /etc/group /etc/group-

Zobaczmy, co się stanie, jeśli określisz wzorzec, który nie pasuje do żadnej z nazw plików:

\$ ls -d /usr/bin/asdf*jkl ls: /usr/bin/asdf*jkl: Brak takiego pliku lub katalogu

W tym przykładzie próbowaliśmy wyświetlić listę plików, których nazwy zaczynają się od „asdf” i kończą na „jkl”. Interpreter poleceń przekazał komunikat, że nie znaleziono plików o takich nazwach.

Składnia szablonu: * i?

Przyjrzeliśmy się, jak działa globbing (podstawianie nazw plików). Przyjrzyjmy się teraz bliżej składni szablonu:

* dopasowuje zero lub więcej znaków:

  • /itd/g*- wszystkie pliki w katalogu /etc/, których nazwy zaczynają się od "g" i plik o nazwie "g".
  • /tmp/moj*1- wszystkie pliki w katalogu /tmp, których nazwy zaczynają się na "my" i kończą na "1" (w tym plik o nazwie "my1")

? zastępuje dowolny pojedynczy znak:

  • mój plik?- dowolny plik, którego nazwa zaczyna się od słowa "myfile", po którym następuje jeden znak.
  • /tmp/notes?txt- dopasowuje pliki o nazwach "notes.txt" i "notes_txt" (jeśli istnieją w /tmp/).

Nawiasy kwadratowe:

Szablon „” jest bardzo podobny do „ ? ", ale umożliwia jawne określenie zestawu znaków. Wzorzec "" dopasowuje jeden znak spośród znaków podanych w nawiasach. Możesz także określić zakres znaków w nawiasach (w tym celu używany jest znak -/myślnik) lub kilka zakresów z rzędu, wtedy wzór będzie pasował do dowolnego znaku z tego zakresu:

  • mój plik- pasuje do myfile1 i myfile2. Szablon będzie działał tak długo, jak będzie istniał co najmniej jeden z tych dwóch plików.
  • Hangeog- dopasowuje pliki o nazwach Changelog, ChangeLog, changeLog i changelog. Jak być może zauważyłeś, użycie symbolu wieloznacznego jest przydatne podczas wyszukiwania nazw różniących się wielkością liter.
  • ls /etc/*- wyświetl listę plików w katalogu /etc/, których nazwy zaczynają się od cyfry.
  • ls /tmp/*- wyświetlić listę plików w katalogu /tmp/, których nazwy zaczynają się od litery (wielka lub mała)

Konstrukcja [ jest podobna do , z tą różnicą, że dopasowuje pojedynczy znak niewymieniony pomiędzy [[ oraz ] . Na przykład:

  • rm mójplik[- usunie wszystkie pliki, których nazwy składają się ze słowa "myfile", po którym następuje pojedyncza liczba, z wyjątkiem pliku "myfile9".

Przykłady użycia

Oto kilka przykładów korzystania z szablonów. Ponieważ bash interpretuje znaki ? , [ , ] , * jako wzorce zastępcze, należy zachować ostrożność podczas używania argumentów zawierających te znaki. Na przykład, jeśli chcesz utworzyć plik zawierający wiersz „ * ”, to następujące polecenie nie zrobi tego, czego chcesz:

\$ echo * > /tmp/mójnowyplik.txt

Jeśli twój katalog roboczy zawiera jeden lub więcej plików, których nazwy pasują do wzorca " * ", znajdziesz w /tmp/mynewfile.txt listę ich nazw, a nie napis " * ". Ale jak osiągnąć to, czego chcieliśmy? Pierwszym sposobem jest umieszczenie ciągu w pojedynczych cudzysłowach. Bash traktuje ciąg w pojedynczym cudzysłowie tak, jakby był to normalny ciąg tekstowy i nie rozszerza znaków zastępczych.

\$ echo "*" > /tmp/mójnowyplik.txt

Po wykonaniu tego polecenia Twój plik będzie zawierał wiersz „ * zgodnie z oczekiwaniami. Innym sposobem jest uniknięcie znaków specjalnych za pomocą odwrotnego ukośnika ( \ ). Odwrotny ukośnik poprzedzający znak specjalny mówi interpreterowi, że znak powinien być traktowany jako zwykły tekst, a nie jako symbol wieloznaczny.

\$ echo \\* > /tmp/mójnowyplik.txt

Obie sugerowane metody (pojedyncze cudzysłowy i ucieczka) dają pożądany efekt. Skoro mówimy o ucieczce odwrotnego ukośnika, warto to powiedzieć, aby wskazać znak tekstowy "\" możesz zawrzeć go w pojedynczym cudzysłowie lub napisać "\\\" (ta kombinacja będzie odbierana przez tłumacza jako zwykły pojedynczy ukośnik odwrotny) "\" )

Komentarz: Podwójne cudzysłowy działają podobnie jak pojedyncze cudzysłowy, ale pozwalają bashowi interpretować niektóre znaki specjalne. Dlatego pojedyncze cytaty - Najlepszym sposobem wyślij tylko tekst do polecenia. Przeczytaj pomoc, aby uzyskać więcej informacji o szablonach. „człowiek 7 glob”. Aby uzyskać więcej informacji na temat korzystania z cudzysłowów, zobacz sekcję CYTOWANIE Bibliografia „człowiek 8 glob”.

Wniosek

Gratulacje, dotarłeś do końca naszego przeglądu podstaw Linuksa! Mam nadzieję, że materiał był dla Ciebie przydatny. Tematy poruszane w tym samouczku, w tym podstawy basha, basic polecenia linuksowe, linki i symbole wieloznaczne stanowią podstawę następnego artykułu o podstawach dla administratorów, który omawia wyrażenia regularne, uprawnienia, zarządzanie kontami użytkowników i nie tylko.

Każdy początkujący administrator systemu Linux prędzej czy później natknie się na taką koncepcję, jak „ scenariusz”, czy to jeden ze skryptów rozruchowych, takich jak /etc/rc.d/rc lub skrypt konfiguracyjny napisany przez programistę skonfigurować. W tym artykule postaram się pokazać, że pisanie skryptów na powłoka nie jest czymś niezwykłym i jest w zasięgu nawet początkującego w świecie Linuksa.

Zacznijmy od tego, że przeanalizujemy, co kryje się za angielskimi terminami powłoka oraz scenariusz. Powłoka, lub powłoka, jak ten termin jest czasami tłumaczony, jest interpreterem poleceń, interfejsem między użytkownikiem a systemem operacyjnym, jego jądrem. Ale poza tym jest to również potężny język programowania i skryptowania. Zawiera własne słowa serwisowe i struktury sterujące oraz umożliwia pisanie na nich programów. Taki program w języku skryptowym o nazwie scenariusz, może łączyć wywołania systemowe i polecenia system operacyjny, a także narzędzia zewnętrzne, tworząc potężne narzędzie do administrowania systemem.

Jednym z zadań administracji systemem jest: utworzyć kopię zapasową ważna informacja. Dlatego spójrzmy na przykład skryptu, który implementuje informacje zapasowe.

Początek czasu

Przede wszystkim musimy więc zrozumieć strukturę skryptu. Nie jest niczym skomplikowanym. Ogólnie rzecz biorąc, najprostszy skrypt to tylko lista poleceń systemowych. Na przykład:

Echo To tylko przykład
kim jestem
uname-a

Te polecenia są połączone w jednym pliku. Ale powłoka musi wiedzieć, że musi przetworzyć ten plik, a nie tylko odczytać jego zawartość. Jest do tego specjalna konstrukcja: #!

Ten projekt nazywa się „ sha bang”. Właściwie # określa komentarz, ale w tym przypadku sha-bang oznacza, że ​​po nim pójdzie ścieżka do obsługi skryptu. Na przykład:

#!/kosz/bash
#!/kosz/sz
#!/usr/bin/perl

Skupimy się na Bash, powłoce Bourne-Again. Ta powłoka jest domyślnie instalowana w prawie wszystkich systemach Linux i odnosi się do niej /bin/sh. Słowo serwisowe exit wskazuje na koniec skryptu.

Uzbrojeni w tę wiedzę napiszmy nasz pierwszy scenariusz:

#!/kosz/bash
echo Prosty skrypt # Polecenie echo wyświetla komunikat na ekranie
echo Ciebie:
whoami # whoami pokazuje imię zarejestrowanego użytkownika
echo Twój system został uruchomiony
uptime # uptime pokazuje czas włączenia maszyny
echo dzisiaj
data # data pokazuje aktualną datę i godzinę
echo To wszystko na razie
Wyjście

Zapiszmy ten plik jako tutor1.sh. Wykonajmy polecenie, aby skrypt był wykonywalny.

Chmod + rx tutor1.sh

Rezultatem uruchomienia skryptu będzie:

[e-mail chroniony]:~/Dokument/Open Source$ ./tutor1.sh
Prosty skrypt
Ty:
Voland
Twój system został uruchomiony
14:38:46 do 1:48, 2 użytkowników, średnie obciążenie: 0,47, 0,43, 0,41
Dziś
niedziela 26 lutego 14:38:46 MSK 2006
PA pa

Przejdźmy do czegoś poważniejszego.

Teraz, gdy nauczyliśmy się pisać najprostsze skrypty, czas przejść do rzeczy poważnych: napisania skryptu zapasowego.

Przede wszystkim należy zdefiniować - utworzyć kopię zapasową co zrobimy. Dlatego nasz skrypt musi mieć możliwość pracy z wierszem poleceń. Argumenty wiersz poleceń są podane po nazwie skryptu oddzielone spacją: jakiśskrypt arg1 arg2 arg3. Skrypt przyjmuje argumenty według ich numerów sekwencyjnych, więc użyjemy konstrukcji takich jak $argument_number, tj. 1 dolar, 2 dolary, 3 dolary. $ to symbol wieloznaczny, którego będziemy potrzebować również podczas pracy ze zmiennymi. Zmienne w skrypcie są określone w postaci nazwa_zmiennej=wartość. Użyjemy zmiennych MAXPARAMS do określenia maksymalnej liczby opcji wiersza poleceń, BACKUPFILE do nadania nazwy archiwum, BACKUPDIR do folderu, którego kopię zapasową będziemy tworzyć, oraz ARCHIVEDIR do folderu, w którym umieścimy archiwum. Najważniejszą częścią skryptu będą polecenia do wyszukiwania i archiwizowania wszystkich znalezionych plików i folderów we wskazanym:

odnaleźć. -typ f -print0 | xargs -0 tar rvf "$archive.tar" > /dev/null
gzip $archiwum.tar

Zobaczmy, co robią te polecenia. find przeszukuje bieżący katalog (jest to wskazywany przez pierwszy argument „.”) dla wszystkich plików i wyświetla pełną ścieżkę do nich (print0). Te ścieżki są przekierowywane do polecenia tar, które zbiera wszystkie pliki w jeden. Następnie używamy polecenia gzip do skompresowania wynikowego pliku tar. Zespół > /dev/null przydatne, jeśli archiwizujesz duża liczba akta. W takim przypadku ich nazwy i pełne ścieżki do nich nie są wyświetlane na konsoli.

Następnym krokiem jest dostarczenie użytkownikowi wskazówek, jak korzystać ze skryptu, jeśli popełni jakieś błędy.

Na przykład ten projekt

If [ $# -lt "$MAXPARAMS" ];
następnie
Echo

Echo
wyjście 0
fi

wyświetli monit, że użytkownik podał niewystarczającą liczbę argumentów wiersza poleceń. Jeśli [warunek]...fi definiuje konstrukcję warunkową. $# -lt "$MAXPARAMS" sprawdza wprowadzoną liczbę parametrów i jeśli ta liczba jest mniejsza niż MAXPARAMS, to użytkownik otrzyma komunikat o błędnym wprowadzeniu. Wyjście 0 spowoduje zakończenie działania skryptu bez podania kodu błędu. Podobnie sprawdzane jest przekroczenie dozwolonej liczby parametrów, ale zamiast ls (mniej niż - mniej niż) należy podać gt (większe niż - więcej). Po wyjaśnieniu głównych punktów skryptu możesz przejść do jego pełnej wersji:

#!/kosz/bash
# Opis:
#+ Tworzy kopię zapasową wszystkich plików w określonym katalogu
#+ w "tarball" (archiwum tar.gz).
#+ Użycie:
#+ sh backup.sh nazwa_archiwum folder źródłowy folder docelowy
#+

# Maksymalna liczba opcji wiersza poleceń
MAXPARAMETRY=3

if [ $# -lt "$MAXPARAMS" ];
następnie
Echo
echo "Użycie: sh `basename $0` nazwa zip folder źródłowy folder docelowy"
Echo
wyjście 0
fi

if [ $# -gt "$MAXPARAMS" ];
następnie
Echo
echo "Ten skrypt potrzebuje tylko argumentów wiersza poleceń $MAXPARAMS!"
Echo
wyjście 0
fi

# Zmienne, których używamy w skrypcie
BACKUPFILE=$1-kopia-zapasowa-$(data +%m-%d-%Y)
archiwum=$BACKUPFILE
BACKUPDIR = 2 USD
ARCHIWIZACJA=3 USD

# Sprawdź, czy istnieje folder źródłowy i folder docelowy
jeśli[! -e $BACKUPDIR];
następnie
Echo
echo "\"$BACKUPDIR\" nie istnieje!"
Echo
wyjście 0
fi

jeśli[! -e $ARCHIWID.];
następnie
Echo
echo "\"$ARCHIVEDIR\" nie istnieje, utwórz..."
mkdir $ARCHIVEDIR
echo „Gotowe”.
fi

# Sprawdź, czy w źródle i miejscu docelowym znajdują się archiwa.
cd $ARCHIVEDIR
if [ -e $archiwum.tar.gz ];
następnie rm $archive.tar.gz
fi

cd $BACKUPDIR
if [ -e $archiwum.tar.gz ];
następnie rm $archive.tar.gz
fi

# Główna część scenariusza...
echo "Kopia zapasowa \"$BACKUPDIR\" do pliku \"$archive.tar.gz\"..."
odnaleźć. -typ f -print0 | xargs -0 tar rvf "$archive.tar" > /dev/null
gzip $archiwum.tar
echo "\"$BACKUPDIR\" został pomyślnie zarchiwizowany do pliku \"$archive.tar.gz\"."

# Przenieś archiwum do folderu ARCHIVEDIR
echo "Przenieś archiwum \"$archive.tar.gz\" do \"$ARCHIVEDIR\"."
mv $archive.tar.gz $ARCHIVEDIR/$archive.tar.gz
echo „Gotowe”.

Mam nadzieję, że skomentowałem główne punkty wystarczająco szczegółowo. Jeśli masz jakieś pytania, możesz skontaktować się ze mną pod adresem [e-mail chroniony] Polecam również wspaniałą książkę Advanced Bash-Scripting Guide autorstwa Mendela Coopera, która bardzo mi pomogła w czasie, gdy dopiero zapoznawałem się ze skryptami. Udanego programowania.

PS Wielkie dzięki zniszczyć za jej uwagi i rady.

(„The Art of Shell Scripting”) zawiera zbyt dużo materiałów referencyjnych. I nie ma nic pomiędzy tymi dwoma skrajnościami. Napisałem również ten przewodnik, ponieważ nie ma wystarczającej liczby bezpłatnych kursów podstawowych, chociaż należy ich wysłuchać.

to praktyczny przewodnik, w której, choć nie zawsze w dostatecznie poważnym stylu, podaję przykłady z prawdziwe życie zamiast teoretycznych przykładów. Po części pisałem, że wynika to z tego, że nie chcę przynosić okrojonych i też proste przykłady oferowane przez tych, którzy wiedzą, o czym mówią i pokazują kilka naprawdę fajnych funkcji Bash, ale tak wyrwanych z kontekstu, nigdy nie będziesz w stanie ich użyć w praktyce. Możesz o tym przeczytać po przestudiowaniu tej książki, która zawiera ćwiczenia i przykłady, które pomogą ci w prawdziwym życiu.

Z mojego praktycznego doświadczenia jako użytkownika UNIX/Linux, administratora systemu i nauczyciela wiem, że ludzie mogą codziennie wchodzić w interakcje ze swoimi systemami przez lata i nigdy nie wiedzą, jak zautomatyzować zadania. Tak często myślą, że system UNIX nie jest przyjazny dla użytkownika, a co gorsza mają wrażenie, że jest to system powolny i staromodny. To kolejny problem, z którym można sobie poradzić za pomocą tego poradnika.

Kto powinien przeczytać tę książkę?

Każdy, kto pracuje z Systemy UNIX lub Systemy typu UNIX którzy chcą ułatwić sobie życie, zaawansowanym użytkownikom i administratorzy systemu. Czytelnicy, którzy już wiedzą, jak korzystać z wiersza poleceń do pracy z systemem, poznają wszystkie szczegóły tworzenia skryptów powłoki, które można wykorzystać do ułatwienia codziennych zadań. W Administracja systemu polegać głównie na skryptach; codzienne zadania są często zautomatyzowane za pomocą prostych skryptów. Ten dokument jest pełen przykładów, które zainspirują Cię do pisania własnych skryptów i zachęcą do ulepszania istniejących skryptów.

Przed przystąpieniem do tego kursu:

  • musisz być doświadczonym użytkownikiem systemu UNIX lub Linux, który zna główne zespoły, ze stronami podręcznika i dokumentacją;
  • umieć posługiwać się edytorem tekstu;
  • zrozumieć, w jaki sposób system uruchamia się i zatrzymuje procesy, co robi init i jak używane są skrypty init;
  • tworzyć użytkowników i grupy, ustawiać hasła;
  • wiedzieć, jakie są prawa dostępu i tryby specjalne;
  • znać zasady nazewnictwa urządzeń, rozumieć, czym są partycje, montować/odmontowywać systemy plików;
  • być w stanie dodać oprogramowanie do twojego systemu i usuń go z systemu.

Jeśli nie znasz jednego lub więcej tematów wymienionych powyżej, zapoznaj się z książką Wprowadzenie do systemu Linux na stronie TLDP lub na lokalnym serwerze lustrzanym TLDP. Aby uzyskać więcej informacji, zobacz dokumentację systemu (strony podręcznika i informacje) lub witrynę Linux Documentation Project.

Niniejsza instrukcja jest dostępna w formie drukowanej na stronie Fultus.com.

Rys.1. Okładka książki „Przewodnik dla początkujących po Bash”

Ten przewodnik został przetłumaczony:

Trwa tłumaczenie na język francuski, a link do niego zostanie podany natychmiast po zakończeniu tłumaczenia.

Historia zmian

Historia zmian

Uwzględniono życzenia czytelników: poprawiono objaśnienia polecenia zmiany w rozdziale 9, literówki w rozdziale 7, rozdziale 3, rozdziale 10.

Uwzględniane są życzenia czytelników.

Zmieniony adres

Wstawiono komentarze czytelnika, dodano indeks ze znacznikami DocBook.

Przykład wyjaśniono w rozdziale 4, opis osadzonych dokumentów (tutaj doc) został poprawiony w rozdziale 9, ogólne sprawdzanie i poprawianie błędów typograficznych, dodano linki do tłumaczeń chińskich i ukraińskich, uwagę i inne rzeczy dotyczące awk w rozdziale 6 .

Poprawiono błędy typograficzne w rozdziałach 3, 6 i 7, dodano komentarze użytkowników, dodano uwagę w rozdziale 7.

Trochę debugowania, kilka słów kluczowych, informacje o nowym Bash 3.0, dodany obrazek.

Pierwsze wydanie dla LDP; więcej przykładów, więcej notatek, mniej błędów i literówek, dodano słowniczek

Wersja 1.0-beta

Dziękuję

Dziękuję wszystkim przyjaciołom, którzy pomogli (lub próbowali pomóc) i mojemu mężowi; Twoje zachęcające słowa umożliwiły tę pracę. Podziękowania dla wszystkich, którzy zgłosili błędy, przesłali przykłady i komentarze - wśród wielu, wielu innych:

  • Hans Bol do jednego z fanów;
  • Mike Sim za komentarze dotyczące stylizacji;
  • Dan Richter za przykłady tablic;
  • Georges Ferguson (Gerg Ferguson) za pomysły dotyczące tytułów;
  • Mendel Leo Cooper, który zapewnił miejsce do pracy;
  • #linux.be, za utrzymanie mnie na powierzchni;
  • Frank Wang, za szczegółowe uwagi na temat wszystkich rzeczy, które zrobiłem źle ;-)

Specjalne podziękowania dla Tabathy Marshall, która zobowiązała się do sprawdzania ogólnego oraz sprawdzania ortografii i gramatyki. Mieliśmy świetny zespół: pracowali, kiedy spałem. I wzajemnie;-)

(mówimy o błędach w wersji angielskiej - ok. os.).

Informacje o prawach autorskich

* Prawa autorskie (c) 2002-2007, Machtelt Garrels * Wszelkie prawa zastrzeżone. * Redystrybucja i używanie w formie źródłowej i binarnej, z * modyfikacją lub bez, jest dozwolone pod warunkiem, że spełnione są następujące warunki: * * * Ponowne rozpowszechnianie kodu źródłowego musi zawierać powyższą informację o * prawach autorskich, tę listę warunków i następujące zastrzeżenie. * * Redystrybucje w formie binarnej muszą zawierać powyższą * informację o prawach autorskich, tę listę warunków i następujące wyłączenie odpowiedzialności w * dokumentacji i/lub innych materiałach dostarczonych z dystrybucją. * * Ani nazwisko autora, Machtelt Garrels, ani * nazwiska jego współtwórców nie mogą być używane do promowania lub promowania produktów * wywodzących się z tego oprogramowania bez uprzedniej pisemnej zgody. * * NINIEJSZE OPROGRAMOWANIE JEST DOSTARCZANE PRZEZ AUTORA I WSPÓŁPRACOWNIKÓW „TAK JAK JEST” ORAZ WSZELKIE * WYRAŹNE LUB DOROZUMIANE GWARANCJE, W TYM MIĘDZY INNYMI DOROZUMIANE * GWARANCJE PRZYDATNOŚCI HANDLOWEJ I PRZYDATNOŚCI DO OKREŚLONEGO CELU. W ŻADNYM WYPADKU AUTOR I WSPÓŁPRACOWNICY NIE PONOSZĄ ODPOWIEDZIALNOŚCI ZA JAKIEKOLWIEK * BEZPOŚREDNIE, POŚREDNIE, PRZYPADKOWE, SZCZEGÓLNE, PRZYKŁADOWE LUB WTÓRNE SZKODY * (W TYM MIĘDZY INNYMI ZAKUP TOWARÓW LUB USŁUG ZASTĘPCZYCH; * UTRATĘ UŻYTKOWANIA, DANYCH LUB ZYSKI LUB PRZERWANIE W DZIAŁALNOŚCI JEDNAK SPOWODOWANE I * NA DOWOLNEJ TEORII ODPOWIEDZIALNOŚCI UMOWNEJ, ODPOWIEDZIALNOŚCI ŚCISŁEJ LUB CZYNNEJ * (W TYM ZANIEDBANIA LUB W INNY SPOSÓB) WYNIKAJĄCE Z KORZYSTANIA Z TEGO * OPROGRAMOWANIA, NAWET MOŻLIWOŚĆ TAKICH USZKODZEŃ.

Autor i wydawca dołożyli wszelkich starań, aby podczas przygotowywania tej książki zapewnić dokładność informacji. Jednak informacje zawarte w tej książce są oferowane bez gwarancji, wyraźnej lub dorozumianej. Ani autor, ani wydawca, ani sprzedawca, ani dystrybutor nie ponoszą żadnej odpowiedzialności za jakiekolwiek szkody spowodowane lub rzekomo spowodowane bezpośrednio lub pośrednio przez tę książkę.

Logo, znaki towarowe i symbole użyte w tej książce są własnością ich odpowiednich właścicieli.

Czego potrzebujesz?

Organizacja tego dokumentu

Ten samouczek obejmuje koncepcje, które poważni użytkownicy Bash uznają za przydatne Życie codzienne. Chociaż czytelnik będzie potrzebował podstawowej wiedzy na temat korzystania z powłoki, zaczniemy od pierwszych trzech rozdziałów od omówienia podstawowych elementów powłoki i przyjrzenia się praktycznym przykładom.

Rozdziały od czwartego do szóstego obejmują główne narzędzia powszechnie używane w skryptach powłoki.

Rozdziały od ósmego do dwunastego omawiają najpopularniejsze konstrukcje używane w skryptach powłoki.

Każdy rozdział zawiera ćwiczenia, które sprawdzą Twoją gotowość do przejścia do kolejnego rozdziału.

  • Rozdział 1 „Skrypty powłoki i Bash” — Podstawy Bash: dlaczego bash jest tak dobry, komponenty, wstępne wskazówki dotyczące tworzenia dobrych skryptów.
  • Rozdział 2 „Pisanie i debugowanie skryptów” — Podstawy pisania skryptów: pisanie i debugowanie skryptów.
  • Rozdział 3 "Środowisko Bash" - Środowisko Bash: pliki inicjujące, zmienne, zmiana specjalnych właściwości znaków, kolejność podstawiania powłoki, aliasy, opcje.