Progmar Marcin Załęczny

Język:

Bash - ogólne informacje

Kolejność uruchamianych plików startowych przez powłokę logowania bash:

  1. /etc/profile - ten skrypt z kolei uruchamia najpierw plik /etc/bash.bashrc a następnie wszystkie pliki z rozszerzeniem .sh znajdujące się w katalogu /etc/profile.d. To w tym podkatalogu należy umieścić skrypt *.sh ustawiający i eksportujący zmienne globalne dla wszystkich użytkowników systemu.
  2. W następnej kolejności uruchamiany jest pierwszy istniejący plik: ~/.bash_profile, ~/.bash_login lub ~/.profile. W jednym z tych plików możemy zmodyfikować domyślne ustawienia globalne. Domyślnie utworzone konto nowego użytkownika zawiera plik ~/.profile i wywoływany z niego plik ~/.bashrc

Podczas wylogowania uruchamiany jest plik ~/.bash_logout.
Powłoki interaktywne typu non-login przy uruchomieniu wywołują tylko skrypt ~/.bashrc. Wszystkie ustawienia są dziedziczone z powłoki logowania.
Powłoki nieinteraktywne, służące do uruchamiania procesów i skryptów nie wykonują żadnego z wymienionych wyżej plików. Dziedziczą one jednak ustawienia z powłoki logowania.
Programy i pliki uruchamiane z crontaba nie wykonują żadnych plików wymienionych wyżej oraz nie dziedziczą ustawień globalnych.
Ponieważ plik ~/.bashrc może być wywoływany wiele razy, wszystkie polecenia modyfikujące zmienne oraz tworzące nowe zmienne powinny znajdować się w pliku ~/.profile.

Wbudowane zmienne powłoki Bash (parametry pozycyjne i parametry specjalne):
$# Ilość argumentów przekazanych w linii poleceń.
$? Zwraca kod błędu ostatnio wykonanego polecenia.
$$ PID shell-a.
$! PID ostatniego polecenia uruchomonego w tle.
$0 Nazwa wywoływanego polecenia.
$1-$9 Parametry przekazane w linii poleceń.
$* Wszystkie parametry przekazane w linii poleceń jako jeden łańcuch znaków: "$1 $2 $3 ...". Powyższe wartości są rozdzielone pierwszym znakiem w zmiennej $IFS (zazwyczaj spacją).
$@ Lista rozdzielona spacjami wszystkich przekzanych do skryptu argumentów

"source skrypt" lub ". skrypt" - polecenie uruchamiające podany skrypt w ramach bieżącego procesu powłoki. Wszystkie zmiany dokonane przez ten skrypt w ustawieniach zmiennych będą miały miejsce w bieżącej powłoce.

-- - dwa myślniki w linii poleceń Basha oznaczają miejsce zakończenia wprowadzania opcji programu i rozpoczęcie wprowadzania argumentów

[nazwa=wartosc ...] polecenie
Przypisuje każdej nazwie zmiennej odpowiednią wartość i umieszcza wszystkie te zmienne w środowisku wywołanego polecenia.

Skróty klawiaturowe w edycji linii poleceń:

CTRL+D - usuwa znak przed kursorem
CTRL+U - usuwa wszystkie znaki przed kursorem
CTRL+K - usuwa wszystkie znaki od miejsca kursora
CTRL+W - usuwa słowo przed kursorem
CTRL+F - przesuwa kursor o jeden znak w prawo
CTRL+B - przesuwa kursor o jeden znak w lewo
CTRL+A - przesuwa kursor na początek wiersza
CTRL+E - przesuwa kursor na koniec wiersza

polecenie >nazwa_pliku - przesłanie standardowego wyjścia polecenia do pliku nazwa_pliku
polecenie <nazwa_pliku - przesłanie zawartości pliku nazwa_pliku na standardowe wejście polecenia
polecenie_1 | polecenie_2 - przesłanie standardowego wyjścia polecenia_1 na standardowe wejście polecenia_2
polecenie_1 |& polecenie_2 - przesłanie standardowego wyjścia oraz standardowego wyjścia błędów polecenia_1 na standardowe wejście polecenia_2

Wartością zwracaną przez potok jest wartość zwrócona przez ostatnie jego polecenie.

Lista AND:
potok_1 && potok_2 - tutaj potok_2 zostanie wykonany tylko wtedy gdy potok_1 zakończy się sukcesem (zwróci 0).
Lista OR:
potok_1 || potok_2 - tutaj potok_2 zostanie wykonany tylko wtedy gdy potok_1 zakończy się niepowodzeniem (zwróci wartość != 0).

Deskryptory plików i symbole przekierowania:

0 - standardowe wejście
1 - standardowe wyjście
2 - standardowe wyjście błędów

> jest synonimem 1> - przekierowanie standardowego wyjścia
< jest synonimem 0< - przekierowanie standardowego wejścia
2> - przekierowanie standardowego wyjścia błędów
>> - przekierowanie standardowego wyjścia do pliku, jeśli taki plik już istniał to dane są dopisywane na jego końcu

