Ukryte Perełki: Mało Znane Funkcje Bash

Bash jest jedną z najczęściej używanych powłok w świecie Uniksa, jednak wiele z jego najpotężniejszych funkcji pozostaje niewykorzystanych. Ten artykuł omawia kilka mniej znanych możliwości, które mogą znacząco zwiększyć twoją produktywność w wierszu poleceń.

1. Rozwijanie nawiasów (Brace Expansion) do szybkiego tworzenia plików

Chociaż wielu użytkowników zna podstawowe rozwijanie nawiasów, takie jak {1..5}, niewielu zdaje sobie sprawę z jego pełnego potencjału dla złożonych wzorców i struktur zagnieżdżonych.

# Utwórz kompletną strukturę projektu w jednej linii
mkdir -p project/{src,tests,docs}/{js,css,img}

# Wygeneruj pliki sekwencyjne z dopełnieniem zerami
touch file_{001..100}.txt

# Połącz wiele rozwinięć
echo {a,b,c}{1,2,3}  # wynik: a1 a2 a3 b1 b2 b3 c1 c2 c3

2. Sztuczki z rozwijaniem parametrów (Parameter Expansion)

Rozwijanie parametrów w Bashu wykracza daleko poza proste podstawianie zmiennych, oferując potężne możliwości manipulacji ciągami znaków.

# Wartości domyślne
echo ${undefined_var:-"wartość domyślna"}

# Usuń rozszerzenia plików
filename="document.pdf"
echo ${filename%.pdf}  # wynik: document

# Podmień podciągi
path="/home/user/documents"
echo ${path/home/root}  # wynik: /root/user/documents

# Pobierz długość ciągu
echo ${#filename}  # wynik: 12

# Wyodrębnianie podciągu
echo ${filename:0:8}  # wynik: document
Wskazówka Pro: Użyj ${var^^} do konwersji na wielkie litery oraz ${var,,} do konwersji na małe litery (Bash 4+).

3. Podstawianie procesów (Process Substitution)

Podstawianie procesów pozwala traktować wyjście polecenia jak plik, co umożliwia potężne porównania i manipulacje danymi.

# Porównaj wyjście dwóch poleceń
diff <(ls dir1) <(ls dir2)

# Użyj wielu wejść dla polecenia
paste <(seq 1 5) <(seq 6 10)

# Czytaj z procesu
while read line; do
    echo "Linia: $line"
done < <(find . -name "*.txt")

4. Potężne polecenie testowe [[

Polecenie testowe z podwójnymi nawiasami oferuje znaczące przewagi nad tradycyjnym pojedynczym nawiasem, w tym dopasowywanie wzorców i operatory logiczne.

# Dopasowywanie wzorców bez cudzysłowów
if [[ $filename == *.txt ]]; then
    echo "Wykryto plik tekstowy"
fi

# Dopasowywanie wyrażeń regularnych (Regex)
if [[ $email =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "Prawidłowy format email"
fi

# Operatory logiczne bez konieczności escape'owania
if [[ $age -gt 18 && $age -lt 65 ]]; then
    echo "Wiek produkcyjny"
fi

5. Here Strings i Here Documents

Te funkcje zapewniają eleganckie sposoby na przekazywanie wielowierszowych danych wejściowych do poleceń.

# Here string (<<<)
tr '[:lower:]' '[:upper:]' <<< "zamień to na wielkie litery"

# Here document
cat << EOF > config.txt
server: localhost
port: 8080
timeout: 30
EOF

# Pomiń wcięcia tabulacji za pomocą <<-
cat <<- EOF
	Ten tekst może być wcięty
	w twoim skrypcie dla czytelności
	EOF

6. Grupowanie poleceń i podpowłoki (Subshells)

Grupuj polecenia, aby kontrolować zakres wykonania i zmienne środowiskowe.

# Grupowanie za pomocą { } wykonuje się w bieżącej powłoce
{ cd /tmp; ls; } > output.txt

# Podpowłoka z ( ) tworzy izolowane środowisko
(cd /tmp && rm -rf test_dir)  # nie zmienia bieżącego katalogu

# Połącz z przekierowaniami
{ echo "Nagłówek"; cat data.txt; echo "Stopka"; } > complete.txt

7. Rozwijanie historii za pomocą !

Nawiguj i ponownie wykorzystuj historię poleceń efektywnie dzięki tym operatorom.

# Wykonaj ostatnie polecenie zaczynające się od 'git'
!git

# Pobierz ostatni argument poprzedniego polecenia
ls /var/log/nginx/access.log
cat !$  # odpowiednik: cat /var/log/nginx/access.log

# Pobierz wszystkie argumenty z poprzedniego polecenia
mv !*

# Zamień tekst w poprzednim poleceniu
^old^new  # zamienia pierwsze wystąpienie
Uwaga dotycząca bezpieczeństwa: Użyj :p aby podejrzeć rozwinięcia historii bez ich wykonywania: !git:p

8. Manipulacja tablicami

Tablice w Bashu oferują więcej funkcjonalności, niż wielu użytkowników przypuszcza.

# Zadeklaruj i wypełnij tablice
files=(*.txt)
numbers=({1..10})

# Wycinki tablic (slicing)
echo ${files[@]:2:3}  # elementy 2-4

# Długość tablicy
echo ${#files[@]}

# Usuń elementy pasujące do wzorca
filtered=(${files[@]/*test*/})

# Dołącz do tablicy
files+=("nowy_plik.txt")

9. Automatyczna kontrola zadań

Zarządzaj procesami w tle bardziej efektywnie.

# Uruchom w tle i odłącz (disown - działa po zamknięciu powłoki)
long_running_task &
disown

# Czekaj na konkretne zadanie w tle
./script1.sh & pid=$!
# wykonaj inną pracę
wait $pid

# Uruchom polecenie tylko, jeśli poprzednie się powiodło
make && make install

# Uruchom niezależnie od poprzedniego wyniku
make; make install

10. Rozszerzone dopasowywanie wzorców (Extended Globbing)

Włącz możliwości dopasowywania wzorców, które rywalizują z wyrażeniami regularnymi.

# Najpierw włącz extended globbing
shopt -s extglob

# Dopasuj wszystko oprócz wzorca
ls !(*.txt)  # wszystkie pliki oprócz .txt

# Dopasuj zero lub jedno wystąpienie
ls file?(s).log  # pasuje do file.log i files.log

# Dopasuj jedno lub więcej
ls file+(s).log  # pasuje do files.log, filess.log, itp.

# Dopasuj zero lub więcej
ls @(*.jpg|*.png)  # pasuje do plików .jpg LUB .png
Wzrost produktywności: Dodaj przydatne opcje shopt do swojego pliku .bashrc, takie jak shopt -s globstar dla rekurencyjnego globbingu za pomocą **.