Większość społeczności technologicznej lubi wchodzić w interakcję z systemami za pomocą interfejsu wiersza poleceń (CMD) lub powłoki. Zazwyczaj ułatwia to ich pracę. Na przykład można utworzyć polecenie powłoki, które automatycznie wykona kilka zadań, zamiast klikać wiele przycisków w GUI.
Po uruchomieniu programu powłoki lub CMD kompiluje on kilka informacji. Informacje te określają, w jaki sposób program uzyskuje dostęp do podstawowych zasobów systemowych, a także jego ogólne zachowanie. Można je przechowywać w miejscu zwanym środowiskiem. Środowisko składa się z ciągów znaków reprezentujących pary klucz-wartość. W tym samouczku będziemy używać Ubuntu 20.04 VPS jako przykładu, który pomoże Ci podczas konfiguracji zmiennych środowiskowych lub zmiennych powłoki. Przewodnik ten powinien mieć zastosowanie również do innych dystrybucji Linuksa.
Jaka jest różnica między zmiennymi środowiskowymi a zmiennymi powłoki?
Po rozpoczęciu sesji informacje są zbierane z ustawień i plików konfiguracyjnych systemu’. Następnie są one dostępne dla procesu powłoki i jego procesów potomnych. Informacje te stanowią zestaw par klucz-wartość w następującym formacie:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
Nazwy zmiennych, czyli klucze, rozróżniają wielkość liter. Jednak przyjęło się pisać je WIELKIMI LITERAMI. Pomaga to odróżnić je w innych kontekstach. Za pomocą dwukropka ‘:’ można przypisać wiele wartości do tej samej zmiennej. Ważne jest również, aby nie pozostawiać spacji wokół znaku =. Klucze to zmienne i dzielą się na dwie kategorie: zmienne środowiskowe i zmienne powłoki. Zmienne środowiskowe zawierają wszystkie zmienne zdefiniowane w całym systemie i są dostępne dla wszystkich powłok lub procesów potomnych. Pomagają one przekazywać informacje do procesów uruchamianych za pomocą poleceń powłoki. Zmienne powłoki obejmują tylko zmienne zdefiniowane w konkretnej sesji powłoki. Ponadto obejmują one wyłącznie zmienne dostępne tylko w obrębie danej instancji powłoki.
Wyświetlanie listy zmiennych środowiskowych i zmiennych powłoki
Domyślnie terminal udostępnia dwa polecenia do wyświetlania listy zmiennych środowiskowych i zmiennych powłoki: env lub printenv. W swoim domyślnym stanie pokazują one te same informacje. Oto przykładowe dane wyjściowe tych poleceń:
Użycie env:

Użycie printenv:

Jak widać, dane wyjściowe są takie same. Różnica pojawia się, gdy chcesz uzyskać wartość określonego klucza. Wtedy użyjesz printenv z nazwą zmiennej:

Aby zobaczyć wiele wartości, możesz przekazać więcej niż jeden argument do polecenia printenv. Wartości pojawią się w kolejności, w jakiej wprowadzono argumenty:

Możesz również użyć polecenia echo z nazwą zmiennej, aby wyświetlić jej wartość:

Polecenie env pozwala na modyfikację środowiska, w którym uruchamiane są programy, poprzez przekazanie definicji zmiennych w składni takiej jak:
|
1 |
env VAR1="var 1 value" command_to_run command_options |
Pozwala to na nadpisanie wartości lub ustawienie nowych wartości, które mogą być używane przez proces potomny. Polecenia printenv i env wyświetlają listę zmiennych środowiskowych, jak pokazano powyżej. Były one już zdefiniowane dla procesów systemowych. Jeśli chcesz zobaczyć listę zmiennych powłoki, możesz użyć polecenia set. Wpisanie set bez żadnych zmiennych zwróci listę wszystkich zmiennych środowiskowych, zmiennych powłoki, zmiennych lokalnych oraz funkcji powłoki:

