Zaawansowane podpsy Linux z przykładami

Zaawansowane podpsy Linux z przykładami

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
Zaawansowane podpsy Linux z przykładami

Zastosowane wymagania i konwencje oprogramowania

Wymagania oprogramowania i konwencje linii poleceń Linux
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