Wprowadzenie do przekierowań powłoki bash

Wprowadzenie do przekierowań powłoki bash

Cel

Naucz się używać przekierowań, rur i koszul w skorupce Bash

Wersje systemu operacyjnego i oprogramowania

  • System operacyjny: - Dystrybucja Linuksa Agnostyka

Wymagania

  • Dostęp do skorupy bash

Konwencje

  • # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda
  • $ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny

Wstęp

Przekierowanie to możliwość przekierowania wejścia i wyjścia różnych poleceń do i z plików lub urządzeń. Zobaczymy, jak działa przekierowanie w Bash: domyślna powłoka w większości rozkładów Linuksa.



Deskryptory pliku

Za każdym razem, gdy wykonujesz program, trzy Deskryptory pliku są tworzone domyślnie:

  • 0 - stdin (Standardowe wejście)
  • 1 - Stdout (standardowe wyjście)
  • 2 - Stderr (Standardowy błąd)

Domyślnie Stdout I Stderr deskryptory są „dołączone” do ekranu, co oznacza, że ​​wyjście programu i jego błędy nie są zapisywane w żadnym pliku, ale po prostu wyświetlane, podczas gdy standardowe wejście jest podłączone do klawiatury. Operatorzy przekierowania pozwól nam manipulować tymi powiązaniami.

Przekierowanie standardowego wyjścia

Jak wspomniano powyżej, domyślnie standardowe wyjście programu jest wysyłane na ekran, ale w niektórych okolicznościach, jak na przykład w kontekście skryptu, możemy go odrzucić, a może wysłać do pliku. Jak to osiągnąć? Kluczem tutaj jest operator>:

LS -L> wyjście.tekst 

W tym małym przykładzie przekierowaliśmy wyjście LS Polecenie do wyjścia pliku.txt (zauważ, że plik nie musi istnieć, jest tworzony automatycznie). Nic nie pojawiło się na ekranie, ale jeśli sprawdzimy treść pliku, zobaczymy coś dość znajomego:



$ CAT Wyjście.TXT Całkowita 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 19:36 Desktop Drwxr-xr-X. 2 EGDOC EGDOC 4096 22 19:36 Dokumenty DRWXR-XR-X. 2 EGDOC EGDOC 4096 23 czerwca 02:40 Pobieranie DrwxRwxr-X. 13 EGDOC EGDOC 4096 23 czerwca 08:13 git drwxr-xr-x. 2 EGDOC EGDOC 4096 czerwca 22 19:36 Muzyka -RW-RW-R--. 1 EGDOC EGDOC 0 czerwca 23 09:38.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 czerwca 22 19:39 Zdjęcia drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Publiczne DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 19:36 Szablony drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Filmy 

To, co widzimy, to wyjście LS Komenda. Jeśli teraz spróbujemy ponownie przekierować, bieżąca zawartość pliku zostanie zastąpiona nowym wyjściem. Jak możemy zachować poprzednie treści i po prostu dodać nowe linie do tego? W takim przypadku używamy >> operator:

LS -L >> Wyjście.tekst 

W ten sposób, jeśli plik nie istnieje lub nie ma treści, przekierowanie będzie miało taki sam efekt, jak gdybyśmy używali > Operator, w przeciwnym razie nowa treść zostanie dołączona do istniejącej, jak można zobaczyć ponownie, obserwując ponownie plik:

Całkowita 36 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 19:36 Desktop Drwxr-xr-X. 2 EGDOC EGDOC 4096 22 19:36 Dokumenty DRWXR-XR-X. 2 EGDOC EGDOC 4096 23 czerwca 02:40 Pobieranie DrwxRwxr-X. 13 EGDOC EGDOC 4096 23 czerwca 08:13 git drwxr-xr-x. 2 EGDOC EGDOC 4096 czerwca 22 19:36 Muzyka -RW-RW-R--. 1 EGDOC EGDOC 0 czerwca 23 09:38.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 czerwca 22 19:39 Zdjęcia drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Publiczne DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 19:36 Szablony drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Filmy Razem 40 DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 19:36 Desktop Drwxr-xr-X. 2 EGDOC EGDOC 4096 22 19:36 Dokumenty DRWXR-XR-X. 2 EGDOC EGDOC 4096 23 czerwca 02:40 Pobieranie DrwxRwxr-X. 13 EGDOC EGDOC 4096 23 czerwca 08:13 git drwxr-xr-x. 2 EGDOC EGDOC 4096 czerwca 22 19:36 Muzyka -RW-RW-R--. 1 EGDOC EGDOC 541 czerwca 23 09:38.TXT DRWXR-XR-X. 2 EGDOC EGDOC 4096 czerwca 22 19:39 Zdjęcia drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Publiczne DRWXR-XR-X. 2 EGDOC EGDOC 4096 22 19:36 Szablony drwxr-xr-x. 2 EGDOC EGDOC 4096 22 19:36 Filmy 