&> - przekierowanie standardowego wyjścia i standardowego wyjścia błędów do jednego pliku
2>&1 - powoduje, że deskryptor standardowego wyjścia błędów jest duplikatem deskryptora standardowego wyjścia
2>&1 | lub |& - powoduje, że zarówno standardowe wyjście jak i standardowe wyjście błędów jest przesyłane potokiem do następnego polecenia
1>&2 lub >&2 - przekierowanie standardowego wyjścia do standardowego wyjścia błędów

Aby uruchomić plik binarny nie trzeba mieć prawa do odczytu tego pliku. Wystarczy tylko prawo do uruchomienia tego pliku.

W pierwszym wierszu skryptu powłoki można przy pomocy sekwencji #! wskazać jaka powłoka lub inny program powinien wykonać ten skrypt, np:

#!/bin/bash
Jeśli w pliku skryptu jako pierwsz znak danej linii umieszczono znak #, po którym nie następuje wykrzyknik, to taka linia jest komentarzem.

Operatory sterujące:

; - rozdziela polecenia
znak nowego wiersza - również rozdziela polecenia
& - oznacza, że program lub skrypt ma być wykonany w tle, również rozdziela polecenia
| - przekazanie standardowego wyjścia procesu na standardowe wejście innego procesu, również rozdziela polecenia
|& - przekazanie standardowego wyjścia błędów procesu na standardowe wejście innego procesu, również rozdziela polecenia
() - grupuje polecenia, dla każdej grupy poleceń powłoka tworzy nową podpowłokę w celu wykonania tej grupy poleceń
&& - logiczne AND
|| - logiczne OR, oba operatory && i || mają taki sam priorytet
;; - przerwanie bloku

Znak \ oznacza kontynuację danego polecenia w następnym wierszu powłoki.

Powłoka Bash pozwala pracować ze stosem katalogów (ang. directory stack).
Polecenie dirs wyświetla aktualną zawartość stosu lub bieżący katalog roboczy, jeśli stos jest pusty.

pushd katalog - zapisuje podany katalog na szczycie stosu, przechodzi do niego i wyświetla aktualną zawartość stosu
pushd - zamienia miejscami dwa najwyżej położone na stosie katalogi, przechodzi do katalogu na szczycie stosu oraz wyświetla zawartość stosu.
pushd +numer - przenosi katalog o podanym numerze na szczyt stosu, przechodzi do tego katalogu i wyświetla zawartość stosu; Katalogi na stosie są numerowane od zera kolejnymi liczbami całkowitymi. Numer 0 ma katalog na szczycie, itd.
popd - usuwa ze stosu katalog znajdujący się na jego szczycie, zmienia katalog roboczy na ten, który aktualnie jest na jego szczycie oraz wyświetla aktualną zawartość stosu
popd +numer - usuwa ze stosu katalog o podanym numerze, jeśli nie był to katalog na jego szczycie, to bieżący katalog roboczy pozostaje bez zmian. W przeciwnym razie przechodzi do katalogu na szczycie stosu. Na koniec wyświetla aktualną zawartość stosu.

Zmienne (lokalne) w Bashu tworzymy przez proste przypisanie, np.:

moja_zmienna="abc 123"
Przed i po znaku równości nie wstawiamy żadnej spacji. Aby uczynić powyższą zmienną, zmienną globalną (dostępnych we wszystkich powłokach uruchamianych z bieżącej powłoki) wydajemy polecenie:
export moja_zmienna
Zgodnie z konwencją zmienne globalne (inaczej zwane środowiskowymi) powinny być pisane dużymi literami, np.:
MOJA_ZMIENNA="abc 123"
export MOJA_ZMIENNA
Ponadto Bash daje możliwość ustawiania zmiennych w lini polecenia. Są one dostępne tylko dla środowiska wywoływanego polecenia/skryptu np.;
MOJ_KATALOG=/home/mzaleczny ./jakis_skrypt.sh
Tutaj zmienna MOJ_KATALOG jest dostępna wyłącznie w skrypcie jakis_skrypt.sh.
Jeśli do nazwy zmiennej chcemy dokleić jakiś tekst, to powinniśmy to zrobić następująco:
echo ${ZMIENNA}doklejka
zamiast
echo $ZMIENNAdoklejka
bo w tym drugim przypadku zostanie wyświetlona wartość nieistniejącej zmiennej $ZMIENNAdoklejka - czyli pusty ciąg znaków.
Każda komenda może przyjąć do 99 różnych parametrów. Odwołujemy się do nich następująco: $1, $2, ..., $9, $(10}, ${11}, ..., ${99} Usunięcie wartości zmiennej:
ZMIENNA=
Usunięcie zmiennej ze środowiska bieżącej powłoki:
unset ZMIENNA
Nadanie zmiennej atrybutu tylko do odczytu (przypisanie jej nowej wartości oraz usunięcie zmiennej nie będą możliwe):
readonly ZMIENNA
lub
declare -r ZMIENNA=WARTOŚĆ_TYLKO_DO_ODCZYTU
Atrybutu tylko do odczytu nie można usunąć. Export zmiennej przy pomocy polecenia export jest równoważny poleceniu:
declare -x ZMIENNA
Aby usunąć stan wyeksportowania zmiennej, możemy użyć polecenia:
declare +x ZMIENNA
Wyświetlenie zmiennych tylko do odczytu:
readonly
lub
declare -r
Wyświetlenie wyeksportowanych zmiennych:
export
lub
declare -x
Utworzenie zmiennej typu całkowitego:
declare -i LENGTH=32
Wypisanie wszystkich zmiennych typu całkowitego:
declare -i
Utworzenie zmiennej typu tablicowego:
declare -a BASH_VERSINFO='([0]="4" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-pc-linux-gnu")'
Wypisanie wszystkich zmiennych typu tablicowego:
declare -a

