Zaawansowane podpsy Linux z przykładami
- 3676
- 539
- Laura Zygmunt
Jeśli przeczytasz nasze poprzednie subshelly Linux dla początkujących z przykładami artykułu lub masz już doświadczenia w podsmelach, wiesz, że subshells są potężnym sposobem manipulowania poleceniami Bash w linii i w sposób wrażliwy na kontekst.
W tym samouczku się nauczysz:
- Jak stworzyć bardziej zaawansowane polecenia Subshell
- Gdzie możesz zastosować bardziej zaawansowane podsminy we własnym kodzie
- Przykłady bardziej zaawansowanych poleceń Subshell
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | Niezależny od rozkładu Linuksa |
Oprogramowanie | Wiersz poleceń Bash, system oparty na Linuksie |
Inny | Wszelkie narzędzie, które nie jest zawarte w skorupce Bash domyślnie można zainstalować za pomocą za pomocą sudo apt-get instal instal narzędzie (lub mniam zamiast apt-get) |
Konwencje | # - Wymaga wykonywania Linux -Commands z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$-Wymaga wykonania Linux-commands jako zwykłego niepewnego użytkownika |
Przykład 1: zliczanie plików
$ if [$ (ls [a -z]* 2>/dev/null | wc -l) -Gt 0]; Następnie echo „Znalazłem jedno lub więcej wystąpień plików [A-Z]*!"; fi
Tutaj mamy Jeśli
Oświadczenie z pierwszą wartością porównawczą Subshell. Działa to dobrze i zapewnia dużą elastyczność, jeśli chodzi o pisanie Jeśli
sprawozdania. Jest inaczej niż binarna (prawda lub fałsz) jak działanie na przykład Jeśli GREP -Q 'Search_term' ./Docfile.tekst
oświadczenie. Raczej jest oceniany jako taki jako standardowe porównanie (dopasowane do większej liczby -GT 0
klauzula).
Subshell próbuje wyreżyserować pliki listy wymienionych [A-Z]*
, I.mi. pliki zaczynające się od co najmniej jednej litery w A-Z
Zakres, a następnie każdy późniejszy charakter. Jest bezpieczny przez błąd, dodając 2>/dev/null
- I.mi. Każdy wyświetlony błąd (włączony Stderr
- Wyjście błędu standardowego, oznaczone przez 2
) zostanie przekierowany >
Do /dev/null
- I.mi. Urządzenie zerowe Linux - a tym samym zignorowane.
Wreszcie przekazujemy dane wejściowe LS WC -L
co będzie dla nas liczyły, ile wierszy (lub w tym przypadku plików) widziano. Jeśli wynik był większy niż 0, pokazano notatkę informacyjną.
Zwróć uwagę, jak zróżnicowany jest kontekst, w którym działają subshell. Po pierwsze, w tym przypadku subshell pracuje w bieżącym katalogu roboczym (i.mi. $ Pwd
) co jest szczególnie domyślne I.mi. Domyślnie subshells zaczynają się od własnego środowiska PWD
Ustaw w bieżącym katalogu roboczym. Po drugie, subshell działa w kontekście Jeśli
oświadczenie.
To polecenie nie generuje żadne wyjście, ponieważ jest wykonywane w pustym katalogu. Należy jednak pamiętać, że fakt, że żadne wyjście nie jest generowane, oznacza również, że nasza tłumienie błędów działa. Sprawdźmy to:
$ if [$ (ls [a -z]* | wc -l) -Gt 0]; Następnie echo „Znalazłem jedno lub więcej wystąpień plików [A-Z]*!„; Fi ls: nie można uzyskać dostępu” [A-Z]*': Brak takiego pliku lub katalogu
Widzimy, jak usunięcie tłumienia błędu działało we wcześniejszym przykładzie. Następnie utwórzmy plik i zobaczmy, jak działa nasz jeden-liner:
$ dotyk a $ if [$ (ls [a -z]* 2>/dev/null | wc -l) -Gt 0]; Następnie echo „Znalazłem jedno lub więcej wystąpień plików [A-Z]*!„; Fi znalazłem jedno lub więcej wystąpień plików [A-Z]*!
Świetnie, wygląda na to, że nasz jedno-liniowy scenariusz działa dobrze. Następnie dodajmy plik dodatkowy i sprawdź, czy możemy poprawić wiadomość
$ touch b $ if [$ (ls [a -z]* 2>/dev/null | wc -l) -Gt 0]; Następnie echo „Znalazłem jedno lub więcej wystąpień plików [A-Z]*!„; Fi znalazłem jedno lub więcej wystąpień plików [A-Z]*! $ if [$ (ls [a -z]* 2>/dev/null | wc -l) -Gt 0]; Następnie echo "Znaleziono dokładnie $ (ls [a-z]* 2>/dev/null | wc -l) wystąpienia plików [a-z]*!„; Fi znalazłem dokładnie 2 wystąpienia plików [A-Z]*!
Tutaj widzimy, że dodanie drugiego pliku (według dotyk b
) nie robi żadnej różnicy (jak widać w pierwszym Jeśli
polecenie), chyba że zmienimy dane wyjściowe, aby faktycznie zgłosić, ile plików znaleziono poprzez wstawienie wtórnej podsmokelly do wyjścia.
Nie jest to jednak optymalnie zakodowane; W takim przypadku dwie subshelly wymagają wykonania (koszt tworzenia subshell jest bardzo minimalny, ale jeśli masz wiele subshellów utworzonych w wysokiej częstotliwości, koszt ma znaczenie), a bezpośrednio wymagane jest dwukrotnie (generowanie dodatkowych I/O i I/O Spowolnienie naszego kodu do prędkości podsystemu we/wy i rodzaju używanego dysku). Umieśćmy to w zmiennej:
$ Count = "$ (ls [a -z]* 2>/dev/null | wc -l)"; if [$ count -gt 0]; Następnie echo "Znaleziono dokładnie $ count wystąpienia plików [a-z]*!„; Fi znalazłem dokładnie 2 wystąpienia plików [A-Z]*!
Świetnie. Jest to bardziej optymalny kod; Używana jest pojedyncza subshell, a wynik jest przechowywany w zmiennej, która jest następnie używana dwukrotnie, a konieczne jest tylko pobieranie pojedynczego katalogu dysku. Zauważ też, że to rozwiązanie może być bardziej bezpieczne dla wątków.
Na przykład w Jeśli
Oświadczenie, które miały dwie subshelly, jeśli w czasie pomiędzy wykonaniem tych subshellów powstał trzeci plik, wynik może wyglądać tak: Znalazłem dokładnie 3 wystąpienia plików [A-Z]*!
podczas gdy pierwszy Jeśli
stwierdzenie (przy użyciu pierwszej subshelly) naprawdę zakwalifikowało się Jeśli 2 -GT 0
- I.mi. 2. W tym przypadku nie miałoby to znaczenia, ale możesz zobaczyć, jak w niektórych kodowaniach może to stać się bardzo ważne.
Przykład 2: Podpsy do obliczeń
$ touch z $ echo $ [$ (data + %s) - $ (stat -c %z ./z)] 1 $ echo $ [$ (data + %s) - $ (stat -c %z ./z)] 5
Tutaj utworzyliśmy plik, a mianowicie z
, a następnie odkryłem wiek pliku w sekundach za pomocą drugiego polecenia. Kilka sekund później ponownie wykonaliśmy polecenie i widzimy, że plik ma teraz 5 sekund.
Data +%s
Polecenie daje nam obecny czas w sekundach od Epoch (1970-01-01 UTC) i Stat -c %z
daje nam kilka sekund od epoki dla pliku, który został wcześniej utworzony, a teraz odwołuje się tutaj jako ./z
, Więc wszystko, co musimy zrobić, to odejmować te dwa od siebie. Umieszczamy Data +%s
Po pierwsze, ponieważ jest to najwyższa liczba (czas bieżący), a zatem poprawnie oblicz przesunięcie w sekundach.
-C
opcja Stat
po prostu wskazuje, że w tym przypadku chcemy określonego formatowania wyjściowego %Z
, lub innymi słowy, czas od epoki. Dla data
Składnia dla tego samego pomysłu jest +%S
, choć w związku z bieżącym czasem i niezwiązany z konkretnym plikiem.
Przykład 3: Subshells Inside SED i inne narzędzia
$ echo '0'> a $ sed -i "s | 0 | $ (whoami) |" ./a $ cat a roel
Jak widać, możemy użyć subshell w prawie każdym poleceniu, które wykonujemy w wierszu poleceń.
W takim przypadku tworzymy plik A
Z AS Treść 0
a następnie wbudowany wymień 0
Do $ (whoami)
które, gdy podsekwel jest wykonywany jako analizowany polecenie, zastąpi nazwie użytkownika Roel
. Uważaj, aby nie używać pojedynczych cytatów, ponieważ sprawi, że subshell nieaktywna, ponieważ ciąg będzie interpretowany jako tekst dosłowny:
$ echo '0'> a $ sed -i 's | 0 | $ (whoami) |' ' ./a $ cat a $ (whoami)
Zwróć uwagę na to, że sed
Włączona składnia (S | 0 |… |
) nadal działa poprawnie (!), podczas gdy funkcjonalność bashu $ ()
nie!
Przykład 4: Korzystanie z EACT i A dla pętli
$ Loops = 3 $ echo 1… $ Loops 1… 3 $ eval echo 1… $ Loops 1 2 3 $ dla I in $ (echo 1… $ Loops); echo "$ i"; zrobione 1… 3 $ dla i in $ (eval echo 1… $ Loops); echo "$ i"; Zrobione 1 2 3
Ten przykład, choć nie optymalny sposób na wykonanie prostego Do
Pętla, pokazuje nam kilka sposobów integracji subshellów nawet wewnętrznych pętli. Używamy ocenia
stwierdzenie do przetworzenia 1… 3
tekst do 1 2 3, który można następnie użyć bezpośrednio wewnątrz Do
Pętla powtórz klauzula.
Czasami korzystanie z subshellów i dostarczanie informacji w linii kontekstu za pośrednictwem subshells nie zawsze jest oczywiste i może wymagać testowania, poprawki i dostrajania, zanim subshells wykonają zgodnie z oczekiwaniami. Jest to normalne i bardzo zgodne z normalnym kodowaniem bash.
Wniosek
W tym artykule zbadaliśmy bardziej dogłębne i zaawansowane przykłady korzystania z subshells w Bash. Moc subshellów pozwoli ci przekształcić większość scenariuszy jedno-liniowych do ich znacznie mocniejszych wersji, nie wspominając o możliwości użycia ich w skryptach. Kiedy zaczniesz odkrywać subshells i znajdziesz miłe sposoby ich użycia, opublikuj je poniżej w komentarzach!
Cieszyć się!
Powiązane samouczki Linux:
- Rzeczy do zainstalowania na Ubuntu 20.04
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
- Linux Subshells dla początkujących z przykładami
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Jak używać bash subshells w środku, jeśli instrukcje
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…
- Polecenia Linux: Top 20 najważniejsze polecenia, które musisz…
- Podstawowe polecenia Linux
- Pobierz Linux
- Zainstaluj Arch Linux na stacji roboczej VMware