Być może będziemy również musiało przekierować dane wyjściowe wielu poleceń jednocześnie: możemy uzyskać poszukiwany wynik za pomocą klamrowych klamrów, aby je grupować:

$ echo „LinuxConfig”; ls -l; > Wyjście.tekst

Wyjście.plik txt będzie teraz zawierać zarówno ciąg „LinuxConfig”, jak i wynik ls -l Komenda.

Inną powszechną operacją jest całkowite odrzucenie wyjścia polecenia, tym razem przekierowanie go na specjalne urządzenie: /dev /null. W systemach operacyjnych podobnych do UNIX /dev/null (Znany również jako bitowy wiader), to urządzenie, które odrzuca wszystkie zapisane do niego dane:

ls -l> /dev /null

Przekieruj zarówno standardowe wyjście, jak i błąd standardowy

W powyższych przykładach właśnie przekierowaliśmy standardowe wyjście. Jeśli wystąpi jakiś błąd, nadal będziemy mogli zobaczyć komunikat o błędzie na ekranie:

$ ls -l nieopisujący plik.txt> /dev /null ls: nie można uzyskać dostępu.txt ': brak takiego pliku lub katalogu 

Dzieje się tak, jak powiedział powyżej, Stdout I Stderr deskryptory są całkowicie oddzielone. Co możemy zatem zrobić, aby przekierować je oba? Istnieją dwie składni, których możemy użyć do wykonania tego zadania: pierwsza, która działa nawet w starych wersjach powłoki, jest następujący:

LS -L> wyjście.TXT 2> i 1

Co my zrobiliśmy? Przede wszystkim przekierowaliśmy Stdout polecenia do wyjścia.plik txt, tak jak wcześniej, następnie przekierowaliśmy Stderr do Stdout. Zwróć uwagę, w jaki sposób odwoływaliśmy się do deskryptorów plików przez ich odpowiednie liczby. W dość nowoczesnej wersji Bash możemy użyć tej drugiej, bardziej usprawnionej składni:

LS -L &> wyjście.tekst


Przekieruj standardowe wyjście do błędu standardowego

Wyobraź sobie, że piszesz skrypt i chcesz obsłużyć przypadek, gdy określona instrukcja się nie powiedzie, pokazując użytkownikowi komunikat o błędzie. Jak byś to osiągnął? Pierwszą rzeczą, która przychodzi na myśl, jest po prostu Echo Poszukiwany komunikat, a następnie prawdopodobnie wyjdź ze skryptu za pomocą odpowiedniego kodu błędu. To byłoby w porządku, ale zadaj sobie pytanie, jaki deskryptor ten przesłanie zostanie „wysłane”? To jest Stdout z Echo polecenie, ale jednocześnie, jeśli widzimy rzeczy z perspektywy skryptu, jako komunikat o błędzie, powinien używać Stderr deskryptor. To, co chcemy tutaj zrobić, to przekierować Stdout Do Stderr. Używamy następującej składni do wykonania zadania:

echo "wystąpił błąd, pa!"> I 2

Z pewnością nie jest to najbardziej przydatne z komunikatów o błędach, ale wystarczy dla naszego przykładu.

Przekierowanie standardowego wejścia

Jak powiedzieliśmy wcześniej, domyślnie standardowe wejście jest powiązane z klawiaturą, ale za pomocą < operator, możemy stworzyć niektóre programy do zaakceptowania danych wejściowych z innych źródeł. Zobaczmy szybki przykład za pomocą tr polecenie (jak prawdopodobnie wiesz tr służy do usuwania lub tłumaczenia znaków). Zwykle działa w ten sposób:

tr 'goot tay!„T D

Dajesz tr ciąg, najpierw określając znak, który chcesz zmienić, a następnie ten, którego powinien użyć, aby go zastąpić. W tym przypadku przekazujemy ciąg „goot tay!„Bezpośrednio, używając klawiatury: zostanie przetłumaczone na„ dobry dzień!'. Co zrobimy, aby zademonstrować stdin przekierowanie polega na zapisaniu ciągu do pliku, a następnie przekierowanie zawartości pliku do stdin z tr Komenda.

