Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
|
so:variables_substitutions [2023/05/15 13:09] jkonczak |
so:variables_substitutions [2026/05/06 21:01] (aktualna) jkonczak [Ćwiczenia] |
||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| - | ===== Podstawy zmiennych środowiskowych ===== | + | ====== Zmienne ===== |
| - | ==== Czym są ==== | + | ==== Zmienne środowiskowe ==== |
| Zmienne środowiskowe | Zmienne środowiskowe | ||
| - | ([[https://en.wikipedia.org/wiki/Environment_variable|Environment variables]]) | + | ([[https://en.wikipedia.org/wiki/Environment_variable|environment variables]]) |
| - | to powiązany z procesem zbiór par nazwa – wartość. | + | to zbiór par nazwa – wartość powiązany z procesem. |
| - | Nazwy zmiennych nie mogą zawierać znaku ''='' i powinny zawierać tylko litery | + | Nazwy zmiennych nie mogą zawierać znaku ''='' (<small>i znaku o wartości 0</small>). |
| - | (z zakresu ASCII), cyfry i podkreślnik, oraz powinny zaczynać się od litery. | + | |
| - | \\ | + | |
| - | Częstym stylem jest używanie tylko znaków ''A-Z'', ''_'' i ''0-9'' w nazwach | + | |
| - | zmiennych. | + | |
| **Każdy proces ma osobny zbiór zmiennych środowiskowych.** | **Każdy proces ma osobny zbiór zmiennych środowiskowych.** | ||
| Linia 17: | Linia 13: | ||
| można wybrać czy kopiuje wszystkie zmienne środowiskowe rodzica, czy kopiuje | można wybrać czy kopiuje wszystkie zmienne środowiskowe rodzica, czy kopiuje | ||
| inny podany zbiór zmiennych. | inny podany zbiór zmiennych. | ||
| - | \\ | ||
| - | Powłoka dzieli swoje zmienne środowiskowe na te które zostaną przekazane | ||
| - | procesom potomnym (//eksportowane//) i te, które nie będą przekazane procesom | ||
| - | potomnym. | ||
| **Zmienne środowiskowe __nie__ są pomysłem powłoki, tylko systemu operacyjnego.** | **Zmienne środowiskowe __nie__ są pomysłem powłoki, tylko systemu operacyjnego.** | ||
| - | ==== Ustawianie ==== | + | <small> |
| + | Programista ma dostęp do zmiennych środowiskowych praktycznie z każdego języka | ||
| + | programowania. | ||
| + | \\ | ||
| + | W językach C i %%C++%% jest to m. inn. funkcja | ||
| + | ''[[https://en.cppreference.com/c/program/getenv|char* getenv(const char* name)]]''. | ||
| + | |||
| + | W Linuksie można podejrzeć z jakimi zmiennymi środowiskowymi został uruchomiony | ||
| + | proces o identyfikatorze //pid// czytając plik ''%%/proc/%%//pid//%%/environ%%'' | ||
| + | (por. ''[[https://man7.org/linux/man-pages/man5/proc_pid_environ.5.html|man proc_pid_environ]]''). | ||
| + | </small> | ||
| + | |||
| + | ==== Zmienne w powłoce ==== | ||
| + | |||
| + | Przy starcie, proces powłoki (zgodnej z POSIX) włącza do zbioru zmiennych | ||
| + | swoje zmienne środowiskowe. | ||
| + | \\ | ||
| + | Powłoka dzieli swoje zmienne na te które zostaną przekazane jako zmienne | ||
| + | środowiskowe procesom potomnym (//eksportowane//) i te, które nie będą | ||
| + | przekazane procesom potomnym. | ||
| + | |||
| + | Nazwy zmiennych w powłoce mogą składać się z liter (z zakresu ASCII), cyfr i | ||
| + | podkreślnika, ponadto nazwy zmiennych nie mogą zaczynać się od cyfry i nie | ||
| + | zaleca się zaczynać od podkreślnika. | ||
| + | \\ | ||
| + | <small>Częstym stylem jest nieużywanie małych liter w nazwach zmiennych.</small> | ||
| + | |||
| + | === Ustawianie === | ||
| Ustawienie wartości zmiennej (i stworzenie jej, jeśli wcześniej nie istniała): | Ustawienie wartości zmiennej (i stworzenie jej, jeśli wcześniej nie istniała): | ||
| Linia 42: | Linia 61: | ||
| Uwaga: zwykle w powłoce pusta zmienna i nieustawiona zmienna zachowują się | Uwaga: zwykle w powłoce pusta zmienna i nieustawiona zmienna zachowują się | ||
| identycznie</small> | identycznie</small> | ||
| + | |||
| + | === Eksportowanie === | ||
| Domyślnie nowo tworzone zmienne nie są przekazywane do procesów potomnych. | Domyślnie nowo tworzone zmienne nie są przekazywane do procesów potomnych. | ||
| Linia 61: | Linia 82: | ||
| zmienną. | zmienną. | ||
| Bash pozwala na cofnięcie eksportowania zmiennej przez ''export -n //NAZWA//''. | Bash pozwala na cofnięcie eksportowania zmiennej przez ''export -n //NAZWA//''. | ||
| + | |||
| </small> | </small> | ||
| - | Aby zobaczyć listę wszystkich zmiennych środowiskowych, należy wykonać komendę | + | === Wypisywanie wszystkich zmiennych powłoki/środowiskowych === |
| - | ''**set**''((''set'' służy do wielu rzeczy naraz; z argumentami zmienia zachowanie | + | |
| - | powłoki.)). | + | Aby zobaczyć listę wszystkich zmiennych powłoki, należy wykonać komendę |
| + | ''**set**''((''set'' służy do wielu rzeczy naraz; z argumentami zmienia | ||
| + | zachowanie powłoki.)). | ||
| \\ | \\ | ||
| Aby zobaczyć listę eksportowanych zmiennych środowiskowych, należy | Aby zobaczyć listę eksportowanych zmiennych środowiskowych, należy | ||
| Linia 72: | Linia 96: | ||
| eksportowanych zmiennych.)). | eksportowanych zmiennych.)). | ||
| - | ==== (Najprostsze) odczytywanie wartości ==== | + | === (Najprostsze) odczytywanie wartości === |
| Aby powłoka wstawiła w podane miejsce wartość zmiennej o nazwie ''//NAZWA//'', | Aby powłoka wstawiła w podane miejsce wartość zmiennej o nazwie ''//NAZWA//'', | ||
| Linia 85: | Linia 109: | ||
| ==== Wybrane standardowe zmienne ==== | ==== Wybrane standardowe zmienne ==== | ||
| - | |''PATH''|Lista oddzielonych dwukropkami ścieżek w których będą szukane programy \\ Np. żeby wykonać komendę ''ls'', powłoka szuka pliku o nazwie ''ls'' w ścieżkach z ''PATH''| | + | |''LOGNAME'' / ''USER'' \\ ''UID''|Nazwa bieżącego użytkownika \\ Numeryczny identyfikator bieżącego użytkownika| |
| |''HOME''|Katalog domowy bieżącego użytkownika| | |''HOME''|Katalog domowy bieżącego użytkownika| | ||
| + | |''PWD''|Bieżący katalog roboczy| | ||
| + | |''PATH''|Lista oddzielonych dwukropkami ścieżek w których będą szukane programy \\ Np. żeby wykonać komendę ''date'', plik o nazwie ''date'' szukany jest w ścieżkach z ''PATH'' \\ <small>możesz to zaobserwować wykonując ''strace 3>&2 2>&1 1>&3 3>&- sh -c date | grep date''</small> | | ||
| + | |''LANG''|Język, region i kodowanie znaków; dla Polski zwykle ''pl_PL.UTF-8'' \\ np. ''de_CH.UTF-8'' oznacza niemiecki, Szwajcarię i kodowanie UTF-8| | ||
| |''PS1'' \\ ''PS2''|Podstawowy [[https://pl.wikipedia.org/wiki/Znak_zach%C4%99ty|znak zachęty]] (//prompt//) \\ Znak zachęty dla kolejnych linii komendy| | |''PS1'' \\ ''PS2''|Podstawowy [[https://pl.wikipedia.org/wiki/Znak_zach%C4%99ty|znak zachęty]] (//prompt//) \\ Znak zachęty dla kolejnych linii komendy| | ||
| - | |''PWD''|Bieżący katalog roboczy| | ||
| |''EDITOR''|Domyślny edytor tekstowy \\ Np. ''less'' przy otwarciu pliku do edycji skrótem ''v'' uruchamia ''$EDITOR //ścieżka_do_pliku//''| | |''EDITOR''|Domyślny edytor tekstowy \\ Np. ''less'' przy otwarciu pliku do edycji skrótem ''v'' uruchamia ''$EDITOR //ścieżka_do_pliku//''| | ||
| - | |''LOGNAME'' / ''USER'' \\ ''UID''|Nazwa bieżącego użytkownika \\ Numeryczny identyfikator bieżącego użytkownika| | + | |<small>''TERM''</small>|<small>Nazwa terminala określająca jego techniczne możliwości, takie jak ilość wspieranych kolorów, możliwość przesuwania kursora wstecz etc. Więcej w ''[[https://man7.org/linux/man-pages/man7/term.7.html|man 7 term]]''.</small>| |
| - | |''LANG''|Język, region i kodowanie znaków; dla Polski zwykle ''pl_PL.UTF-8'' \\ np. ''de_CH.UTF-8'' oznacza niemiecki, Szwajcarię i kodowanie UTF-8| | + | |
| - | |<small>''TERM''</small>|<small>Nazwa terminala określająca jego techniczne możliwości, takie jak ilość wspieranych kolorów, możliwość przesuwania kursora wstecz etc. Więcej w ''man 7 term'' ([[https://man7.org/linux/man-pages/man7/term.7.html|wersja online]]).</small>| | + | |
| |<small>''COLUMNS'' \\ ''LINES''</small>|<small>Liczba znaków mieszczący się na ekranie w wierszu (=kolumn) \\ Liczba wierszy (linii tekstu) mieszczących się na ekranie</small>| | |<small>''COLUMNS'' \\ ''LINES''</small>|<small>Liczba znaków mieszczący się na ekranie w wierszu (=kolumn) \\ Liczba wierszy (linii tekstu) mieszczących się na ekranie</small>| | ||
| |''RANDOM''|Losowa liczba (generowana na nowo przy każdym odwołaniu się do zmiennej)| | |''RANDOM''|Losowa liczba (generowana na nowo przy każdym odwołaniu się do zmiennej)| | ||
| - | Więcej w [[https://www.gnu.org/software/bash/manual/html_node/Shell-Variables.html|dokumentacji Basha]] i [[https://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html|standardzie POSIX]] . | + | Więcej w [[https://www.gnu.org/software/bash/manual/html_node/Shell-Variables.html|dokumentacji Basha]] i [[https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap08.html|standardzie POSIX]] . |
| ==== Ćwiczenia ==== | ==== Ćwiczenia ==== | ||
| Linia 115: | Linia 139: | ||
| ~~Zadanie.#~~ Zmień wartość zmiennej ''PS1''. | ~~Zadanie.#~~ Zmień wartość zmiennej ''PS1''. | ||
| - | ~~Zadanie.#~~ Spróbuj wykonać komendę ''lspci''. Zmień wartość zmiennej ''PATH'' | + | ~~Zadanie.#~~ Wykonaj komendę ''install -D /bin/vdir ~/mojeProgramy/listujPliki'' |
| - | tak, żeby zawierała ścieżki ''/sbin'' i ''/usr/sbin''. Ponownie spróbuj wykonać | + | (<small>która skopiuje plik ''/bin/vdir'' do katalogu ''~/mojeProgramy'' pod nazwę |
| - | komendę ''lspci''. | + | ''listujPliki'', automatycznie tworząc brakujące katalogi</small>). |
| + | Następnie spróbuj wykonać komendę ''listujPliki'' (<small>nie podając pełnej | ||
| + | ścieżki do tego programu</small>). Potem zmień wartość zmiennej ''PATH'' | ||
| + | tak, żeby zawierała ścieżkę ''~/mojeProgramy'' i ponownie spróbuj wykonać | ||
| + | komendę ''listujPliki''. | ||
| + | ====== Grupowanie poleceń i podstawienia ====== | ||
| - | ===== Grupowanie poleceń i podstawienia ===== | + | Działanie powłoki ([[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_01|wg. POSIX]], [[https://www.gnu.org/software/bash/manual/html_node/Shell-Operation.html|wg. podręcznika Basha]]): |
| + | |1. czyta linię| ''echo ${Y} "$Z 2+3=$%%((2+3))%%"; ll baz|sort>$(date +%F)''||| | ||
| + | |2. rozbija ją na tokeny \\ i **rozwiązuje aliasy**| ''echo'', ''${Y}'', ''"$Z 2+3=$%%((2+3))%%"'', '';'', ''ll'', ''baz'', ''|'', ''sort'', ''>'', ''$(date +%F)'' \\ ''echo'', ''${Y}'', ''"$Z 2+3=$%%((2+3))%%"'', '';'', ''ls'', ''-l'', ''baz'', ''|'', ''sort'', ''>'', ''$(date +%F)''||| | ||
| + | |3. **dzieli na komendy** |''echo'', ''${Y}'', ''"$Z 2+3=$%%((2+3))%%"''| ''ls'', ''-l'', ''baz''|''sort'', ''>'', ''$(date +%F)''| | ||
| + | |4. **wykonuje podstawienia**| ''echo'', ''a'', ''b'', ''c d 2+3=5''| ''ls'', ''-l'', ''baz''|''sort'', ''>'', ''2025-04-27''| | ||
| + | |5. ustawia przekierowania|''echo'', ''a'', ''b'', ''c d 2+3=5''| ''ls'', ''-l'', ''baz''|''sort''| | ||
| + | |6. uruchamia komendy| | ||
| - | Działanie powłoki ([[https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_01|wg. POSIX]], [[https://www.gnu.org/software/bash/manual/html_node/Shell-Operation.html|wg. podręcznika Basha]]): | + | ===== Oddzielanie, grupowanie poleceń ===== |
| - | |1. czyta linię| ''echo ${Y} "$Z 2+3=$%%((2+3))%%" > file; ls baz''| | + | |
| - | |2. rozbija ją na tokeny i rozwiązuje aliasy| ''echo'', ''${Y}'', ''"$Z 2+3=$%%((2+3))%%"'', ''>'', ''file'', '';'', ''ls'', ''--color=auto'', ''baz''| | + | |
| - | |3. **dzieli na komendy**|''echo'', ''${Y}'', ''"$Z 2+3=$%%((2+3))%%"'' , ''>'', ''file''| | + | |
| - | |4. **wykonuje podstawienia**| ''echo'', ''a'', ''b'', ''c d 2+3=5'' , ''>'', ''file''| | + | |
| - | |5. ustawia przekierowania|''echo'', ''a'', ''b'', ''c d 2+3=5''| | + | |
| - | |6. uruchamia komendę| | | + | |
| - | + | ||
| - | ==== Oddzielanie, grupowanie poleceń ==== | + | |
| Polecenia można oddzielać przez: | Polecenia można oddzielać przez: | ||
| * '';'' – ''cmd ; …'' wykonana ''cmd'' i przejdzie dalej | * '';'' – ''cmd ; …'' wykonana ''cmd'' i przejdzie dalej | ||
| * ''&'' – ''cmd & …'' uruchomi w tle ''cmd'' i przejdzie dalej | * ''&'' – ''cmd & …'' uruchomi w tle ''cmd'' i przejdzie dalej | ||
| - | * operatory logiczne: | + | * operatory logiczne:<html> |
| - | * ''&&'' – ''a && b'' wykona ''a'' i jeśli ''a'' zakończy się powodzeniem, uruchomi ''b'' \\ ewaluuje do prawdy wtedy i tylko wtedy gdy ''a'' i ''b'' zakończą się powodzeniem | + | <ul> |
| - | * ''||'' – ''a || b'' wykona ''a'' i jeśli ''a'' zakończy się błędem, uruchomi ''b'' \\ ewaluuje do fałszu wtedy i tylko wtedy gdy ''a'' i ''b'' zakończą się błędem | + | <li class="level2"><div class="li"></html> ''&&'' – ''a && b'' wykona ''a'' i jeśli ''a'' zakończy się powodzeniem, uruchomi ''b'' \\ ewaluuje do prawdy wtedy i tylko wtedy gdy ''a'' i ''b'' zakończą się powodzeniem<html></div></li> |
| + | <li class="level2"><div class="li"></html> ''||'' – ''a || b'' wykona ''a'' i jeśli ''a'' zakończy się błędem, uruchomi ''b'' \\ ewaluuje do fałszu wtedy i tylko wtedy gdy ''a'' i ''b'' zakończą się błędem<html></div></li> | ||
| + | </ul> | ||
| + | </html><small>Program w C/C%%++%% kończy się powodzeniem jeśli wywoła ''exit(0);'' lub ''return 0;'' w funkcji ''main''; inaczej kończy się błędem. \\ Porównaj też z ''python -c 'exit(0)' && echo success || echo fail'' zmieniając potem ''0'' na inną wartość.</small> | ||
| Polecenia można grupować przez: | Polecenia można grupować przez: | ||
| * ''{ … }'' – grupuje polecenia w tej powłoce, \\ //Uwaga//: polecenia wewnątrz ''{ … }'' muszą być zakończone przez '';'' lub ''&'' \\ //Uwaga//: między nawiasami wąsatymi i poleceniem muszą być spacje | * ''{ … }'' – grupuje polecenia w tej powłoce, \\ //Uwaga//: polecenia wewnątrz ''{ … }'' muszą być zakończone przez '';'' lub ''&'' \\ //Uwaga//: między nawiasami wąsatymi i poleceniem muszą być spacje | ||
| * ''(…)'' – uruchamia polecenia w osobnej powłoce ("podpowłoce"). | * ''(…)'' – uruchamia polecenia w osobnej powłoce ("podpowłoce"). | ||
| + | <html><div style="margin-top:-1.4em"></div></html> | ||
| + | <small>Wynik grupy poleceń to wynik ostatniego z poleceń w grupie – ''{ true; false; }'' zwraca niepowodzenie. \\ Uruchomienie polecenia w tle kończy się powodzeniem jeśli udało się uruchomić polecenie w tle – ''{ false& }'' zwraca sukces. </small> | ||
| + | | ||
| Przykłady: | Przykłady: | ||
| * ''{ cd /tmp; pwd; }; pwd'' – wejdzie do ''/tmp'' i wypisze dwa razy katalog roboczy ''/tmp'' | * ''{ cd /tmp; pwd; }; pwd'' – wejdzie do ''/tmp'' i wypisze dwa razy katalog roboczy ''/tmp'' | ||
| Linia 163: | Linia 196: | ||
| ''fortune''. | ''fortune''. | ||
| - | ==== Podstawienia ==== | + | ===== Podstawienia ===== |
| Podstawienia (//shell expansion// / //word expansion//) polegają na zastąpieniu tekstu | Podstawienia (//shell expansion// / //word expansion//) polegają na zastąpieniu tekstu | ||
| (pasującego do konkretnego wzorca) przez określoną wartość | (pasującego do konkretnego wzorca) przez określoną wartość | ||
| - | ([[https://pubs.opengroup.org/onlinepubs/009604499/utilities/xcu_chap02.html#tag_02_06|wg. POSIX]], | + | ([[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_06|wg. POSIX]], |
| [[https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html|wg. podręcznika Basha]]). | [[https://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html|wg. podręcznika Basha]]). | ||
| - | Dostępne podstawienia (w kolejności wykonywania przez BASH): | + | Dostępne podstawienia (w kolejności wykonywania przez Bash): |
| * ''{…}'' – zakres lub lista (<small>Uwaga: POSIX nie definiuje tego podstawienia, jest ono dostępne w Bashu i niektórych innych powłokach</small>) | * ''{…}'' – zakres lub lista (<small>Uwaga: POSIX nie definiuje tego podstawienia, jest ono dostępne w Bashu i niektórych innych powłokach</small>) | ||
| * ''~'' i ''~//username//'' – katalog domowy | * ''~'' i ''~//username//'' – katalog domowy | ||
| Linia 182: | Linia 215: | ||
| \\ | \\ | ||
| Wewnątrz pojedynczych cudzysłowów nie są wykonywane żadne podstawienia. | Wewnątrz pojedynczych cudzysłowów nie są wykonywane żadne podstawienia. | ||
| + | |||
| + | <small> | ||
| + | Wewnątrz pojedynczych cudzysłowów poprzedzonych znakiem dolara – ''%%$'…'%%'' – | ||
| + | nie są wykonywane podstawienia, natomiast sekwencje znaków poprzedzanych przez | ||
| + | odwrócony ukośnik takie jak np. ''\n'' są zastępowane odpowiadającymi im znakami. | ||
| \\ | \\ | ||
| - | <small>W Bashu funkcjonują też cudzysłowy ''$'…%%'%%'' które pozwalają na | + | Takie zachowanie (dostępne od dawna w niektórych powłokach) zostało włączone do |
| - | wprowadzanie sekwencji poprzedzanych przez odwrócony ukośnik takich jak np. | + | standardu POSIX od 2024 roku. Szczegóły w [[https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html|dokumentacji Basha]] |
| - | ''\n''; patrz | + | i najnowszym [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_02_04|standardzie POSIX]]. |
| - | [[https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html|dokumentacja Basha]]. | + | |
| </small> | </small> | ||
| Linia 194: | Linia 231: | ||
| ''słowa'', a ''ls "$(echo dwa słowa)"'' spróbuje wypisać katalog ''dwa słowa'' | ''słowa'', a ''ls "$(echo dwa słowa)"'' spróbuje wypisać katalog ''dwa słowa'' | ||
| - | === Zakres / lista – nawiasy wąsate === | + | ==== Zakres / lista – nawiasy wąsate (rozszerzenie Basha) ==== |
| + | | | <small>przykładowe wyrażenie \\ z nawiasami wąsatymi </small> | <small>na co zostanie zastąpione</small> | | ||
| |liczby (lub litery) z podanego zakresu \\ <small>format: ''{początek..koniec..krok}''</small>|**''{1..5}''**|''1 2 3 4 5''| | |liczby (lub litery) z podanego zakresu \\ <small>format: ''{początek..koniec..krok}''</small>|**''{1..5}''**|''1 2 3 4 5''| | ||
| |:::|''file{15..20}.txt''|''file15.txt file16.txt file17.txt file18.txt''| | |:::|''file{15..20}.txt''|''file15.txt file16.txt file17.txt file18.txt''| | ||
| |:::|<small>''{0..9..3}''</small>|<small>''0 3 6 9''</small>| | |:::|<small>''{0..9..3}''</small>|<small>''0 3 6 9''</small>| | ||
| - | |:::|<small>''{a..z..2}''</small>|<small>''a f k p u z''</small>| | + | |:::|<small>''{a..z..5}''</small>|<small>''a f k p u z''</small>| |
| |wymienione po przecinkach elementy \\ <small>format: ''{element1,element2,…}''</small>|**''{a,b,d,f}''**|''a b d f''| | |wymienione po przecinkach elementy \\ <small>format: ''{element1,element2,…}''</small>|**''{a,b,d,f}''**|''a b d f''| | ||
| |:::|**''/tmp/{ala,ma,kota}.txt''**|''/tmp/ala.txt /tmp/ma.txt /tmp/kota.txt''| | |:::|**''/tmp/{ala,ma,kota}.txt''**|''/tmp/ala.txt /tmp/ma.txt /tmp/kota.txt''| | ||
| |:::|''file{,.gz,.bzip2,.xz}''|''file file.gz file.bzip2 file.xz''| | |:::|''file{,.gz,.bzip2,.xz}''|''file file.gz file.bzip2 file.xz''| | ||
| + | |||
| + | //Uwaga:// w Bashu to podstawienie jest wykonywane przed innymi, w tym np. | ||
| + | __przed__ podstawianiem wartości zmiennych. | ||
| + | \\ | ||
| + | Dlatego np. <del>''{1..$X}''</del> nie jest zamieniane na liczby. | ||
| ~~Zadanie.#~~ Stwórz puste pliki ''plik_1'', ''plik_2'', ..., ''plik_9'' (używając nawiasów wąsatych do stworzenia listy plików). | ~~Zadanie.#~~ Stwórz puste pliki ''plik_1'', ''plik_2'', ..., ''plik_9'' (używając nawiasów wąsatych do stworzenia listy plików). | ||
| Linia 212: | Linia 255: | ||
| listy plików). | listy plików). | ||
| - | === Katalogi domowe === | + | ==== Katalogi domowe ==== |
| |katalog domowy bieżącego użytkownika |**''~''**|''///home/username//'' | | |katalog domowy bieżącego użytkownika |**''~''**|''///home/username//'' | | ||
| |<small>katalog domowy użytkownika username</small>|<small>''~username''</small>|<small>''/home/username''</small>| | |<small>katalog domowy użytkownika username</small>|<small>''~username''</small>|<small>''/home/username''</small>| | ||
| + | |||
| + | Podstawienia ''~'' i ''~//user//'' są wykonywane tylko na początku czegoś co | ||
| + | może być ścieżką zdaniem powłoki (i nie są wykonywane wewnątrz cudzysłowów). | ||
| + | <small> Szczegóły w [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_06_01|standardzie POSIX]] | ||
| + | i [[https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html|dokumentacji Basha]].</small> | ||
| ~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
| Linia 225: | Linia 273: | ||
| </small> | </small> | ||
| - | === Zmienne / parametry === | + | ==== Zmienne / parametry ==== |
| Poza podstawianiem wartości zmiennej przez **''$ZMIENNA''** można też użyć składni | Poza podstawianiem wartości zmiennej przez **''$ZMIENNA''** można też użyć składni | ||
| - | **''${ZMIENNA}''**. Pozwala to np., na napisanie ''${SIZE}<nowiki>MB</nowiki>''. | + | **''${ZMIENNA}''**. |
| + | \\ | ||
| + | Pozwala to np., na napisanie ''${SIZE}<nowiki>MB</nowiki>''. | ||
| Wyrażenie ''${#ZMIENNA}'' podstawia długość (ilość znaków) zmiennej. \\ | Wyrażenie ''${#ZMIENNA}'' podstawia długość (ilość znaków) zmiennej. \\ | ||
| Linia 247: | Linia 297: | ||
| ~~Zadanie.#~~ Wpisz do zmiennej ''FILE'' nazwę pliku. Następnie wykonaj | ~~Zadanie.#~~ Wpisz do zmiennej ''FILE'' nazwę pliku. Następnie wykonaj | ||
| - | polecenie które zmieni nazwę tego pliku dodając na koniec rozszerzenie ''.txt''. | + | polecenie które zmieni nazwę pliku wskazanego przez zmienną ''FILE'' dodając na |
| + | koniec rozszerzenie ''.txt''. | ||
| ~~Zadanie.#~~ Czy rozwiązanie poprzedniego zadania zadziała dla nazwy pliku ze | ~~Zadanie.#~~ Czy rozwiązanie poprzedniego zadania zadziała dla nazwy pliku ze | ||
| Linia 271: | Linia 322: | ||
| pliku wskazanego przez ''S''. | pliku wskazanego przez ''S''. | ||
| \\ | \\ | ||
| - | Następnie wypisz wartość ''D'' oraz ''S''. | + | Następnie wypisz wartość ''D'' oraz ''F''. |
| ~~Zadanie.#~~ Przygotuj komendę która zmienia nazwę pliku wskazanego przez | ~~Zadanie.#~~ Przygotuj komendę która zmienia nazwę pliku wskazanego przez | ||
| zmienną ''F'' tak, by nazwa nie zawierała spacji. | zmienną ''F'' tak, by nazwa nie zawierała spacji. | ||
| - | === Podstawianie wyników poleceń === | + | ==== Podstawianie wyników poleceń ==== |
| Wyrażenia ''**$(**//cmd//**)**'' oraz ''`//cmd//`'' zostaną zastąpione wynikiem polecenia ''//cmd//''. | Wyrażenia ''**$(**//cmd//**)**'' oraz ''`//cmd//`'' zostaną zastąpione wynikiem polecenia ''//cmd//''. | ||
| Linia 282: | Linia 333: | ||
| Trzeba pamiętać że w linii ''//cmd// … $(//sub//) …'' najpierw zostanie w całości | Trzeba pamiętać że w linii ''//cmd// … $(//sub//) …'' najpierw zostanie w całości | ||
| wykonane polecenie ''//sub//'', a potem jego wynik będzie podstawiony w miejsce | wykonane polecenie ''//sub//'', a potem jego wynik będzie podstawiony w miejsce | ||
| - | ''$(//sub//)''. | + | ''$(//sub//)'' i dopiero po tej operacj zostanie wykonana komenda ''//cmd// …''. |
| Zaleca się używać składni ''$(//cmd//)'', składnia ''`//cmd//`'' jest wspierana | Zaleca się używać składni ''$(//cmd//)'', składnia ''`//cmd//`'' jest wspierana | ||
| Linia 309: | Linia 360: | ||
| </small> | </small> | ||
| - | ===== Arytmetyka ====== | + | ==== Arytmetyka ===== |
| Powłoka wspiera obliczenia (przynajmniej) całkowitoliczbowe. \\ | Powłoka wspiera obliczenia (przynajmniej) całkowitoliczbowe. \\ | ||
| Standard POSIX definiuje tylko składnię ''**$%%((%%**…**))**''. \\ | Standard POSIX definiuje tylko składnię ''**$%%((%%**…**))**''. \\ | ||
| - | Bash dodatkowo posiada polecenie ''let …'' wykonujące podane działania. | + | Bash dodatkowo posiada składnię ''%%((…))%%'' oraz polecenie ''let …'' wykonujące |
| + | podane działania. | ||
| - | Wewnątrz ''%%$((…))%%'' / ''let …'' można: | + | Wewnątrz ''%%$((…))%%'' / ''%%((…))%%'' / ''let …'' można: |
| * pomijać ''$'' przed nazwami zmiennych, np. ''%%x=$((x+2))%%'' | * pomijać ''$'' przed nazwami zmiennych, np. ''%%x=$((x+2))%%'' | ||
| * używać operatora przypisania, np. ''%%echo $((y=2**5, z=10^6))%%'' przypisze do ''y'' wartość ''2<sup>5</sup> = 32'', przypisze do z wartość ''10 xor 6 = 12'', wyliczy ''32, 12 = 12'' (operator przecinka z C) i wykona ''echo 12'' | * używać operatora przypisania, np. ''%%echo $((y=2**5, z=10^6))%%'' przypisze do ''y'' wartość ''2<sup>5</sup> = 32'', przypisze do z wartość ''10 xor 6 = 12'', wyliczy ''32, 12 = 12'' (operator przecinka z C) i wykona ''echo 12'' | ||
| - | * zawartość ''%%$((…))%%'' jest traktowana jakby była w podwójnych cudzysłowach,\\ zawartość ''let …'' liczy każdy z argumentów z osobna, \\ np: ''X=$%%((%% ( 2 + 2 ) * 2 ))'', ''let "X = ( 2 + 2 ) * 3"'', ''let X=(2+2)*3'' i ''let X=(2+2)*3 Y=2*X+1'' są poprawne, ale <del>''let X = ( 2 + 2 ) * 3''</del> już nie | + | * zawartość ''%%$((…))%%'' i ''%%((…))%%'' jest traktowana jaki jedno wyrażenie (z parsowaniem takim jakby było w podwójnych cudzysłowach), natomiast zawartość ''let …'' liczy każdy z argumentów z osobna, \\ np: ''X=$%%((%% ( 2 + 2 ) * 2 ))'', ''let "X = ( 2 + 2 ) * 3"'', ''let X=(2+2)*3'' i ''let X=(2+2)*3 Y=2*X+1'' są poprawne, ale <del>''let X = ( 2 + 2 ) * 3''</del> już nie |
| * wewnątrz ''let …'' trzeba escape'ować znaki specjalne, np. ''let X=0xff\&1066'' / ''let "X = 0xff & 1066"'' | * wewnątrz ''let …'' trzeba escape'ować znaki specjalne, np. ''let X=0xff\&1066'' / ''let "X = 0xff & 1066"'' | ||
| - | POSIX [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/expr.html|standaryzuje]] też program ''expr'' który wykonuje podane obliczenie i wypisuje jego wynik na standardowe wejście. | + | POSIX [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/expr.html|standaryzuje]] też program ''expr'' który wykonuje podane obliczenie i wypisuje jego wynik na standardowe wejście. |
| <small> | <small> | ||
| Linia 341: | Linia 393: | ||
| \\ • wypisze różnicę między ''END'' a ''START'' | \\ • wypisze różnicę między ''END'' a ''START'' | ||
| - | ===== Aliasy ====== | + | ==== Aliasy ===== |
| - | Alias ([[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/alias.html|POSIX]], [[https://www.gnu.org/software/bash/manual/html_node/Aliases.html|Bash]]) to | + | Alias ([[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/alias.html|POSIX]], [[https://www.gnu.org/software/bash/manual/html_node/Aliases.html|Bash]]) to |
| słowo, które jeśli wystąpi w miejscu komendy, to zostanie zastąpione wcześniej | słowo, które jeśli wystąpi w miejscu komendy, to zostanie zastąpione wcześniej | ||
| ustalonym tekstem. | ustalonym tekstem. | ||