Kompleks Linux Bash One-Liner Przykłady
- 4061
- 1173
- Pani Janina Cieśla
Bash One Liners może zmniejszyć obciążenie pracą, zautomatyzować coś szybko i umieścić moc ostatecznego sterowania systemem w rękach. Z czasem prawdopodobnie nauczysz się pisać bardziej złożone jedno-liniowce, a niektóre z rzeczy, które w końcu piszesz jako doświadczony profesjonal. To powiedziawszy, język dowodzenia i rozwoju Bash jest wysoce ustrukturyzowany - i stosunkowo łatwy do zrozumienia - gdy dowiesz się o In i outs. To naprawdę jak bierzesz w języku obcym.
W tym samouczku się nauczysz:
- Jak napisać bardziej zaawansowane polecenia i scenariusze Bash One-Liner
- Zrozum, jak połączyć różne polecenia w scenariusze jedno-liniowe
- Zrozum, w jaki sposób kody wyjścia z jednego polecenia mogą wpływać na inne polecenia podczas używania
&&I|| - Zrozum, w jaki sposób wejście z polecenia można zmodyfikować, a następnie być używane przez następne polecenie
- Wykorzystanie i prawdziwe przykłady bardziej zaawansowanych liniowców Bash
Kompleks Linux Bash One-Liner Przykłady 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 Mnij instalacja dla systemów opartych na Redhat) |
| 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: Kontrola procesu
Zacznijmy od przykładu zakończenia niektórych procesów w Bash w łatwy do naśladowania sposób:
$ Sleep 3600 i [1] 1792341 $ ps -ef | Grep „Sleep” Roel 1792441 1701839 0 12:59 PTS/13 00:00:00 Sleep 3600 Roel 1792452 1701839 0 12:59 PTS/13 00:00:00 Grep -Color = Auto Sleep -Auto Sleep -Auto Sleep -Auto Sleep
Najpierw konfigurujemy polecenie snu, przez 3600 sekund (jedna godzina), a następnie znajdujemy ten proces na liście procesów. Świetnie, ale mamy rzeczywiste Grep polecenie jako dodatkowy wiersz w wyniku listy procesu. Filtrujmy to, a także wyodrębnij identyfikator procesu Dalej zamiast pełnego wyjścia informacji o procesie:
$ ps -ef | Grep „Sleep” | grep -v grep roel 1792441 1701839 0 12:59 PTS/13 00:00:00 Sleep 3600 $ ps -ef | Grep „Sleep” | grep -v grep | awk 'drukuj 2 $ 1792441
W pierwszym poleceniu odfiltrowaliśmy aktywny grep. W drugim poleceniu poszliśmy o krok dalej, drukując drugą kolumnę 2 USD (wewnątrz Awk) za pomocą Awk Komenda. Możemy teraz użyć tego o krok dalej i właściwie zabić ten proces. Powiedzmy, że robimy to z sygnałem 9 który jest wysoce destrukcyjny dla każdego procesu Linuksa (Sigkill):
$ ps -ef | Grep „Sleep” | grep -v grep | awk 'drukuj 2 $' | Xargs Kill -9 [1]+ zabity sen 3600
I widzimy, że nasz proces został poprawnie zabity. Podczas gdy był to prostszy przykład, dotyczył 6 różnych poleceń: Ps, Grep, Grep Ponownie, Awk, Xargs I zabić. Możesz zobaczyć, w jaki sposób Bash One-liners może szybko budować złożoność na wiele różnych sposobów i na wielu różnych poziomach złożoności i zdolności przetwarzania danych.
I, aby dowiedzieć się więcej o XARGS, zapoznaj się z naszymi artykułami Xargs dla początkujących z przykładami i multi wątkiem XARG z przykładami.
Przykład 2: Zabawa z sukcesem i porażką!
$ echo '0'> a && echo '1'> b && echo '2'> c && ls czynotexist || ls a && ls b && ls c && ls d && ls e ls: nie można uzyskać dostępu „czynotExist”: brak takiego pliku lub katalogu a b c ls: nie można uzyskać dostępu „d”: brak takiego pliku lub katalogu
Co za złożona linia! Jednak gdy wiesz, jak to przeczytać, a może już to zrobisz, jest bardzo łatwe do odczytania. Pokazajmy to twierdzenie, że jest ważne, rozkładając polecenie w mniejszych kawałkach wielkości kęsa, które są łatwiejsze do zrozumienia i śledzenia:
$ echo '0'> a && echo '1'> b && echo '2'> c
Cały ten zestaw poleceń jest taki sam jak następujące z jednym małym zastrzeżeniem:
$ echo '0'> a $ echo '1'> b $ echo '2'> c
Więc jaka jest różnica (i małe zastrzeżenie)?
Że w tej ostatniej serii poleceń każde polecenie zostanie wykonane, bez względu na wynik poprzedniego polecenia. Poprzednia sekwencja (za pomocą &&) przejdzie tylko do drugiego Echo Jeśli Wynik pierwszego polecenia był 0 (I.mi. Sukces - w sukcesie Bash w poleceniu jest wskazany przez 0 i porażka z 1 lub wyższy jako kod wyjściowy).
Zatem sekwencja poleceń za pomocą && można również napisać w następujący sposób;
$ echo '0'> a $ if [$ ? -eq 0]; następnie echo „1”> b; fi $ if [$ ? -eq 0]; następnie echo „2”> c; fi
$ ? (Lub $? w krótkiej składce) Zmienna zawsze zawiera wynik ostatniego polecenia, i.mi. kod wyjściowy (0, 1 lub wyższe) generowane przez ostatnie polecenie.
Jak widzimy, jednoczęściowe stworzenie echo '0'> a && echo '1'> b && echo '2'> c Z pewnością jest łatwiejsze dla oczu i zrozumienia teraz i zdecydowanie zmniejsza złożoność odpowiedniego i pasującego kodu wyświetlonego tuż powyżej.
Następnie weźmy tylko jedno polecenie:
$ echo '0'> a && echo '1'> b && echo '2'> c && ls czynotExist ls: nie można uzyskać dostępu „czynotExist ': brak takiego pliku lub katalogu
To teraz czyta o wiele łatwiej, prawda?
Właśnie dodaliśmy kolejne polecenie, a mianowicie LS nieistnie pod warunkiem, że polecenie przed nim (iw takim przypadku do całego wiersza jako wszystkich poleceń są połączone && w konfiguracji podobnej do łańcucha, w której wadliwe polecenie rozbije łańcuch i zatrzyma w całości wykonywanie łańcucha). W miarę sukcesu wszystkich poleceń, LS jest wykonywany, a błąd jest produkowany w wyniku tego samego, ponieważ plik, cóż, naprawdę nie istnieje 🙂
Więc co by się stało, gdybyśmy dołączyli do innego && na końcu? Czy łańcuch poleceń zakończyłby się tak, jak powiedzieliśmy? Nieco ulepszmy polecenie:
$ echo '0'> a && echo '1'> b && echo '2'> c && ls robdnotexist && echo „Na pewno nie„ LS: nie można uzyskać ”czynotExist ': brak takiego pliku lub katalogu
I na pewno nie wykonał. Następnie przedstawmy nasze następne polecenie w naszym łańcuchu z pierwotnego przykładu:
$ echo '0'> a && echo '1'> b && echo '2'> c && ls czynotexist || LS A LS: Nie można uzyskać dostępu do „czynotExist”: Brak takiego pliku ani katalogu a
Czy widzisz, co się dzieje? Tutaj mamy nowy symbol składni || który różni się od && w związku z tym, że w poprzedniej komendzie istniał niezerowy wynik. Zauważ, że oba || I && Zastosuj tylko do ostatniego polecenia, a nie łańcucha poleceń, chociaż można by pomyśleć o tym jako o łańcuchu.
W ten sposób możesz pomyśleć && Jako odpowiednik języka angielskiego I i do pewnego stopnia wspólne I obecny w językach programowania, ale z akcentem, że tutaj sprawdzamy warunek przed && i wykonanie tego, co stoi za nim, pod warunkiem, że stan wyjścia jest 0.
Kolejnym zwrotem jest to, że większość języków programowania sprawdzi prawdziwa jako binarny 1 Kiedy && Zastosowana jest składnia. Rozważmy na przykład pseudo kod; Jeśli test1_flag && test2_flag, to… które zwykle oceniają Ogólnie rzecz biorąc (i w ten sposób wykonać Następnie polecenia) Jeśli flagi binarne test1_flag I test2_flag są 1 lub prawdziwe, podczas gdy w Bash prawdziwa jest wskazywany przez 0 (i nie 1) Status wyjścia z ostatniego polecenia!
Możesz myśleć o || Jako odpowiednik języka angielskiego Lub (Lub jak w lub jeśli to się nie powiedzie, to… Zrób… ). W tej sytuacji istnieje silniejszy związek ze wspólnymi językami programowania: gdy wspólny język programu sprawdza, na przykład Jeśli test1_flag || test2_flag, a następnie… , Następnie binarny pozytywny test1_flag (I.mi. wartość 1) Lub test2_flag dałby ogólny warunek jako prawdziwy (a zatem Następnie klauzula zostanie wykonana). Widzimy to samo w Bash; Jeśli kod wyjściowy polecenia jest niezerowy (i.mi. 1 lub w niektórych przypadkach wyższa wartość), a następnie polecenie za || klauzula zostanie wykonana.
Wróćmy teraz do oryginalnego polecenia i analizujmy w całości:
$ echo '0'> a && echo '1'> b && echo '2'> c && ls czynotexist || ls a && ls b && ls c && ls d && ls e ls: nie można uzyskać dostępu „czynotExist”: brak takiego pliku lub katalogu a b c ls: nie można uzyskać dostępu „d”: brak takiego pliku lub katalogu
Czy widzisz, co się stanie? Ponieważ LS nieistnie Polecenie nie powiada się wewnętrznie i daje niezerowe wyjście (użycie LS nieistnie; Echo $? w Bash do weryfikacji; Wyjście jest 2), Lub (||) Klauzula jest wyzwalana, a następnie wykonujemy LS. Wyobraź to jak łańcuch płynny w inny sposób, ale nadal jest łańcuchem.
Jak LS a Dowództwo odniesie sukces, a następnie następuje I (&&) Klauzula, następne polecenie jest wykonywane i tak dalej. Zauważ, że wykonanie dochodzi do wykonania LS d, i wyjście dla tego samego (LS: Nie można uzyskać dostępu do „D”: Brak takiego pliku lub katalogu) jest pokazany, ale LS e Polecenie nie jest wykonywane! Jest to oczekiwane jako && był używany i LS d Polecenie nie powiodło się. Stąd, LS e nigdy nie jest wykonywany.
Wniosek
Im bardziej biegłość, piszesz jedno-liniowce, tym szybciej, lepsze, mniej podatne na błędy i gładsze, twoje scenariusze z jednym linowcem. Deweloperzy języka bashu włożyli całą kontrolę w twoich rękach. Co zrobisz z tą kontrolą dzisiaj?
Zostaw nam wiadomość poniżej ze swoimi najfajniejszymi dziełami jedno-liniowymi!
Powiązane samouczki Linux:
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Rzeczy do zainstalowania na Ubuntu 20.04
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
- Mastering Bash Script Loops
- Pobieranie stron internetowych za pomocą WGET, Curl i Lynx
- Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
- Ubuntu 20.04 Przewodnik
- Zagnieżdżone pętle w skryptach Bash
- Big Data Manipulacja dla zabawy i zysku Część 1
- Rzeczy do zrobienia po zainstalowaniu Ubuntu 22.04 JAMMY Jellyfish…