Zmiennych może być zbyt wiele. W razie potrzeby możesz stronicować je za pomocą polecenia:
|
1 |
set | less |
Możesz dodatkowo uporządkować dane wyjściowe, określając wykonanie polecenia set w trybie POSIX, dzięki czemu funkcje powłoki nie zostaną wypisane. Tutaj wykonujemy je w podpowłoce (osobnej instancji procesora poleceń), aby zapobiec zmianie bieżącego środowiska przez polecenie:
|
1 |
(set -o posix; set) |
Powyższe polecenie wyświetla listę wszystkich poleceń środowiskowych i powłoki dostępnych w systemie. Możesz ograniczyć dane wyjściowe za pomocą następującego polecenia, aby spróbować uzyskać tylko zmienne powłoki:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
Przykładowy wynik powyższego polecenia to:

Chociaż polecenie to może zawierać kilka zmiennych środowiskowych, pomoże Ci ono odróżnić zmienne powłoki od zmiennych środowiskowych. Dzieje się tak, ponieważ polecenie set ujmuje wartości zmiennych w cudzysłów, podczas gdy polecenia printenv i env tego nie robią. Zmienne powłoki są przydatne do ustawiania trwałych wartości dla sesji, bez konieczności stałego zapisywania zmian w plikach.
Typowe zmienne środowiskowe
USER – Bieżący zalogowany użytkownik.
SHELL – Powłoka, która będzie interpretować wprowadzane polecenia. Domyślną powłoką jest bash, ale możesz to zmienić.
HOME – Katalog domowy bieżącego użytkownika.
TERM – Określa typ emulowanego terminala. Pokazuje bieżący emulowany terminal.
PWD – Bieżący katalog roboczy.
OLDPWD – Poprzedni katalog roboczy. Pomaga to powłoce przełączyć się do poprzedniego katalogu po wprowadzeniu polecenia zmiany katalogu jako cd.
EDITOR – Domyślny edytor plików po wpisaniu edit w terminalu.
LS_COLORS – Definiuje kody kolorów używane do dodawania kolorowych danych wyjściowych po wprowadzeniu polecenia ls. Pomaga to odróżnić typy plików i dostarcza informacji użytkownikom.
LOGNAME – Nazwa bieżącego użytkownika.
MAIL – Definiuje ścieżkę do skrzynki pocztowej bieżącego użytkownika.
LANG – Definiuje bieżące ustawienie regionalne.
PATH – Określa listę katalogów do przeszukania podczas wykonywania poleceń. Podczas wykonywania polecenia system przeszukuje te katalogi i używa pierwszego znalezionego pliku wykonywalnego.
_ – Ostatnio wykonane polecenie.
Typowe zmienne powłoki:
BASH_VERSION – Wersja basha w formacie czytelnym dla człowieka.
BASH_VERSINFO – Wersja basha w formacie czytelnym dla maszyny.
BASHOPTS – Lista opcji, które zostały użyte podczas uruchamiania basha. Przydatna do określenia, czy środowisko powłoki będzie działać zgodnie z oczekiwaniami.
COLUMNS – Szerokość w liczbie kolumn używana do wyświetlania danych na ekranie.
DIRSTACK – Stos katalogów dostępnych przy użyciu poleceń pushd i popd.
HOSTNAME – Nazwa hosta komputera w danym momencie.
HISTFILESIZE – Liczba linii historii poleceń przechowywanych w pliku.
HISTSIZE – Liczba linii historii poleceń dozwolonych w pamięci.
IFS – Wewnętrzny separator pól służący do rozdzielania danych wejściowych w wierszu poleceń. Domyślnie jest to spacja.
SHELLOPTS-Służy do ustawiania opcji powłoki.
UID-Identyfikator UID bieżącego użytkownika.
PS1– Główna definicja znaku zachęty. Służy do określenia wyglądu znaku zachęty po rozpoczęciu sesji powłoki.
PS2 – Deklaruje pomocnicze znaki zachęty, gdy polecenie zajmuje wiele linii.
Setting Environmental and Shell Commands
Po pierwsze, jak wyjaśniono wcześniej, nazwy zmiennych będziemy zapisywać wielkimi literami. Następnie przejdziemy do tworzenia zmiennych powłoki. Na koniec utworzymy zmienne środowiskowe.
Tworzenie zmiennych powłoki
Zacznijmy od zwykłego hello world. Wpisz w terminalu następujące polecenie:
|
1 |
MY_FIRST_VAR=’Hello World!’ |
Cudzysłów jest używany, ponieważ zmienna zawiera spację. Zauważ, że użyliśmy pojedynczego cudzysłowu, ponieważ wykrzyknik jest znakiem specjalnym i powinien zostać ucieknięty lub umieszczony w pojedynczych cudzysłowach. W ten sposób utworzyłeś swoją pierwszą zmienną powłoki. Jest ona dostępna tylko w bieżącej sesji powłoki. Zmienne powłoki nie są dostępne dla powłok i procesów potomnych. Możesz ją wyświetlić w terminalu, używając polecenia set z grep:

