Przydatne przykłady i sztuczki

Przydatne przykłady i sztuczki

Wiersz poleceń Bash zapewnia prawie nieograniczoną moc, jeśli chodzi o wykonywanie prawie wszystkiego, co chcesz zrobić. Niezależnie od tego, czy przetwarza zestaw plików, edytuje zestaw dokumentów, obsługę dużych zbiorów danych, zarządzanie systemem lub automatyzacja rutynowej, Bash może to zrobić wszystko. Ta seria, której dziś przedstawiamy pierwszą część, z pewnością uzbroi Cię w narzędzia i metody, których potrzebujesz, aby stać się znacznie bardziej biegłym użytkownikiem Bash. Nawet już zaawansowani użytkownicy prawdopodobnie odbijają coś nowego i ekscytującego. Cieszyć się!

W tym samouczku się nauczysz:

  • Przydatne wskazówki, sztuczki i metody
  • Jak wchodzić w interakcje z wierszem poleceń bash w zaawansowany sposób
  • Jak ogólnie wyostrzyć swoje umiejętności i stać się bardziej biegły użytkownik Bash
Przydatne przykłady i sztuczki

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 Różne narzędzia, które są albo zawarte w powładzie bashu, lub można je zainstalować za pomocą za pomocą sudo apt-get instaluj nazwę narzędzia (gdzie nazwa narzędzia reprezentuje narzędzie, które chcesz zainstalować)
Konwencje # - Wymaga, aby podane Linux -commands były wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
$-wymaga wykonania Linux-commands jako zwykłego niewidzianego użytkownika

Przykład 1: Zobacz, jakie procesy uzyskują dostęp do określonego pliku

Czy chciałbyś wiedzieć, jakie procesy mają dostęp do danego pliku? Łatwo jest to zrobić za pomocą wbudowanego fusera poleceń Bash:

$ fuser -a/usr/bin/gnome-calculator/usr/bin/gnome-calculator: 619672e 
$ ps -ef | GREP 619672 | GREP -V GREP ABC 619672 3136 0 13:13 ? 00:00:01 Gnome-Calculator 


Jak widzimy, plik /usr/bin/gnome-calculator (binarny), jest obecnie używany przez proces z identyfikatorem 619672. Sprawdzanie tego identyfikatora procesu za pomocą Ps, Wkrótce dowiadujemy się tego użytkownika ABC rozpoczął kalkulator i zrobiłem to o 13:13.

mi za Pid (identyfikator procesu) oznacza, że ​​jest to uruchomiony element wykonywalny. Istnieją różne inne takie kwalifikatory i możesz użyć Man Fuser zobaczyć ich. To narzędzie Fuser może być potężne, szczególnie w połączeniu z lsof (jakiś LS z otwartych plików):

Załóżmy, że debugujemy zdalny komputer dla użytkownika, który pracuje ze standardowym pulpitem Ubuntu. Użytkownik rozpoczął kalkulator, a teraz jego cały ekran w zamrożonych. Chcemy teraz zdalnie zabić wszystkie procesy, które odnoszą się w jakikolwiek sposób z zablokowanym ekranem, bez ponownego uruchomienia serwera, w kolejności tego, jak znaczące są te procesy.

# lsof | Kalkulator GREP | GREP „Udostępnij” | Head -n1 XDG-Deskt 3111 ABC Mem Reg 253,1 3009 12327296/usr/share/locale-langpack/en_au/lc_messages/gnome-calculator.mo 
# fuser -a/usr/share/locale-langpack/en_au/lc_messages/gnome-calculator.Mo/usr/share/locale-langpack/en_au/lc_messages/gnome-calculator.MO: 3111M 3136M 619672M 1577230M 
# ps -ef | grep -e "3111 | 3136 | 619672 | 1577230" | GREP -V GREP ABC 3111 2779 0 AUG03 ? 00:00:11/usr/libexec/XDG-Desktop-Portal-GTK ABC 3136 2779 5 sierpnia 03 ? 03:08:03/usr/bin/gnome-sell abc 619672 3136 0 13:13 ? 00:00:01 Gnome-Calculator ABC 1577230 2779 0 AUG04 ? 00:03:15/usr/bin/nautilus-gapplication-service 

Najpierw umieściliśmy wszystkie otwarte pliki używane przez kalkulator za pomocą lsof. Aby uzyskać krótkie wyjście, wymieniliśmy tylko najwyższy wynik dla pojedynczego udostępnionego pliku. Następnie użyliśmy fuser, aby dowiedzieć się, które procesy używają tego pliku. To zapewniło nam PIDS. Wreszcie przeszukaliśmy za pomocą OR (|) oparte na grepie, aby znaleźć, które rzeczywiste procesy nazywają. Widzimy, że chociaż kalkulator rozpoczął się o 13:13, pozostałe procesy działają dłużej.