Zmienna PS1 reprezentuje podstawowy znak zachęty i może zawierać elementy wymienione poniżej:

\$ - znak # dla administratora i znak $ dla pozostałych użytkowników
\h - nazwa hosta bez nazwy domeny
\H - pełna nazwa hosta (razem z nazwą domeny)
\j - liczba uruchomionych zadań (jobs) zarządzanych przez bieżącą powłokę
\l - nazwa bazowa terminala urządzenia, na którym jest uruchomiony shell
\s - nazwa shella
\t - czas w 24-godzinnym formacie HH:MM:SS
\T - czas w 12-godzinnym formacie HH:MM:SS
\@ - czas w 12-godzinnym formacie HH:MM
\A - czas w 24-godzinnym formacie HH:MM
\u - nazwa bieżącego użytkownika
\v - skrócony numer wersji basha
\V - pełny numer wersji basha
\w - bieżący katalog roboczy
\W - ostatni człon bieżącego katalogu roboczego, ~ jeśli jest nim katalog domowy bieżącego użytkownika
\d - data w formacie: skrócony dzień tygodnia, skrócony miesiąc, dzień miesiąca (np. "pon wrz 28")

Zmienna PS2 reprezentuje drugorzędny znak zachęty. Jest on wyświetlany w momencie kiedy zostanie wywołane polecenie, które nie zostało dokończone w pierwszej linijce. Jest on wyświetlany w każdej następnej linijce aż do składniowego zakończenia tego polecenia.

IFS (ang. Internal Field Separator) - zmienna ta przechowuje łańcuch znaków, z których każdy może być separatorem słów (komend, parametrów, itp.) w linii poleceń Basha. Znaki te rozdzielają poszczególne słowa tylko w przypadku podstawiania wartości zmiennej. Wpisywane wprost w linii poleceń nie powodują podziałów.
Jeżeli znakami separatorów są: spacja, tabulator, nowa linia to wielokrotne wystąpienie pod rząd mieszanki tych znaków traktowane jest jako jeden separator.
Jeżeli znakami separatorów są dowolne inne znaki, to wielokrotne ich wystąpienia są traktowane jak wiele separatorów.

Po wywołaniu programu z linii poleceń powłoki, przeszukuje ona lokalizacje zapisane w zmiennej środowiskowej PATH w celu znalezienia pełnej ścieżki do programu. Następnie zapisuje tę ścieżkę do wbudowanej tablicy hashującej i przy następnym wywołaniu tego samego programu zamiast przeszukiwać katalogi w zmiennej PATH, pobiera ona pełną ścieżkę do tego programu z wspomnianej tablicy hashującej. Zawartość tej tablicy można wyświetlić przy pomocy polecenia:

hash
Aby opróżnić tę tabelę należy wywołać polecenie:
hash -r

Tworzenie aliasu:

alias nazwa=wartosc
Po lewej i prawej stronie znaku równości nie może być spacji. Jeśli wartość zawiera spacje, to powinna zostać umieszczona w cudzysłowiu lub apostrofach, np.:
alias ll='ls -l'
Aliasy definiujemy w pliku ~/.bashrc lub w dedykowanemu pliku aliasów ~/.bash_aliases.
Wyświetlenie definicji aliasu o podanej nazwie:
alias nazwa
Wyświetlenie definicji wszystkich aliasów:
alias
Usunięcie danego aliasu:
unalias nazwa

Obliczenie podanego wyrażenia arytmetycznego i zastąpienie poniższej składni jego wynikiem:

$((wyrazenie)), np. $((50 -24))
Występujące zmienne w wyrażeniu nie muszą być poprzedzone znakiem dolara $. Obliczony wynik można przypisać do zmiennej:
wynik=$((wyrazenie))
Jest to równoważne poleceniu:
let "wynik=wyrazenie"

Wykonanie polecenia i zastąpienie poniższej składni jego standardowym wyjściem:

$(polecenie)

Wcztuje wartość podaną przez użytkownika do zmiennej $miesiac:

read -p "Podaj numer miesiąca (1-12): " miesiac

Wypisanie komunikatu na standardowym wyjściu błędów: echo "Komunikat" 1>&2