Najpierw piszemy „Goot Tay!„Do wyjścia.plik txt

$ echo 'goot tay!'> wyjście.tekst

Następnie wysyłamy jego treść do stdin z tr:

$ tr < output.txt t d good day! 

Jak widać, wszystko poszło zgodnie z oczekiwaniami, a na ekranie wydrukowano fajną wiadomość.



Rurociągi

Korzystanie z operatora rur | Możemy łączyć wiele poleceń, aby Stdout polecenia po lewej stronie operatora jest przekazywane do stdin polecenia po prawej stronie. Możemy to szybko wykazać, używając tr Polecenie ponownie:

$ echo 'Goot Day!'| Tr t d dobry dzień! 

Co się stało? Standardowe wyjście polecenia Echo (składające się z łańcucha „Goot Tay!') Jest rurowe do standardowego wejścia tr polecenie, które tłumaczy ciąg. Wreszcie widzimy tr standardowe wyjście na ekranie. Ale oczywiście rura może kontynuować. Wyobraź sobie, że chcemy wyświetlić słowo „dobry”:

$ echo 'goot tay!'| Tr T D | Cut -f 1 -D "

To, co tutaj zrobiliśmy, to dodanie cięcie polecić do rury, mijając Stdout z tr do tego stdin. cięcie Polecenie używa przestrzeni jako ogranicznika (-D przełącznik) i wybiera tylko pierwsze pole, zwracając ciąg „dobry”.

Za pomocą koszulki

trójnik Polecenie odczytuje standardowe wejście i przekierowuje je zarówno do standardowego wyjścia, jak i do pliku, umożliwiając utworzenie „t” w naszej rurze. Ponownie wykorzystajmy powyższy przykład, tym razem wysyłanie wyniku pośredniego („Dobry dzień!') również do wyjścia.plik txt:

$ echo 'goot tay!'| Tr T D | TEE OUPUT.txt | Cut -f 1 -D "

Wyjście na ekranie będzie takie same jak wcześniej („dobre”), ale jeśli odczytujemy wyjście.plik txt, widzimy, że „dobry dzień!„String został do niego napisany. To dlatego, że „dobry dzień!„Był standardowym wyjściem płynącym w rurze, kiedy włożyliśmy nasze trójnik.

Trójnik jest również przydatne, to pewne szczególne okoliczności. Na przykład, jeśli spróbujesz „odzwierciedlać” coś do pliku, który wymaga uprawnień root, aby zostać napisanym, zauważysz, że sprawy nie pójdą zgodnie z oczekiwaniami:

$ sudo echo "Linuxconfig.org "> chroniony.txt -bash: chroniony.TXT: Zezwolenie odmówiono 


Co się stało? Prawdopodobnie spodziewałeś się, że polecenie zakończy się sukcesem, ponieważ poprzedziłeś je sudo, ale i tak się nie udało. To dlatego, że po prostu uruchomiłeś Echo polecenie z uprawnieniami, ale to nie dało ci pisania uprawnień w pliku. Spróbujmy w ten sposób:

$ echo "Linuxconfig.org "| sudo tee chroniona.txt> /dev /null

Tutaj uruchamiamy echo jako normalny użytkownik, ale samo przekierowanie jest wykonywane z uprawnieniami root, więc tym razem polecenie się powiodło. Dodaliśmy również dodatkowe przekierowanie do /dev/null, Ponieważ nie potrzebowaliśmy wyświetlania wyjścia na ekranie.

Zauważ, że używając tej techniki, dane wyjściowe nie zostanie dołączone do pliku docelowego: ta ostatnia zostanie zastąpiona, a jej poprzednie treści zostaną utracone. Aby dołączyć do pliku, musimy dodać -A Przełącz na trójnik (skrót od -pend).

Uważaj, tylko trochę rozproszenia może powodować okropne rzeczy!

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Wprowadzenie do nazwanych rur na powładzie Bash
  • Obsługa danych wejściowych użytkownika w skryptach Bash
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Mastering Bash Script Loops
  • Linux Pliki konfiguracyjne: Top 30 Najważniejsze
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Czy Linux może uzyskać wirusy? Badanie podatności Linuksa…
  • Pobierz Linux