Kompleks Linux Bash One-Liner Przykłady
- 4033
- 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
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…