Generator skryptu Bash
Strict mode, obsługa błędów, logowanie, argumenty z --dry-run oraz gotowe zadania: kopia zapasowa i czyszczenie plików
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Zmieniłeś ustawienia. Kliknij „Generuj skrypt”, aby odświeżyć wynik.
Liczba linii
Rozmiar
Funkcje
Ochrona przed błędami
set -Eeuo pipefail + trap ERR
deploy.sh
Jak uruchomić
Ściąga: bezpieczny skrypt Bash
| Polecenie | Co robi | Na co uważać |
|---|---|---|
| set -e | Przerywa skrypt, gdy polecenie zwróci kod różny od 0 | Nie działa w warunku if/while ani w listach && / || (poza ostatnim poleceniem) |
| set -u | Błąd przy użyciu nieustawionej zmiennej | Dla opcjonalnych zmiennych pisz ${ZMIENNA:-domyślna} |
| set -o pipefail | Potok kończy się błędem, gdy zawiedzie dowolne polecenie w potoku | Bez tego liczy się tylko kod ostatniego polecenia |
| set -E | Funkcje dziedziczą pułapkę trap … ERR | Bez tego błąd w funkcji (np. main) omija on_error |
| IFS=$'\n\t' | Dzieli niecytowane rozwinięcia tylko na nowej linii i tabulatorze | Spacje w nazwach plików nie rozbijają pętli for |
| trap … EXIT | Uruchamia sprzątanie przy każdym zakończeniu skryptu | Dobre miejsce na usunięcie katalogu tymczasowego |
| flock -n 9 | Blokada: druga kopia skryptu kończy się od razu | Chroni zadania z crona przed nakładaniem się |
| command -v tar | Sprawdza, czy polecenie jest dostępne | Wbudowane w powłokę, przenośniejsze niż which |
| bash -n plik.sh | Sprawdza składnię bez uruchamiania | Nie wykryje błędów logicznych |
Kolejność w szkielecie
Najpierw tryb strict, potem konfiguracja w zmiennych (każdą nadpiszesz, np. RETENTION_DAYS=30 ./backup.sh), funkcja log, pułapka błędów, argumenty i dopiero main. Dzięki temu błąd w dowolnym miejscu jest zalogowany z numerem linii, a skrypt nie wykonuje dalszych kroków.
Typowe pułapki
Cron uruchamia skrypt z okrojonym PATH (zwykle /usr/bin:/bin), więc podawaj pełne ścieżki. find -mtime +7 łapie pliki zmienione co najmniej 8 pełnych dób temu, bo find obcina ułamki doby. Zmienne zawsze w cudzysłowach: "$PLIK", inaczej spacja w nazwie rozbije polecenie.
Przed pierwszym uruchomieniem
Sprawdź składnię: bash -n skrypt.sh, a jeśli masz ShellCheck, przepuść przez niego plik. Zadania, które usuwają pliki, uruchom najpierw z --dry-run: skrypt wypisze polecenia zamiast je wykonać. Testuj na kopii danych, nie na produkcji.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator skryptu Bash
Dobry skrypt Bash zaczyna się od shebanga i trybu strict, ma logowanie, obsługę błędów i bezpieczne parsowanie argumentów. Ten generator składa gotowy szkielet z tymi elementami, a w funkcji main wstawia jedno z czterech zadań: pętlę przykładową, kopię zapasową katalogu do archiwum tar.gz z rotacją, usuwanie plików starszych niż N dni albo pusty szablon pod własną logikę.
Elementy skryptu
| Element | Znaczenie |
|---|---|
| set -Eeuo pipefail | przerwij przy błędzie, nieustawionej zmiennej i w potoku; -E przekazuje pułapkę ERR do funkcji |
| trap ERR | przechwycenie błędu i wpis z kodem wyjścia oraz numerem linii |
| log() | komunikaty z datą na stderr i do pliku LOG_FILE |
| while + case | opcje -e/--environment, -n/--dry-run, -v/--verbose, -h/--help |
| run() | w trybie --dry-run wypisuje polecenie zamiast je wykonać |
| command -v | sprawdza, czy wymagane polecenia (np. rsync, jq) są zainstalowane |
| flock -n 9 | opcjonalna blokada przed uruchomieniem drugiej kopii skryptu |
| EUID | opcjonalne przerwanie, gdy skrypt nie działa jako root |
| mktemp -d + trap EXIT | opcjonalny katalog tymczasowy usuwany przy każdym wyjściu |
Szablony „Wdrożenie”, „Kopia zapasowa” i „Czyszczenie plików” ustawiają jednym kliknięciem nazwę pliku, opis, zadanie, katalog i liczbę dni. Ścieżki i retencja trafiają do zmiennych readonly na górze skryptu, a każdą z nich nadpiszesz przy uruchomieniu, np. RETENTION_DAYS=30 ./backup.sh.
Przykład
Początek i koniec szkieletu z domyślnymi ustawieniami (szablon „Wdrożenie”). Pierwsza linia to shebang wskazujący /usr/bin/env bash, dalej:
# Skrypt wdrożeniowyset -Eeuo pipefailIFS=$'\n\t'readonly LOG_FILE="${LOG_FILE:-/var/log/deploy.log}"
…main() {log INFO "Start: $0 (środowisko: ${ENVIRONMENT:-default})"# TODO: zaimplementuj logikę
…}main "$@"
Uruchomienie
Po zapisaniu nadaj prawa wykonywania: chmod +x skrypt.sh, sprawdź składnię bez uruchamiania: bash -n skrypt.sh, a następnie uruchom ./skrypt.sh --help. Generator pokazuje te polecenia z nazwą twojego pliku, a przy kopii i czyszczeniu dodaje przykładowy wpis crona na 3:00.
Jak składa się wygenerowany skrypt
Generator nie wykonuje żadnego polecenia i nie analizuje twojej logiki. To składacz tekstu: wybrane bloki trafiają do wyniku w ustalonej kolejności — shebang z komentarzem, tryb strict i IFS, konfiguracja w zmiennych, funkcja log, trap ERR, katalog tymczasowy, obsługa argumentów, funkcja main i na końcu jej wywołanie. Nad kodem widzisz liczbę linii, rozmiar w bajtach, liczbę funkcji i ocenę ochrony przed błędami: „pełna” wymaga jednocześnie trybu strict i trap ERR.
Kolejność bloków nie jest przypadkowa. Funkcja log musi być zdefiniowana, zanim cokolwiek może zawieść, bo korzysta z niej procedura on_error wywoływana przez trap ERR. Wywołanie main "$@" musi znaleźć się na samym końcu, bo powłoka czyta plik od góry do dołu i w chwili wywołania wszystkie funkcje muszą już istnieć. Argumenty są czytane wcześniej, poza main: pętla while z case zdejmuje je poleceniem shift i zapisuje w zmiennych ENVIRONMENT, DRY_RUN i VERBOSE, z których korzysta dalsza część skryptu.
Tryb strict działa globalnie, od miejsca włączenia do końca pliku. set -e przerywa pracę po pierwszym poleceniu z niezerowym kodem, set -u zgłasza błąd przy odwołaniu do niezdefiniowanej zmiennej, a set -o pipefail sprawia, że potok kończy się błędem, gdy zawiedzie którekolwiek polecenie, a nie tylko ostatnie (zwracany jest kod ostatniego polecenia, które zawiodło). Gdy zaznaczysz trap ERR, generator dopisuje też -E, bez którego pułapka nie zadziałałaby wewnątrz funkcji, czyli w całym main.
Przykład krok po kroku
- Klikasz szablon „Kopia zapasowa”. Generator ustawia plik backup.sh, katalog źródłowy /var/www/html i retencję 7 dni. Przy domyślnych opcjach wynik ma ponad sto linii, a w main zamiast komentarza TODO stoją gotowe polecenia mkdir, tar i find.
- Pobierasz plik i nadajesz mu prawo wykonywania poleceniem chmod +x backup.sh. Bez tego kroku powłoka odmówi uruchomienia pliku przez ./ i pozostanie wywołanie bash backup.sh.
- Uruchamiasz ./backup.sh --help. Parser trafia w gałąź -h, wypisuje sposób użycia i kończy pracę kodem 0 — żadna operacja na danych nie zostaje wykonana.
- Uruchamiasz ./backup.sh --dry-run. Skrypt sprawdza, czy w systemie są tar, gzip i find, a potem funkcja run zamiast wykonać mkdir, tar i find wypisuje je jako wpisy [dry-run]. Nic nie powstaje i nic nie znika.
- Uruchamiasz ./backup.sh -e prod. Powstaje archiwum w rodzaju /var/backups/backup/html-20261021-030000.tar.gz, a find usuwa archiwa tego katalogu starsze niż RETENTION_DAYS dni. Nieznana opcja kończy skrypt kodem 1 i wypisuje pomoc, środowisko spoza dev, staging i prod też daje kod 1.
- Jeśli któreś polecenie zawiedzie, na przykład tar nie może odczytać części plików, set -e przerywa skrypt, a trap ERR zapisuje wpis ERROR z kodem wyjścia i numerem linii. Skrypt kończy pracę tym samym kodem, więc cron albo CI widzą niepowodzenie.
Co robi każdy element szkieletu
| Fragment szkieletu | Rola w działaniu skryptu | Skutek pominięcia |
|---|---|---|
| shebang /usr/bin/env bash | wybiera interpreter na podstawie zmiennej PATH | uruchomienie przez sh grozi błędami składni, bo sh bywa inną powłoką |
| set -e | przerywa skrypt po pierwszym niezerowym kodzie polecenia | skrypt brnie dalej i wykonuje kolejne kroki na błędnych danych |
| set -u | zgłasza błąd przy użyciu niezdefiniowanej zmiennej | literówka w nazwie zmiennej podstawia pusty tekst zamiast błędu |
| set -o pipefail | potok kończy się błędem, gdy zawiedzie dowolne jego polecenie | błąd w środku potoku zostaje zamaskowany przez ostatnie polecenie |
| set -E | przekazuje pułapkę ERR do funkcji | błąd wewnątrz main nie uruchomi on_error i nie trafi do logu |
| IFS=$'\n\t' | ustala separator pól na nową linię i tabulator | spacje w nazwach plików rozbijają argumenty na części |
| trap ERR | uruchamia procedurę obsługi błędu i dopisuje numer linii | log nie mówi, w którym miejscu skrypt się zatrzymał |
| --dry-run i run() | wypisuje polecenia zamiast je wykonywać | pierwszy test kopii lub czyszczenia odbywa się na żywych danych |
| main "$@" | uruchamia główną logikę po zdefiniowaniu wszystkich funkcji | skrypt definiuje funkcje, ale nic nie robi |
| chmod +x | nadaje plikowi prawo wykonywania | plik uruchomisz tylko przez bash skrypt.sh, nie przez ./skrypt.sh |
Praktyczne wskazówki
- Uruchom skrypt z opcją --help, zanim go rozbudujesz. Sprawdzisz, czy parser argumentów działa.
- Całą logikę trzymaj w main. Poza nią zostaw definicje funkcji i ustawienia globalne, a nowe polecenia, które zmieniają dane, poprzedzaj słowem run — wtedy --dry-run obejmie także je.
- Sprawdź, gdzie trafia log. Domyślny LOG_FILE to /var/log/<nazwa>.log; zwykły użytkownik zwykle nie ma tam prawa zapisu, a szkielet celowo wycisza ten błąd, więc komunikaty pojawią się tylko na stderr. Uruchom skrypt przez sudo albo podaj np.
LOG_FILE="$HOME/backup.log". - Testuj na kopii danych. Tryb strict potrafi zatrzymać skrypt w połowie serii operacji, więc pierwsze uruchomienie po --dry-run zrób na katalogu roboczym.
- Nie mieszaj kodu z konfiguracją. Szkielet zbiera ścieżki i retencję w zmiennych na górze pliku; własne progi i nazwy dopisuj w tym samym miejscu, a nie w środku funkcji.
Ograniczenia generatora
- Nie zna twojej logiki. Poza kopią zapasową i czyszczeniem narzędzie dostarcza wyłącznie szkielet, a resztę dopisujesz w miejscu oznaczonym jako TODO.
- Nie sprawdza składni po twojej edycji. Generator zwraca tekst i go nie uruchamia; błąd wyłapiesz poleceniem bash -n albo dopiero przy starcie skryptu.
- Ma stały zestaw opcji. Parser obsługuje -e, -n, -v i -h, a środowisko przyjmuje tylko dev, staging i prod. Inne przełączniki dopisujesz w pętli case i w funkcji usage.
- Pilnuje ścieżek. Katalog musi być ścieżką bezwzględną bez spacji i „..”, retencja liczbą od 1 do 3650 dni, a wymaganych poleceń może być najwyżej 15. Czyszczenia nie ustawisz na / ani na katalogi systemowe, takie jak /etc, /var czy /home — trzeba wskazać podkatalog.
- Celuje w bash na Linuksie. W sh lub zsh skrypt może zachowywać się inaczej, a blokada flock wymaga pakietu util-linux.
Najczęstsze pytania
Po co IFS w skrypcie Bash?
Ustawia separator pól na nową linię i tabulator, więc spacja w nazwie pliku nie rozbija pętli for ani niecytowanych rozwinięć. Nie zastępuje cudzysłowów wokół zmiennych.
Czym jest trap w Bash?
To procedura uruchamiana przy błędzie (ERR) lub przy wyjściu ze skryptu (EXIT). W szkielecie trap ERR loguje kod i linię błędu, a trap EXIT usuwa katalog tymczasowy z mktemp.
Czy skrypt działa na macOS?
Tak, bo shebang wskazuje /usr/bin/env bash, a szkielet nie korzysta z funkcji basha 4. Polecenia flock macOS domyślnie nie ma, więc opcję blokady wyłącz albo doinstaluj flock.
Jak uruchomić skrypt Bash?
Zapisz wynik w pliku .sh, nadaj mu prawo wykonywania i uruchom przez ./nazwa.sh. Bez nadawania praw zadziała wywołanie przez interpreter, czyli bash nazwa.sh.
Czy tryb strict zawsze powinien być włączony?
W skryptach automatyzujących prawie zawsze tak, bo szybciej ujawnia błąd niż ciche przejście do kolejnego kroku. Polecenie, które może legalnie zawieść, zapisz jako polecenie || true albo sprawdź w warunku if.
Jak przekazać argumenty do skryptu Bash?
Podajesz je po nazwie pliku, np. ./deploy.sh -e staging --dry-run. Pętla case rozpoznaje -e, -n, -v i -h, a każdy inny argument kończy skrypt kodem 1 z opisem użycia.