Kompleks Linux Bash One-Liner Przykłady

Kompleks Linux Bash One-Liner Przykłady

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

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 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…