Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
|
so:variables_substitutions [2023/05/08 15:11] jkonczak [Oddzielanie, grupowanie poleceń] |
so:variables_substitutions [2025/04/29 21:44] (aktualna) 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 ==== | + | ==== 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 49: | ||
| 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 70: | ||
| 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 84: | ||
| 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 96: | Linia 108: | ||
| |''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 119: | Linia 131: | ||
| komendę ''lspci''. | komendę ''lspci''. | ||
| - | ===== Grupowanie poleceń i podstawienia ===== | + | ====== 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 kończy się powodzeniem jeśli wywoła ''exit(0);'' lub wykona ''return 0;'' w funkcji ''main''; inaczej kończy się błędem. </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 181: | ||
| ''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 200: | ||
| \\ | \\ | ||
| 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 216: | ||
| ''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''| | ||
| Linia 212: | Linia 235: | ||
| 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 253: | ||
| </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 271: | Linia 301: | ||
| 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 312: | ||
| 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 339: | ||
| </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 372: | ||
| \\ • 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 405: | ||
| \\ | \\ | ||
| 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''. | ||
| - | |||