Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja | |||
so:funkcje_trap_xargs [2023/05/29 12:36] jkonczak [POSIX shell] |
so:funkcje_trap_xargs [2025/05/19 19:28] (aktualna) jkonczak |
||
---|---|---|---|
Linia 3: | Linia 3: | ||
==== POSIX shell ==== | ==== POSIX shell ==== | ||
- | Aby zdefiniować [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_05|funkcję]] w powłoce, należy użyć składni | + | Aby zdefiniować [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_09_05|funkcję]] w powłoce, należy użyć składni |
- | ''**//nazwa//() //treść//**'', gdzie //treść// powinna być [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04|złożoną komendą]] | + | ''**//nazwa//() //treść//**'', gdzie //treść// powinna być [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_09_04|złożoną komendą]] |
(np. poleceniami zamkniętymi w ''{ … }''). | (np. poleceniami zamkniętymi w ''{ … }''). | ||
\\ | \\ | ||
Linia 130: | Linia 130: | ||
===== Obsługa sygnałów ===== | ===== Obsługa sygnałów ===== | ||
- | Komendą ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_28|trap]] //polecenie// //SYGNAŁ//'' | + | Komendą ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_29|trap]] //polecenie// //SYGNAŁ//'' |
można ustawić obsługę podanego //SYGNAŁ//u oraz, podając zamiast nazwy sygnału | można ustawić obsługę podanego //SYGNAŁ//u oraz, podając zamiast nazwy sygnału | ||
słowo EXIT, ustawić polecenie do wykonania bezpośrednio przed zakończeniem | słowo EXIT, ustawić polecenie do wykonania bezpośrednio przed zakończeniem | ||
Linia 144: | Linia 144: | ||
\\ | \\ | ||
Składnia ''trap - //SYGNAŁ//'' przywraca domyślną obsługę sygnału. | Składnia ''trap - //SYGNAŁ//'' przywraca domyślną obsługę sygnału. | ||
+ | |||
+ | <HTML> | ||
+ | <p style="margin-bottom: 0"> | ||
+ | Zwróć uwagę na to, jakie znaczenie ma użycie pojedynczych bądź podwójnych | ||
+ | cudzysłowów przy podawaniu polecenia: | ||
+ | </p> | ||
+ | <pre style="line-height: 100%;margin: 0"> | ||
+ | <span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> cat trap.sh | ||
+ | #!/bin/sh | ||
+ | X=bogus | ||
+ | trap 'printf "single quotes: "; echo $X' USR1 | ||
+ | trap "printf 'double quotes: '; echo $X" USR2 | ||
+ | for X in 1 2 3; do | ||
+ | sleep 1 | ||
+ | done | ||
+ | <span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> ./trap.sh & sleep 2; kill -USR1 $!; kill -USR2 $!; wait | ||
+ | [1] 25178 | ||
+ | single quotes: 2 | ||
+ | double quotes: bogus | ||
+ | [1]+ Zakończono ./trap.sh | ||
+ | <span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> | ||
+ | </pre> | ||
+ | </HTML> | ||
+ | Dla czytelności i wygody często pisze się funkcję dla obsługi zdarzenia | ||
+ | i podaje jej wywołanie w komendzie ''trap''. | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Linia 162: | Linia 187: | ||
=== source === | === source === | ||
- | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_18|.]] //plik//'' (i komenda ''source //plik//'' w Bashu) uruchamiają | + | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_19|.]] //plik//'' (i komenda ''source //plik//'' w Bashu) uruchamiają |
polecenia z podanego pliku w bieżącej powłoce (tzn. tak jakby były wpisane z klawiatury). | polecenia z podanego pliku w bieżącej powłoce (tzn. tak jakby były wpisane z klawiatury). | ||
Linia 177: | Linia 202: | ||
=== eval i exec === | === eval i exec === | ||
- | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_19|eval]]'' | + | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_20|eval]]'' |
wykonuje podaną jako tekst komendę. | wykonuje podaną jako tekst komendę. | ||
- | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_20|exec]]'' | + | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/V3_chap02.html#tag_19_21|exec]]'' |
zawierająca tylko przekierowania ustawia podane przekierowania dla powłoki (było | zawierająca tylko przekierowania ustawia podane przekierowania dla powłoki (było | ||
przy okazji przekierowań), natomiast z podaną komendą zastępuje powłokę podanym | przy okazji przekierowań), natomiast z podaną komendą zastępuje powłokę podanym | ||
poleceniem. | poleceniem. | ||
+ | |||
+ | <HTML> | ||
+ | <pre style="line-height:100%"> | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> X=2 Y=X Z=\$$Y | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> echo $Z | ||
+ | $X | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> eval "echo $Z" | ||
+ | 2 | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> echo $$ | ||
+ | 27197 | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> sh | ||
+ | sh-5.2$ echo $$ | ||
+ | 27224 | ||
+ | sh-5.2$ exit | ||
+ | exit | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> echo $$ | ||
+ | 27197 | ||
+ | <span style="font-weight:bold;color:#7f7f7f;"></span><span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> exec sh | ||
+ | sh-5.2$ echo $$ | ||
+ | 27197 | ||
+ | </pre></HTML> | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Linia 204: | Linia 250: | ||
=== basename i dirname === | === basename i dirname === | ||
- | Program ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/basename.html#tag_20_07|basename]] //ścieżka// [//rozszerzenie//]'' wypisuje na standardowe wyjście nazwę pliku | + | Program ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/basename.html|basename]] //ścieżka// [//rozszerzenie//]'' wypisuje na standardowe wyjście nazwę pliku |
wskazanego ścieżką, opcjonalnie usuwając z nazwy //rozszerzenie//. | wskazanego ścieżką, opcjonalnie usuwając z nazwy //rozszerzenie//. | ||
- | Program ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/dirname.html#tag_20_35|dirname]] //ścieżka//'' wypisuje na standardowe wyjście katalog w którym znajduje się plik | + | Program ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/dirname.html|dirname]] //ścieżka//'' wypisuje na standardowe wyjście katalog w którym znajduje się plik |
wskazany ścieżką. | wskazany ścieżką. | ||
Linia 220: | Linia 266: | ||
=== fc === | === fc === | ||
- | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/fc.html#tag_20_44|fc]]'' tworzy plik tymczasowy, wstawia do niego poprzednią komendę z historii, otwiera | + | Komenda ''[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/fc.html|fc]]'' tworzy plik tymczasowy, wstawia do niego poprzednią komendę z historii, otwiera |
ten plik w edytorze tekstu, a po zamknięciu edytora wykonuje poprawioną komendę. | ten plik w edytorze tekstu, a po zamknięciu edytora wykonuje poprawioną komendę. | ||
Linia 249: | Linia 295: | ||
* ''$TABLICA'' podstawi wartość elementu pod indeksem 0 | * ''$TABLICA'' podstawi wartość elementu pod indeksem 0 | ||
* ''${TABLICA[//indeks//]}'' podstawi wartość elementu pod indeksem //indeks// | * ''${TABLICA[//indeks//]}'' podstawi wartość elementu pod indeksem //indeks// | ||
- | * ''${TABLICA[@]}'' podstawi wszystkie wartości w tablicy | + | * ''${TABLICA[@]}'' podstawi wszystkie wartości w tablicy |
- | * ''${!TABLICA[@]}'' podstawi wszystkie indeksy w tablicy | + | * ''${!TABLICA[@]}'' podstawi wszystkie indeksy w tablicy |
* ''${#TABLICA[@]}'' podstawi ilość elementów | * ''${#TABLICA[@]}'' podstawi ilość elementów | ||
+ | Zamknięcie w podwójny cudzysłów wyrażeń ''"${TABLICA[@]}"'' i ''"${!TABLICA[@]}"'' | ||
+ | działa tak jakby została w to miejsce podstawiona każda wartość osobno zamknięta | ||
+ | w podwójny cudzysłów. | ||
| | ||
==== Asocjacyjne ==== | ==== Asocjacyjne ==== | ||
Linia 270: | Linia 319: | ||
==== xargs ==== | ==== xargs ==== | ||
- | Program ''**[[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/xargs.html#tag_20_158|xargs]]** //program//'' czyta ze standardowego wejścia kolejne nazwy i wykonuje | + | Program ''**[[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/xargs.html|xargs]]** //program//'' czyta ze standardowego wejścia kolejne nazwy i wykonuje |
''//program//'' z tymi nazwami jako argumentem. | ''//program//'' z tymi nazwami jako argumentem. | ||
\\ | \\ | ||
Linia 306: | Linia 355: | ||
co powoduje problemy np. ze spacjami. | co powoduje problemy np. ze spacjami. | ||
\\ | \\ | ||
- | Większość implementacji polecenia ''xargs'' rozumie przełącznik ''-0'' | + | Większość implementacji polecenia ''xargs'' rozumie przełącznik ''-0''((Przełącznik |
+ | ''-0'' dla programu ''xargs'' stał się częścią standardu POSIX od 2024 roku.)) | ||
rozdzielający nazwy znakiem ''\0'': | rozdzielający nazwy znakiem ''\0'': | ||
<html><pre style="line-height:1em"> | <html><pre style="line-height:1em"> |