Lub wyświetlić wartość za pomocą echo, odwołując się do niej za pomocą znaku $ i nazwy zmiennej:

Jeśli spróbujesz wyświetlić ją za pomocą printenv, nie zobaczysz żadnego wyniku. Pomaga to potwierdzić, że nie jest to zmienna środowiskowa:

Tworzenie zmiennych środowiskowych
Wcześniej utworzoną zmienną powłoki można przekształcić w zmienną środowiskową za pomocą polecenia export. Najpierw tworzysz zmienną powłoki. Następnie, aby utworzyć zmienną środowiskową, musisz użyć polecenia export. Po wykonaniu tego polecenia zmienna będzie dostępna dla powłok i procesów potomnych:
|
1 |
export MY_FIRST_VAR |
Teraz, jeśli przetestujesz to za pomocą polecenia printenv, powinieneś zobaczyć zmienną i jej wartość:

Możesz również utworzyć zmienną środowiskową w jednym kroku, używając składni:
|
1 |
export MY_SECOND_VAR='To jest moja druga zmienna' |
Zmienne środowiskowe są przekazywane tylko do powłok potomnych, a nie do powłoki nadrzędnej. Pomaga to zapobiec wpływaniu procesów potomnych na środowisko programu, który je wywołał.
Degradowanie i usuwanie zmiennych
Jeśli śledziłeś samouczek do tego momentu, nadal masz zdefiniowaną zmienną MY_FIRST_VAR jako zmienną środowiskową. Możesz zmienić ją z powrotem w zmienną powłoki, wpisując polecenie export z flagą –n:
|
1 |
export -n MY_FIRST_VAR |
Jeśli przetestujesz to za pomocą printenv, nie zobaczysz żadnego wyniku. Jednak polecenie echo wyświetli ją, ponieważ nadal jest to zmienna powłoki:

Możesz usunąć zarówno zmienną powłoki, jak i zmienną środowiskową za pomocą polecenia unset. Możesz potwierdzić, że już nie istnieje, używając echo. Jak widać, nie wyświetla ono żadnego wyniku:

