Narzędzia użytkownika

Narzędzia witryny


so:variables_substitutions

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Poprzednia rewizja po obu stronachPoprzednia wersja
Nowa wersja
Poprzednia wersja
so:variables_substitutions [2023/05/08 13:11] – [Oddzielanie, grupowanie poleceń] jkonczakso:variables_substitutions [2026/05/06 19:01] (aktualna) – [Ćwiczenia] jkonczak
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 
-===== Grupowanie poleceń i podstawienia =====+ś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 ======
  
-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]]): +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))%%" > file; ls baz''| +|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))%%"'', ''>'', ''file'', '';'', ''ls'', ''--color=auto'', ''baz''| +|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))%%"'' , ''>'', ''file''| +|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'' , ''>'', ''file''| +|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''| +|5. ustawia przekierowania|''echo'', ''a'', ''b'', ''c d 2+3=5''| ''ls'', ''-l'', ''baz''|''sort''| 
-|6. uruchamia komendę| |+|6. uruchamia komendy|
  
-==== Oddzielanie, grupowanie poleceń ====+===== 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.
Linia 374: Linia 426:
 \\ \\
 Użyj tego aliasu. Użyj tego aliasu żeby wyświetlić kalendarz na rok 2025. Użyj tego aliasu. Użyj tego aliasu żeby wyświetlić kalendarz na rok 2025.
- 
-===== Wykonywanie poleceń z pliku ===== 
- 
-==== Tryb (nie)interaktywnym ==== 
- 
-Powłoka uruchomiona bez argumentów działa w **trybie interaktywnym**. 
-\\ 
-Powłoka uruchomiona z nazwą pliku jako argumentem działa w **trybie nieinteraktywnym**. 
- 
-W trybie interaktywnym powłoka czyta polecenia ze standardowego wejścia, w trybie 
-nieinteraktywnym z podanego pliku. 
-\\ 
-W trybie nieinteraktywnym powłoka nie wypisuje na ekran znaku zachęty i niektórych 
-komunikatów diagnostycznych. 
- 
-~~Zadanie.#~~ Umieść w pliku ''//plik//'' w osobnych liniach polecenie 
-''echo hello world'' oraz polecenie ''date''. Wykonaj ''sh //plik//''. 
- 
-~~Zadanie.#~~ Umieść w pliku ''//plik//'' polecenie ''readlink /proc/$$/exe''. 
-Ustaw uprawnienia wykonywania dla tego pliku (np. ''chmod +x //plik//''). 
-Wykonaj ten plik przez ''.%%/%%//plik//''. Potem uruchom inną powłokę (np. 
-''csh'' lub ''zsh'') i znów wykonaj ''.%%/%%//plik//''. 
-Jaka powłoka wykonuje domyślnie skrypty? 
- 
-==== Shebang ==== 
- 
-Jeżeli pierwsza linia pliku ''//plik//'' zaczyna się od ''**#!**//prog//'', 
-to uruchamiając ''//plik// //arg//...'' zostanie wykonane 
-''//prog// //plik// //arg//...''. 
-\\ 
-Taka pierwsza linia ma nazwę [[https://pl.wikipedia.org/wiki/Shebang|shebang]] 
-(i jest respektowana zarówno przez powłoki, jak i np. jądro Linuksa). 
-\\ 
-**Shebang musi zaczynać się od pełnej ścieżki do pliku wykonywalnego** i powinien móc 
-zawierać opcje. 
-\\ 
-Jeśli plik ''//plik//'' zaczyna się od ''#!//prog// //a1//...'', 
-to wykonanie ''//plik// //a2//...'' uruchomi ''//prog// //a1//... //plik// //a2//...''. 
- 
-~~Zadanie.#~~ Wpisz do pliku ''//plik//'' kolejno: 
-\\       • ''#!/bin/ls -la'' 
-\\       • ''#!/usr/bin/bat'' 
-\\       • ''#!/usr/bin/env cowsay'' 
-\\       • ''#!/bin/rm'' 
-\\ Nadaj uprawnienia wykonania dla ''//plik//''u i wykonaj go (z każdym kolejnym 
-shebangiem). 
- 
-Skrypty powłoki zawierają zwykle shebang **''#!/bin/sh''** (lub ''#!/bin/bash'', 
-jeśli skrypt korzysta z rozszerzeń Basha) i tradycyjnie nadaje im się rozszerzenie 
-**''.sh''**. 
-\\ 
-W wielu językach skryptowych tradycyjnie używa się shebanga (np. python, perl, 
-ruby). 
- 
-~~Zadanie.#~~ Napisz skrypt ''hello_world.sh'' który po uruchomieniu wypisze 
-na ekranie ''hello world''. 
- 
  
  
so/variables_substitutions.1683551460.txt.gz · ostatnio zmienione: (edycja zewnętrzna)