Następnie możemy na przykład wydać Zabij -9 619672 i sprawdź, czy to rozwiązało problem. Jeśli nie, możemy pójść na proces 1577230 (Udostępniony menedżer plików Nautilus), przetwarzaj 3136 (nadrzędna powłoka) lub wreszcie przetwarzaj 3111, Chociaż prawdopodobnie zabiłoby to znaczną część wrażeń stacjonarnych użytkownika i może nie być łatwe do ponownego uruchomienia.

Przykład 2: Debugowanie skryptów

Więc napisałeś świetny skrypt z dużą ilością złożonego kodu, a następnie uruchom go… i widzisz błąd w wyjściu, który na pierwszy rzut oka nie ma większego sensu. Nawet po debugowaniu wciąż utknąłeś na tym, co się stało, podczas gdy scenariusz się wykonywał.

Bash -x na pomoc! Bash -x pozwala na wykonanie test.cii skrypt i zobacz dokładnie, co się stanie:

#!/bin/bash var1 = "Hello Linuxconfig.czytelnicy org!"Var2 =" ------------------------------ "echo $ var1 echo $ var2 
Kopiuj

Wykonanie:

$ bash -x ./test.SH + var1 = "Hello Linuxconfig.czytelnicy org!" + Var2 = ------------------------------ + Echo Hello Linuxconfig.czytelnicy org!„Cześć LinuxConfig.czytelnicy org! + Echo ------------------------------ ------------------------------ 

Jak widać, Bash -x Polecenie pokazało nam dokładnie, co się stało, krok po kroku. Możesz również łatwo wysłać dane wyjściowe tego polecenia do pliku, dołączając 2> i 1 | TEE MY_OUTPUT.dziennik do polecenia:

$ bash -x ./test.SH 2> i 1 | TEE MY_OUTPUT.Log… to samo wyjście… $ cat my_output.Log + var1 = "Hello Linuxconfig.czytelnicy org!" + Var2 = ------------------------------ + Echo Hello Linuxconfig.czytelnicy org!„Cześć LinuxConfig.czytelnicy org! + Echo ------------------------------ ------------------------------ 


2> i 1 Wysłał Stderr (Wyjście błędu standardowego: wszelkie błędy widoczne podczas wykonywania) do Stdout (Standardowe wyjście: luźno zdefiniowane tutaj jako wyjście, które zwykle widać na terminalu) i przechwytuj wszystkie wyjście z Bash -x. trójnik polecenie przechwyci wszystkie dane wyjściowe z Stdout, i napisz to do wskazanego pliku. Jeśli kiedykolwiek chcesz dołączyć do pliku (i nie uruchomić od nowa od pustego pliku), możesz użyć TEE -A gdzie -A opcja zapewni dołączenie pliku.

Przykład 3: wspólny gotcha: sh -x != Bash -x

Ostatni przykład pokazał nam, jak korzystać Bash -x, Ale czy moglibyśmy również użyć sh -x? Tendencja niektórych nowszych użytkowników Bash może być uruchomiona sh -x, Ale to błąd debiutanta; cii jest znacznie bardziej ograniczoną skorupą. Podczas grzmotnąć oparta jest na cii, ma o wiele więcej rozszerzeń. Tak więc, jeśli używasz sh -x Aby debugować skrypty, zobaczysz dziwne błędy. Chcę zobaczyć przykład?

#!/bin/bash test = "abc" if [["$ test" == * "b" *]]; Następnie echo „Tak, tam!„Fi 
Kopiuj

Wykonanie:

