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
${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
: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
.bashrc, takie jak shopt -s globstar dla rekurencyjnego globbingu za pomocą **.