Ustawianie zmiennych środowiskowych podczas logowania
Wiele programów zależy od zmiennych środowiskowych do swojego działania. Ponieważ ustawianie zmiennych za każdym razem, gdy chcesz uruchomić program, nie jest efektywne, system Linux zapewnia sposób na ich zdefiniowanie i zapisanie w pliku. W ten sposób mogą być one ustawiane automatycznie podczas logowania. Powłoka odczytuje różne pliki konfiguracyjne w zależności od sposobu rozpoczęcia sesji. Zostały one omówione poniżej:
Typy sesji powłoki i różnice między nimi
- Sesja logowania powłoki – rozpoczyna się od uwierzytelnienia użytkownika. Sesja jest ustanawiana, gdy logujesz się przez SSH lub sesję terminala.
- Sesja powłoki bez logowania – rozpoczyna się, gdy uruchamiasz nową powłokę z poziomu już uwierzytelnionej powłoki. Możesz uruchomić nową powłokę za pomocą polecenia bash. Dane uwierzytelniające nie są wymagane.
- Interaktywna sesja powłoki – sesja powłoki powiązana z sesją terminala.
- Nieinteraktywna sesja powłoki – sesja powłoki niepowiązana z sesją terminala – działa w tle.
Sesja jest klasyfikowana jako sesja logowania lub bez logowania oraz jako interaktywna lub nieinteraktywna. Kiedy logujesz się i rozpoczynasz sesję powłoki przez SSH, będzie to interaktywna sesja logowania powłoki. Kiedy uruchamiasz skrypt w terminalu, zazwyczaj działa on w sesji bez logowania i nieinteraktywnej. Sesja powłoki może być również kombinacją obu tych typów. Więc który plik konfiguracyjny zostanie wybrany?
Sesja logowania najpierw odczytuje pliki konfiguracyjne z katalogu /etc/profile. Po drugie, sprawdza specyficzne pliki konfiguracyjne użytkownika w jego katalogu domowym. Odczytywany jest tylko pierwszy znaleziony plik spośród ~/.bash_profile, ~/.bash_login oraz ~/.profile, a wszystkie pozostałe pliki są ignorowane. Sesja bez logowania najpierw odczyta plik /etc/bash.bashrc, a następnie ~/.bashrc. Sesje nieinteraktywne odczytują zmienną środowiskową o nazwie BASH_ENV, aby pobrać nazwę pliku, który ma zostać użyty do zdefiniowania nowego środowiska.
Wdrażanie zmiennych środowiskowych
Ustawiając zmienne, zawsze zwracaj uwagę na to, w którym pliku je umieszczasz, opierając się na naszej powyższej dyskusji. Zapewni to elastyczność, gwarantując, że określone zmienne będą dostępne tylko w określonych sesjach. Nie chcesz przecież, aby kluczowej zmiennej zabrakło w jednej z sesji.
W niektórych przypadkach chcemy, aby zmienna istniała zarówno w sesjach logowania, jak i bez logowania. Na szczęście większość dystrybucji Linuksa domyślnie konfiguruje sesje logowania tak, aby odczytywały konfiguracje sesji bez logowania i udostępniały je procesom. Dlatego możesz po prostu zdefiniować swoje zmienne w plikach konfiguracyjnych sesji bez logowania. Zazwyczaj ustawiamy zmienne środowiskowe specyficzne dla użytkownika i chcemy, aby nasze ustawienia były dostępne zarówno w sesjach powłoki logowania, jak i bez logowania. Z tego powodu użyjemy pliku ~/.bashrc. Do edycji pliku użyjemy edytora nano. Wpisz następujące polecenie w terminalu, aby opuścić plik:
|
1 |
nano ~/.bashrc |
W otwartym pliku konfiguracyjnym możesz już zobaczyć kilka zmiennych. Możesz dodać zmienne środowiskowe w ten sam sposób, w jaki robisz to w wierszu poleceń. Po prostu wpisz polecenie:
|
1 |
export NAZWA_KLUCZA=wartość. |
Możesz je dodać w dowolnym miejscu w pliku – w nowej linii, a nie wewnątrz funkcji pętli. Następnie zapisz i zamknij plik. Każda kolejna uruchomiona sesja powłoki odczyta dane z tego pliku. Jeśli chcesz, aby bieżąca powłoka odczytała właśnie dodane ustawienia bez konieczności jej ponownego uruchamiania, możesz użyć polecenia:
|
1 |
source ~/.bashrc |
Ogólnosystemowe zmienne środowiskowe należy dodać w jednym z następujących plików: /etc/profile, /etc/bash.bashrc lub /etc/environment.
Podsumowując
Na koniec, możesz teraz ustawiać zmienne powłoki i środowiskowe oraz cieszyć się ogromnymi możliwościami, jakie te narzędzia dają Twojemu VPS! Ma to wiele zalet, takich jak automatyzacja uruchamiania niektórych procesów, automatyczna konfiguracja wdrożenia wymagająca danych uwierzytelniających, przekazywanie zmiennych do procesów potomnych i wiele innych. Zmienne środowiskowe pomagają ukryć wrażliwe dane, takie jak informacje uwierzytelniające, przed publicznymi repozytoriami, a także inne dane. Dzięki tym podstawom możesz tworzyć złożone skrypty, które można wykonywać automatycznie z poziomu wiersza poleceń bez konieczności stałego udziału użytkownika.
Miłego korzystania!
Komentarze
Brak komentarzy. Bądź pierwszy.