$ ./test.ss tak, tam! 
$ bash -x ./test.sh + test = abc + [[abc == * \ b *]] + echo 'tak, tam, tam!„Tak, tam! 
$ sh -x ./test.SH + TEST = ABC + [[ABC == * B *]] ./Test: 4: [[: Nie znaleziono 

Tutaj możesz zobaczyć mały skrypt testowy test.cii które po wykonaniu sprawdzają, czy określony list (B) pojawia się w określonym ciągu wejściowym (zgodnie z definicją TEST zmienny). Skrypt działa świetnie, a kiedy używamy Bash -x Widzimy przedstawione informacje, w tym dane wyjściowe, wyglądają poprawnie.

Dalej, używając sh -x Sprawy idzie znacznie źle; cii Shell nie może interpretować [[ i zawodzi oba w sh -x Wyjście, a także w samym wykonaniu skryptu. Wynika to z faktu, że zaawansowana, jeśli wdrożona składnia grzmotnąć nie istnieje w cii.

Przykład 4: Uniq lub nie unikalny - to pytanie!

Czy kiedykolwiek chciałeś posortować plik i wymienić tylko unikalne wpisy? Na pierwszy rzut oka wydaje się, że jest to łatwe ćwiczenie za pomocą dołączonego polecenia bash Uniq:

Wejście $ CAT.txt 1 2 2 3 3 3 
Wejście $ CAT.txt | uniq 1 2 3 

Jeśli jednak trochę zmodyfikujemy nasz plik wejściowy, napotykamy problemy z wyjątkowością:

Wejście $ CAT.TXT 3 1 2 3 2 3 3 3 
Wejście $ CAT.txt | uniq 3 1 2 3 2 3 


To dlatego, że Uniq Domyślnie woli Filtr sąsiadujące pasujące linie, przy czym pasujące linie są scalone z pierwszym występowaniem jak Uniq Podręcznik wyjaśnia. Lub innymi słowy, tylko linie, które są dokładnie takie same jak poprzednie, zostaną usunięte.

W przykładzie można to zobaczyć przez ostatnie trzy 3 linie są skondensowane w jednym „unikalnym” 3. Jest to prawdopodobnie użyteczne tylko w ograniczonej liczbie i określonych przypadkach użycia.

Możemy jednak poprawić Uniq nieco dalej, aby dać nam tylko naprawdę unikalne wpisy, korzystając z -u parametr:

Wejście $ CAT.TXT # Zwróć uwagę, że symbole „ #” zostały dodane po wykonaniu, aby wyjaśnić coś (odczytaj poniżej) 3 # 1 # 2 # 3 # 2 # 3 3 3 
Wejście $ CAT.txt | uniq -u 3 1 2 3 2 

Wciąż wygląda trochę mylące, prawda? Przyjdź uważnie na wejście i wyjście, a zobaczysz, jak tylko są linie indywidualnie unikalny (jak zaznaczony przez # W powyższym przykładzie po wykonaniu) są wyjściowe.

Ostatnie trzy 3 Linie nie są wyjściowe, ponieważ nie są unikalny takie jak. Ta metoda wyjątkowości znów miałaby ograniczone zastosowanie w scenariuszu świata rzeczywistego, choć może być kilka przypadków, w których się przydaje.

Możemy uzyskać bardziej odpowiednie rozwiązanie dla wyjątkowości, używając nieco innego wbudowanego narzędzia Bash; sortować:

Wejście $ CAT.txt 1 2 2 3 3 3 
Wejście $ CAT.txt | sort -u 1 2 3 
CZY WIEDZIAŁEŚ?
Możesz pominąć kot polecenie w powyższych przykładach i podaj plik do Uniq Lub sortować czytać bezpośrednio z? Przykład:sort -u wejście.tekst

Świetnie! Jest to użyteczne w wielu skryptach, w których chcielibyśmy prawdziwą listę unikalnych wpisów. Dodatkową zaletą jest to, że lista jest jednocześnie ładnie posortowana (choć mogliśmy korzystać -N opcja sortowania również w kolejności numerycznej zgodnie z wartością numeryczną łańcucha).

Wniosek

Używanie Bash jako preferowanego linii poleceń Linuksa jest wiele. W tym samouczku zbadaliśmy szereg przydatnych wskazówek i wskazówek dotyczących linii poleceń Bash. To jest rozpoczęcie serii pełnych przykładów wiersza poleceń Bash, które, jeśli pójdziesz dalej, pomoże ci stać się znacznie bardziej zaawansowane w linii poleceń i powłoki Bash!

Daj nam znać swoje przemyślenia i podziel się niektórymi z własnych porad dotyczących wiersza poleceń Cool Bash, sztuczek i gotchas poniżej!

  • Przydatne przykłady i sztuczki
  • Przydatne przykłady i wskazówki dotyczące linii poleceń Bash - część 2
  • Przydatne przykłady i sztuczki
  • Przydatne przykłady i wskazówki dotyczące linii poleceń Bash - część 4
  • Przydatne przykłady i sztuczki

Powiązane samouczki Linux:

  • Przydatne przykłady i sztuczki
  • Przydatne przykłady i wskazówki dotyczące linii poleceń Bash - część 2
  • Przydatne przykłady i wskazówki dotyczące linii poleceń Bash - część 4
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Ubuntu 20.04 sztuczki i rzeczy, których możesz nie wiedzieć
  • Przydatne przykłady i sztuczki
  • Big Data Manipulacja dla zabawy i zysku Część 1
  • Bash Tips i wskazówki
  • Ubuntu 20.04 Przewodnik
  • Zagnieżdżone pętle w skryptach Bash