Jak zapisać dane wyjściowe konsoli do pliku. Programuj kanały i strumienie, przekierowania

Jeden z najciekawszych i przydatne tematy Dla administratorzy systemu oraz nowi użytkownicy, którzy dopiero zaczynają rozumieć, jak pracować z terminalem - jest to przekierowanie strumieni wejścia/wyjścia Linuksa. Ta funkcja terminala umożliwia przekierowanie danych wyjściowych poleceń do pliku lub zawartości pliku do danych wejściowych poleceń, łączenie poleceń i tworzenie potoków poleceń.

W tym artykule przyjrzymy się, jak w systemie Linux odbywa się przekierowanie strumienia we/wy, jakich operatorów się do tego używa i gdzie można to wszystko zastosować.

Wszystkie wykonywane przez nas polecenia zwracają nam trzy typy danych:

  • Wynik polecenia, zwykle dane tekstowe żądane przez użytkownika;
  • Komunikaty o błędach - informują o procesie wykonywania polecenia i zaistniałych nieoczekiwanych okolicznościach;
  • Kod powrotu to liczba, która pozwala ocenić, czy program działał poprawnie.

W Linuksie wszystkie substancje są uważane za pliki, łącznie ze strumieniami wejścia/wyjścia Linuksa – plikami. Każda dystrybucja ma trzy główne pliki strumieniowe, z których mogą korzystać programy. Są one definiowane przez powłokę i identyfikowane poprzez numer deskryptora pliku:

  • STDIN lub 0- ten plik jest powiązany z klawiaturą i większość poleceń otrzymuje stąd dane do działania;
  • STDOUT lub 1- to jest standardowe wyjście, tutaj program wysyła wszystkie wyniki swojej pracy. Jest powiązany z ekranem, a dokładniej z terminalem, w którym uruchomiony jest program;
  • STDERR lub 2- wszystkie komunikaty o błędach są zapisywane w tym pliku.

Przekierowanie we/wy umożliwia zastąpienie jednego z tych plików własnym. Na przykład możesz zmusić program do odczytania danych z pliku w system plików, zamiast klawiatury, możesz także wyprowadzać błędy do pliku, a nie na ekran itp. Wszystko to odbywa się za pomocą symboli "<" I ">" .

Przekieruj wyjście do pliku

Wszystko jest bardzo proste. Możesz przekierować dane wyjściowe do pliku za pomocą symbolu >. Na przykład zapiszmy wynik polecenia top:

top -bn 5 > top.log

Opcja -b powoduje, że program działa w nieinteraktywnym trybie wsadowym, a n - powtarza operację pięć razy, aby uzyskać informacje o wszystkich procesach. Zobaczmy teraz, co stało się z kotem:

Symbol ">" nadpisuje informacje z pliku, jeśli już coś w nim jest. Aby dołączyć dane do końcowego zastosowania ">>" . Na przykład przekieruj dane wyjściowe do plik Linuxa także na górze:

top -bn 5 >> top.log

Domyślnie do przekierowania używany jest standardowy deskryptor pliku wyjściowego. Ale możesz to określić wyraźnie. To polecenie da ten sam wynik:

top -bn 5 1>top.log

Przekieruj błędy do pliku

Aby przekierować wyjście błędu do pliku, musisz jawnie określić deskryptor pliku, który chcesz przekierować. W przypadku błędów jest to numer 2. Na przykład podczas próby uzyskania dostępu do katalogu superużytkownika ls zgłosi błąd:

Możesz przekierować błąd standardowy do takiego pliku:

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

Aby dołączyć dane na końcu pliku, użyj tego samego symbolu:

ls -l /root/ 2>>ls-error.log

Przekieruj standardowe wyjście i błędy do pliku

Możesz także przekierować wszystkie dane wyjściowe, błędy i standardowe wyjścia do jednego pliku. Można to zrobić na dwa sposoby. Pierwszy, starszy, polega na przekazaniu obu uchwytów:

ls -l /root/ >ls-error.log 2>&1

Najpierw dane wyjściowe polecenia ls zostaną wysłane do pliku ls-error.log przy użyciu pierwszego znaku przekierowania. Wtedy wszystkie błędy zostaną przesłane do tego samego pliku. Druga metoda jest prostsza:

ls -l /root/ &> ls-error.log

Zamiast przepisywania możesz także użyć dodawania:

ls -l /root/ &>> ls-error.log

Standardowe wejście z pliku

Większość programów, z wyjątkiem usług, otrzymuje dane do swojej pracy poprzez standardowe wejście. Domyślnie standardowe wejście oczekuje danych wejściowych z klawiatury. Można jednak zmusić program do odczytania danych z pliku za pomocą operatora "<" :

kot

Możesz także natychmiast przekierować dane wyjściowe do pliku. Na przykład przesortujmy listę:

sortować sortowanie.wyjście

W ten sposób jednym poleceniem przekierowujemy wejście/wyjście do systemu Linux.

Wykorzystanie tuneli

Możesz pracować nie tylko z plikami, ale także przekierować wyjście jednego polecenia jako wejście innego. Jest to bardzo przydatne przy wykonywaniu skomplikowanych operacji. Na przykład wyświetlmy pięć ostatnio zmodyfikowanych plików:

ls -lt | głowa -n 5

Za pomocą narzędzia xargs możesz łączyć polecenia tak, aby standardowe wejście było przekazywane jako parametry. Na przykład skopiujmy jeden plik do kilku folderów:

test echa/tmp/ | xargs -n 1 cp -v plik testowy.sh

Tutaj opcja -n 1 określa, że ​​na każde polecenie powinien zostać dostarczony tylko jeden parametr, a opcja -v cp pozwala na wydrukowanie szczegółowych informacji o ruchach. Kolejnym przydatnym poleceniem w takich przypadkach jest tee. Odczytuje dane ze standardowego wejścia i zapisuje na standardowe wyjście lub do plików. Na przykład:

echo "Test działania trójnika" | plik koszulki 1

W połączeniu z innymi poleceniami można ich używać do tworzenia złożonych instrukcji obejmujących wiele poleceń.

wnioski

W tym artykule omówiliśmy podstawy przekierowania strumienia we/wy w systemie Linux. Teraz wiesz, jak przekierować dane wyjściowe do pliku systemu Linux lub dane wyjściowe z pliku. To bardzo proste i wygodne. Jeśli masz jakieś pytania, zadaj je w komentarzach!

Każdy program jest „automatem” przeznaczonym do przetwarzania danych: otrzymując jedną informację jako dane wejściowe, w wyniku swojej pracy wytwarza inną. Chociaż informacja przychodząca i/lub wychodząca może wynosić zero, to znaczy po prostu być nieobecna. Dane przekazywane do programu w celu przetworzenia są jego wejściem, a to, co wytworzy w wyniku pracy, jest wyjściem. Organizowanie danych wejściowych i wyjściowych dla każdego programu jest zadaniem systemu operacyjnego.

Każdy program pracuje z danymi określonego typu: tekstowymi, graficznymi, dźwiękowymi itp. Jak już zapewne stało się jasne, głównym interfejsem zarządzania systemem w systemie Linux jest terminal, którego zadaniem jest przesyłanie informacji tekstowych od użytkownika do systemu i z powrotem. Ponieważ z terminala można wprowadzać i wyprowadzać wyłącznie informacje tekstowe, dane wejściowe i wyjściowe programów powiązanych z terminalem również muszą być tekstowe. Konieczność operowania danymi tekstowymi nie ogranicza jednak możliwości zarządzania systemem, wręcz przeciwnie, je poszerza. Osoba może odczytać dane wyjściowe dowolnego programu i dowiedzieć się, co dzieje się w systemie, a różne programy okazują się ze sobą kompatybilne, ponieważ używają tego samego rodzaju reprezentacji danych - tekstu.

Polecenia i skrypty mogą odbierać dane wejściowe na dwa sposoby: ze standardowego wejścia (połączonego z klawiaturą) lub z pliku. Podobny podział istnieje w przypadku danych wyjściowych: dane wyjściowe polecenia lub skryptu są domyślnie wysyłane na ekran terminala, ale można je przekierować do pliku. Jeśli podczas pracy wystąpią błędy. komunikaty o nich wyświetlane są także na ekranie, a strumień błędów można także przekierować do pliku.

Przyjrzyjmy się najpierw kilku poleceniom, których można użyć do organizacji operacji we/wy.

Polecenia wyjściowe do standardowego urządzenia wyjściowego

Linux udostępnia kilka poleceń umożliwiających wypisanie komunikatów na standardowe wyjście:

  • echo – Wypisuje ciąg znaków na standardowe wyjście.
  • printf — Wydrukuj sformatowany tekst na standardowe wyjście.
  • tak — Wydrukuj powtarzający się tekst na standardowe wyjście.
  • seq – Wypisuje ciąg liczb na standardowe wyjście
  • wyczyść Wyczyść ekran lub okno.

Na przykład, jeśli używasz polecenia echo, jeśli określisz znak kontrolny \c, to po zakończeniu wyprowadzania nie będzie przejścia do nowej linii:

$ echo "Jak masz na imię?\c"

Jak masz na imię?

Tutaj $ jest symbolem zaproszenia.

Linia może również obliczać wartości zmiennych powłoki, a nawet innych poleceń. Na przykład poniższe polecenie informuje, jaki jest katalog domowy bieżącego użytkownika (zmienna środowiskowa $HOME) i do jakiego terminala jest on podłączony (polecenie tty jest ujęte w cudzysłów, dzięki czemu interpreter umieści wynik jego wykonania w linia).

$ echo "Twój katalog domowy to $HOME, jesteś podłączony do terminala - `tty` "

Twój katalog domowy to /home/knoppix, jesteś podłączony do terminala - /dev/tty1

Ponieważ cudzysłowy mają specjalne zastosowanie w interpreterze powłoki, aby umieścić cudzysłowy w ciągu wyjściowym, należy cofnąć ich specjalne przeznaczenie za pomocą ukośnika odwrotnego (\). Spowoduje to anulowanie przypisania dowolnego znaku specjalnego.

Na przykład, aby wyświetlić ciąg „/dev/tty1”, musisz uruchomić:

$echo „\”/dev/tty1\””

Polecenia wejściowe ze standardowego urządzenia wejściowego

Polecenie read wczytuje jedną linię ze standardowego wejścia i zapisuje jej zawartość do określonych zmiennych. Przy podaniu kilku zmiennych pierwsze słowo jest zapisywane do pierwszej, drugie do drugiej itd. ostatni zawiera resztę linii.

Poniższy skrypt wywołuje osobne polecenie read w celu odczytania każdej zmiennej.


$ test na kota
#!/bin/bash
echo „Nazwa: \c”
przeczytaj imię
echo „Nazwisko: \c”
przeczytaj nazwisko
echo „Imię=” $nazwisko „Nazwisko=” $nazwisko

Następnie, aby wykonać ten skrypt, musisz nadać plikowi testowemu prawo wykonania: chmod 0755 test i uruchomić go./test. Wynik egzekucji: Imię: Ivan Nazwisko: Petrov Imię=Ivan Nazwisko=Petrov

STANDARDOWE WEJŚCIE, WYJŚCIE I STRUMIEŃ BŁĘDÓW

Każdy program uruchomiony z interpretera poleceń otrzymuje trzy otwarte strumienie we/wy:

Wejście standardowe (sldin) - standardowe wyjście (sldout) - standardowe wyjście błędów (stderr)

Domyślnie wątki te są powiązane z terminalem. Te. Każdy program, który nie korzysta ze strumieni innych niż standardowe, będzie oczekiwał na dane wejściowe z klawiatury terminala; wszystkie dane wyjściowe tego programu, łącznie z komunikatami o błędach, pojawią się na ekranie terminala.

Co więcej, każdy proces (polecenie, skrypt itp.) wykonywany w interpreterze powłoki jest powiązany z pewną liczbą otwartych plików, z których proces może odczytać swoje dane i do których może je zapisać. Każdy z tych plików jest identyfikowany przez numer zwany deskryptorem pliku, ale pierwsze trzy pliki to domyślne strumienie we/wy:

Deskryptor pliku
Standardowy strumień wejściowy 0
Standardowe wyjście 1
Standardowy strumień błędów 2

W rzeczywistości tworzonych jest 12 otwartych plików, ale pliki z deskryptorami 0, 1 i 2 są zarezerwowane dla standardowych wejść, wyjść i błędów. Użytkownicy mogą także pracować z plikami, które mają deskryptory plików od 3 do 9 (zarezerwowane).

Standardowy plik wejściowy (sldin) ma uchwyt 0. Z tego pliku procesy wyodrębniają swoje dane wejściowe. Domyślnie strumień wejściowy jest powiązany z klawiaturą (urządzenie /dev/tty), ale najczęściej przychodzi potokiem z innych procesów lub ze zwykłego pliku.

Standardowy plik wyjściowy (stdout) ma uchwyt 1. Wszystkie dane wyjściowe procesu są zapisywane w tym pliku. Domyślnie dane są wysyłane na ekran terminala (urządzenie/programista/tty), ale można je również przekierować do pliku lub przesłać potokiem do innego procesu.

Standardowy plik strumienia błędów (siderr) ma deskryptor 2. W tym pliku zapisywane są komunikaty o błędach, które pojawiają się podczas wykonywania polecenia. Domyślnie komunikaty o błędach są wyświetlane na ekranie terminala (urządzenie /dev/tty), ale można je również przekierować do pliku. Po co przydzielać specjalny plik do rejestrowania błędów? Faktem jest, że jest to bardzo wygodny sposób na odizolowanie rzeczywistych danych wyjściowych od wyników pracy polecenia, a także dobra okazja do skutecznego zorganizowania obsługi różnego rodzaju plików dziennika.

Duża liczba mediów korzysta tylko ze standardowych strumieni. W przypadku takich programów powłoka umożliwia niezależne przekierowywanie strumieni we/wy. Na przykład możesz ukryć komunikaty o błędach, ustawić dane wejściowe lub wyjściowe z pliku.

Te. Wywołując polecenia, możesz określić, gdzie mają zostać odebrane dane wejściowe i gdzie powinny zostać wysłane dane wyjściowe, a także komunikaty o błędach. Domyślnie, o ile nie określono inaczej, zakłada się pracę z terminalem: dane wprowadzane są z klawiatury i wyświetlane na ekranie. Jednak interpreter powłoki posiada mechanizm przekierowania, który pozwala na powiązanie standardowych strumieni z różnymi plikami. W takim przypadku przy przekierowaniu standardowego strumienia błędów należy podać deskryptor pliku (2). Nie jest to konieczne w przypadku strumieni wejściowych i wyjściowych.

Przydatnym szczególnym przypadkiem wykorzystania mechanizmu przekierowania wątku jest przekierowanie do /dev/null, co pozwala pozbyć się niepotrzebnych komunikatów na ekranie. Używając tego samego mechanizmu, możesz tworzyć puste pliki:

% cat mójplik - utworzy pusty plik mojplik w bieżącym katalogu.

/dev/null to specjalny plik będący tzw. „puste urządzenie” Zapis do niego przebiega pomyślnie, niezależnie od ilości „zapisanych” informacji. Odczyt z /dev/null jest równoznaczny z odczytaniem końca pliku EOF.

Przekierowywanie strumieni we/wy odbywa się podobnie jak DOS (a dokładniej DOS OS przyjął składnię przekierowywania strumieni z UNIX-a) za pomocą symboli:

- przekierowanie standardowego strumienia wyjściowego
- przekierowanie standardowego strumienia wyjściowego w trybie dopisywania
- przekierowanie standardowego strumienia wejściowego
- odbieraj dane ze standardowego wejścia, aż do napotkania ogranicznika

Jednak w przeciwieństwie do DOS-u, podczas tworzenia kanału programu pomiędzy dwoma procesami, system operacyjny UNIX/Linux uruchamia oba procesy jednocześnie i przesyła informacje przez bufor systemowy (bez pośredniego nagrywania na dysk twardy). Zatem kanały oprogramowania w systemie operacyjnym UNIX/Linux są bardzo skutecznym sposobem wymiany. W przypadku przepełnienia bufora systemowego (na przykład, jeśli program wysyłający wysyła informacje do kanału szybciej, niż program odbierający jest w stanie je przetworzyć), system operacyjny automatycznie wstrzymuje proces zapisu do kanału do czasu, aż bufor jest uwolniony.

Najpopularniejsze operatory przekierowań

Nr Składnia Opis
1 plik poleceń Kieruje standardowe wyjście do nowego pliku

2 polecenie 1 plik Kieruje standardowe wyjście do określonego pliku

3 polecenie pliku Kieruje standardowe wyjście do określonego pliku (tryb dołączania)

4 plik poleceń 2&1 Kieruje standardowe wyjście i błąd do określonego pliku

5 polecenie 2 plik Kieruje błąd standardowy do określonego pliku

6 polecenie 2 plik Kieruje błąd standardowy do określonego pliku (tryb dołączania)

7 plik poleceń 2&1 Kieruje standardowe wyjście i błąd do określonego pliku (tryb dołączania)

8 polecenie plik1 plik2 Odbiera dane wejściowe z pierwszego pliku i wysyła dane wyjściowe do drugiego pliku

9 jako standardowe wejście odbiera dane z określonego pliku

10 polecenie ogranicznika Odbiera dane ze standardowego wejścia do momentu napotkania ogranicznika

11 polecenie &m Odbiera dane z pliku o deskryptorze m jako standardowe wejście

12 polecenie &m Kieruje standardowe wyjście do deskryptora pliku m

Operator n&m umożliwia przekierowanie pliku z deskryptorem n do tej samej lokalizacji, co plik z deskryptorem m. W wierszu poleceń może znajdować się kilka podobnych operatorów, w takim przypadku są one obliczane od lewej do prawej.

exec i użycie deskryptorów plików

Polecenie exec zastępuje bieżącą powłokę określonym poleceniem. Zwykle służy do zamknięcia bieżącego interpretera i uruchomienia innego. Ale ma też inne zastosowania.

Na przykład polecenie typu

Plik Exec powoduje, że określony plik będzie standardowym wejściem wszystkich poleceń. Wykonaj to w
nie ma sensu w trybie interaktywnym - jest on przeznaczony do stosowania w skryptach,
tak, aby wszystkie polecenia następujące po nim odczytywały dane wejściowe z pliku. W tym przypadku
na końcu skryptu musi znajdować się polecenie

Exec & – który zamyka standardowy strumień wejściowy (w tym przypadku plik). Stosowana jest podobna technika
głównie w skryptach uruchamianych po wylogowaniu.

Polecenie exec jest wskaźnikiem do pliku z deskryptorem 0 (stdin). Wskaźnik ten można przywrócić dopiero po zakończeniu działania skryptu.
Jeśli skrypt zamierza kontynuować odczytywanie danych z klawiatury, należy zapisać
wskaźnik do poprzedniego strumienia wejściowego. Poniżej znajduje się krótki skrypt demonstrujący, jak to zrobić.

$ kot f_desc
#!/bin/bash
exec 3&0 0plik
czytaj linijkę
przeczytaj wiersz 2
wykonanie 0 i 3
powtórz $1inel
echo $linia2

Pierwsze polecenie exec przechowuje wskaźnik do standardowego wejścia (stdin) w deskryptorze pliku 3
(dozwolona jest dowolna liczba całkowita od 3 do 9), a następnie otwiera plik do odczytu. Następne dwa polecenia odczytu
odczytać dwie linie tekstu z pliku. Drugie polecenie exec przywraca wskaźnik na standardowe wejście: now
jest on powiązany z plikiem stdin, a nie z plikiem. Końcowe polecenia echo wyświetlają na ekranie zawartość przeczytanych linii,
które zostały zapisane w zmiennych linel i Iine2.

Wynik skryptu:
$./f_desc
Cześć!
Do widzenia!

Operatory przekierowania poleceń służą do zmiany domyślnych lokalizacji strumieni wejściowych i wyjściowych poleceń na inną lokalizację. Położenie strumieni wejściowych i wyjściowych nazywa się uchwytem.

W poniższej tabeli opisano operatory przekierowania wejścia i wyjścia poleceń.

Operator przekierowania

Opis

Zapisuje dane wyjściowe polecenia zamiast wiersza poleceń do pliku lub urządzenia, takiego jak drukarka.

Odczytuje strumień wejściowy polecenia z pliku, a nie z klawiatury.

Dołącza wynik polecenia na końcu pliku bez usuwania istniejących informacji z pliku.

Odczytuje dane wyjściowe jednego deskryptora jako dane wejściowe innego deskryptora.

Odczytuje dane wejściowe jednego uchwytu jako dane wyjściowe innego uchwytu.

Odczytuje dane wyjściowe jednego polecenia i zapisuje je na wejściu innego polecenia. Ta procedura jest znana jako channeling.

Domyślnie dane wejściowe poleceń (uchwyt STDIN) są wysyłane z klawiatury do interpretera poleceń Cmd.exe, następnie Cmd.exe wysyła dane wyjściowe poleceń (uchwyt STDOUT) do okna wiersza poleceń.

W poniższej tabeli przedstawiono dostępne deskryptory.

Liczby od 0 do 9 reprezentują pierwszych 10 deskryptorów. Interpreter poleceń Cmd.exe służy do uruchomienia programu i przekierowania dowolnego z 10 dojść. Aby określić wymagany uchwyt, wprowadź jego numer przed operatorem przekierowania. Jeśli uchwyt nie jest zdefiniowany, domyślnie operator przekierowania wejścia "<» будет ноль (0), а оператором перенаправления вывода «>" będzie jeden (1). Po wejściu do operatora "<» или «>„Trzeba wskazać, gdzie dane czytać, a gdzie zapisywać. Można określić nazwę pliku lub dowolny z istniejących deskryptorów.

Aby określić przekierowanie do istniejących uchwytów, użyj znaku ampersand (&), po którym następuje numer żądanego uchwytu (na przykład & numer_uchwytu). Na przykład, aby przekierować uchwyt 2 (STDERR) do obsługi 1 (STDOUT), wpisz:

Zduplikowane deskryptory

Operator przekierowania „&” duplikuje dane wyjściowe lub wejściowe z jednego określonego uchwytu do innego określonego uchwytu. Na przykład, aby wysłać dane wyjściowe polecenia reż do pliku.txt i wyślij dane wyjściowe błędu do pliku.txt, wpisz:

katalog>c:\plik.txt 2>&1

Podczas powielania deskryptora kopiowane są wszystkie jego oryginalne cechy. Na przykład, jeśli uchwyt jest tylko do zapisu, wszystkie jego duplikaty będą tylko do zapisu. Nie można powielić uchwytu tylko do odczytu na uchwyt tylko do zapisu.

Przekierowanie wejścia polecenia (<)

Aby przekierować wprowadzanie z klawiatury numerycznej do pliku lub urządzenia, użyj przycisku „<». Например, для ввода команды sortować z pliku List.txt wpisz:

sortować

Zawartość pliku File.txt pojawi się w wierszu poleceń jako lista w kolejności alfabetycznej.

Operator "<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Notatka

  • Uchwyt 0 jest domyślnym operatorem przekierowania wejścia „<».

Dane wyjściowe polecenia przekierowania (>)

Dane wyjściowe prawie wszystkich poleceń są wyświetlane w oknie wiersza poleceń. Nawet polecenia wysyłające dane na dysk lub drukarkę generują komunikaty i monity w oknie wiersza poleceń.

Aby przekierować wyjście poleceń z okna wiersza poleceń do pliku lub urządzenia, użyj operatora „>”. Ten operator jest używany z większością poleceń. Na przykład, aby przekierować wyjście polecenia reż w pliku Dirlist.txt wpisz:

katalog>dirlist.txt

Jeśli plik Dirlist.txt nie istnieje, utworzy go interpreter poleceń Cmd.exe. Jeśli plik istnieje, Cmd.exe zastąpi informacje zawarte w pliku danymi otrzymanymi z polecenia reż.

Aby uruchomić polecenie zrzut routingu netsh a następnie wysyłając wyniki swojej pracy do Route.cfg wpisujemy:

zrzut routingu netsh>c:\trasa.cfg

Operator „>” otwiera określony plik z dostępem tylko do zapisu. Dlatego pliku nie można odczytać przy użyciu tego operatora. Na przykład podczas uruchamiania programu z operatorem przekierowania<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

Notatka.

  • Uchwyt 1 jest domyślnym operatorem przekierowania wyjścia „>”.

Korzystanie z operatora „<&» для перенаправления ввода и дублирования

Aby użyć operatora przekierowania wejścia, określony plik musi już istnieć. Jeśli plik wejściowy istnieje, interpreter poleceń Cmd.exe otwiera go z dostępem tylko do odczytu i wysyła jego zawartość do polecenia tak, jakby była wprowadzana za pomocą klawiatury numerycznej. Po określeniu dojścia interpreter poleceń Cmd.exe duplikuje je do dojścia istniejącego w systemie.

Na przykład, aby wczytać plik File.txt do deskryptora wejściowego 0 (STDIN), wpisz:

< plik.txt

Aby otworzyć plik File.txt, posortuj jego zawartość, a następnie wyślij go do okna wiersza poleceń (STDOUT), wpisz:

sortować< plik.txt

Aby znaleźć File.txt i przekierować uchwyt 1 (STDOUT) i uchwyt 2 (STDERR) do Search.txt, wpisz:

znajdźplik plik.txt>szukaj.txt 2<&1

Aby zduplikować zdefiniowany przez użytkownika deskryptor 3 jako dane wejściowe do deskryptora 0 (STDIN), wprowadź:

Używanie operatora „>&” do przekierowywania danych wejściowych i duplikowania

Po przekierowaniu danych wyjściowych do pliku i określeniu istniejącej nazwy pliku interpreter poleceń Cmd.exe otwiera plik z dostępem tylko do zapisu i nadpisuje jego zawartość. Jeśli określono dojście, interpreter poleceń Cmd.exe duplikuje plik do istniejącego dojścia.

Aby zduplikować zdefiniowany przez użytkownika deskryptor 3 do deskryptora 1, wprowadź:

Aby przekierować wszystkie dane wyjściowe, w tym dane wyjściowe deskryptora 2 (STDERR), należy użyć poleceń ipconfig do uchwytu 1 (STDOUT), a następnie przekierowując dane wyjściowe do Output.log, wpisz:

ipconfig.exe >>output.log 2>&1

Użycie operatora „>>” do dołączenia danych wyjściowych

Aby dołączyć wynik polecenia na końcu pliku bez utraty przechowywanych w nim informacji, użyj znaku podwójnej większości (>>). Na przykład poniższe polecenie dodaje listę katalogów utworzoną za pomocą tego polecenia reż, do pliku Dirlist.txt:

katalog >> lista katalogów.txt

Aby dodać dane wyjściowe poleceń netstat na końcu pliku Tcpinfo.txt wpisz:

netstat>>tcpinfo.txt

Korzystanie z operatora kanału (|)

Operator pionowej rury liniowej (|) pobiera dane wyjściowe jednego polecenia (domyślnie STDOUT) i kieruje je na wejście innego polecenia (domyślnie STDIN). Na przykład poniższe polecenie sortuje katalog:

reż. | sortować

W tym przykładzie oba polecenia są uruchamiane jednocześnie, ale polecenie sortować zatrzymuje się do momentu odebrania sygnału wyjściowego polecenia reż. Zespół sortować wykorzystuje dane wyjściowe polecenia reż jako dane wejściowe, a następnie wysyła swoje dane wyjściowe do deskryptora 1 (STDOUT).

Łączenie poleceń z operatorami przekierowań

Łącząc polecenia filtrujące z innymi poleceniami i nazwami plików, można tworzyć polecenia niestandardowe. Na przykład, aby zapisać nazwy plików zawierające ciąg „LOG”, użyj następującego polecenia:

katalog /b | znajdź „LOG” > loglist.txt

Dane wyjściowe polecenia reż wysłane do polecenia filter znajdować. Nazwy plików zawierające ciąg „LOG” są przechowywane w pliku Loglist.txt w postaci listy (na przykład NetshConfig.log, Logdat.svd i Mylog.bat).

Jeśli w jednym poleceniu używany jest więcej niż jeden filtr, należy je oddzielić pionkiem (|). Na przykład następujące polecenie przeszukuje każdy katalog na dysku C w poszukiwaniu plików mających w nazwie ciąg „Log” i wyświetla je strona po stronie:

katalog c:\ /s /b | znajdź „LOG” | więcej

Obecność potoku (|) wskazuje Cmd.exe, że wyjście polecenia reż należy wysłać do polecenia filter znajdować. Zespół znajdować wybiera tylko te nazwy plików, które zawierają ciąg „LOG”. Zespół więcej wyświetla nazwy plików uzyskane za pomocą polecenia znajdować z przerwą po zapełnieniu każdego ekranu.

Do zapisu danych plik lub odczytać je stamtąd, proces musi najpierw otworzyć ten plik (jeśli jest otwarty do zapisu, być może będzie musiał go najpierw utworzyć). W tym przypadku proces otrzymuje deskryptor(deskryptor) otwartego pliku to numer unikalny dla tego procesu, którego będzie on używał we wszystkich operacjach zapisu. Pierwszy otwarty plik otrzyma deskryptor, drugi otrzyma 1 i tak dalej. Po zakończeniu pracy z plikiem proces zamyka się go, a uchwyt zostaje uwolniony i można go ponownie wykorzystać. Jeśli proces zakończy się bez zamknięcia plików, system zrobi to za niego. Ściśle mówiąc, tylko operacja otwartego deskryptora określa, który plik zostanie użyty. Zarówno zwykłe pliki, jak i pliki dziur (najczęściej terminale), oraz kanały, opisane w sekcji Pipeline..Pipeline. Dalsze operacje - czytanie, pisanie i zamykanie, pracuj z uchwytem jak z przepływ danych i dokąd dokładnie ten przepływ prowadzi, nie ma znaczenia.

Każdy proces systemu Linux otrzymuje przy uruchomieniu trzy„plik” otwarty dla niego przez system. Pierwsza (klamka) jest otwarta o godz czytanie, Ten standardowe wejście proces. Jest to standardowe wejście, na którym działają wszystkie operacje odczytu, chyba że określono deskryptor pliku. Drugi (deskryptor 1) jest otwarty do zapisu standardowe wyjście proces. Działają z nim wszystkie operacje zapisu, chyba że wyraźnie określono w nich deskryptor pliku. Wreszcie trzeci strumień danych (deskryptor 2) przeznaczony jest do wysyłania komunikatów diagnostycznych, tzw standardowe wyjście błędu. Ponieważ te trzy uchwyty są już otwarte w momencie rozpoczęcia procesu, pierwszy plik otwarty przez sam proces najprawdopodobniej będzie miał uchwyt 3.

Uchwyt Uchwyt do strumienia danych otwieranego przez proces. Deskryptory są numerowane począwszy od. Kiedy otwierany jest nowy strumień danych, jego deskryptorowi przypisywany jest najniższy numer, który nie jest aktualnie używany. Trzy wstępnie otwarte uchwyty: standardowe wejście (), standardowe wyjście(1) i standardowe wyjście błędu(2) wydawane procesowi podczas uruchamiania.

Mechanizm kopiowania środowisko opisany na wykładzie zakłada m.in. kopiowanie do dziecka wszystkich otwartych uchwytów procesu nadrzędnego. W rezultacie zarówno procesy nadrzędne, jak i podrzędne mają te same strumienie danych pod tymi samymi uchwytami. Kiedy się zacznie uruchomienie interpretera poleceń, z którymi powiązane są wszystkie trzy wstępnie otwarte deskryptory terminal(dokładniej z odpowiednim plikiem dziury typu tty): użytkownik wprowadza polecenia z klawiatury i widzi komunikaty na ekranie. Dlatego każde polecenie uruchomione z powłoki zostanie wysłane do tego samego terminala i każde polecenie zostanie uruchomione interaktywnie(nie w tle) - wejdź stamtąd.

Standardowe wyjście

Metody zetknął się już z faktem, że niektóre programy potrafią wyprowadzać nie tylko na terminal, ale także do pliku, np. info przy podaniu klucz parametryczny„-o”, po którym następuje nazwa pliku, spowoduje wypisanie tekstu podręcznika do pliku zamiast wyświetlania go na monitorze. Nawet jeśli twórcy programu nie udostępniają takiego klucza, Metody zna inny sposób zapisania wyniku programu w pliku zamiast wyświetlania go na monitorze: wstaw znak „>” i podaj nazwę pliku. Zatem Metodiusz stworzył już krótkie pliki tekstowe (skrypty) za pomocą narzędzia cat (patrz wykład Proces dostępu do plików i katalogów).

$ cat > plik tekstowy To jest przykładowy plik. ^D $ ls -l plik tekstowy -rw-r--r-- 1 metodyczny metoda 23 lis 15 16:06 plik tekstowy

Przykład 2. Przekierowanie standardowego wyjścia do pliku

Użycie symbolu „>” oczywiście nie rozszerzyło możliwości samego narzędzia cat. Co więcej, kot w tym przykładzie nie otrzymał od powłoka brak parametrów: brak znaku „>”, brak późniejszej nazwy pliku. W tym przypadku cat pracował jak zwykle, nie wiedząc (a nawet nie będąc zainteresowanym!), gdzie znajdą się dane wyjściowe: na ekranie monitora, w pliku czy gdzie indziej. Zamiast zapewniać, że dane wyjściowe same dotrą do miejsca docelowego (osoby lub pliku), cat wysyła wszystkie dane do standardowe wyjście(w skrócie standardowe wyjście).

Zastąpienie standardowego wyjścia jest zadaniem powłoki. W tym przykładzie powłoka tworzy pusty plik, którego nazwa jest podana po znaku „>”, a uchwyt do tego pliku jest przekazywany do programu cat jako numer 1 ( standardowe wyjście). Odbywa się to bardzo prosto. W wykładzie Process Access to Files and Directories omawialiśmy sposób uruchamiania poleceń z powłoki. W szczególności po wykonaniu fork() pojawiają się dwa identyczne procesy, z których jeden - potomek - musi zamiast siebie uruchomić polecenie (execute exec()). A więc wcześniej on zamyka się standardowe wyjście (uchwyt 1 jest zwolniony) i otwiera się plik (związany z Pierwszy wolny deskryptor, czyli 1), a uruchamiane polecenie nie musi nic wiedzieć: jego standardowe wyjście zostało już zastąpione. Ta operacja nazywa się przekierowanie standardowe wyjście. Jeśli plik już istnieje, powłoka napisze go ponownie, całkowicie niszcząc wszystko, co wcześniej zawierało. Dlatego Metody, aby kontynuować zapisywanie danych do pliku tekstowego, będzie potrzebował kolejnej operacji - „>>”.

$ cat >> plik tekstowy Przykład 1. ^D $ plik tekstowy cat To jest przykładowy plik. Przykład 1. $

Przykład 3. Nieniszczące przekierowanie standardowego wyjścia

Metody uzyskał dokładnie taki rezultat, jakiego potrzebował: dodał dane ze standardowego wyjścia następnego polecenia na koniec już istniejącego pliku.

Standardowe wyjście Strumień danych otwierany przez system dla każdego procesu podczas jego uruchamiania i przeznaczony do wyprowadzania danych przez proces.

Standardowe wejście

Podobnie, aby przenieść dane na wejście programu, możesz użyć standardowe wejście(w skrócie stdin). Podczas pracy z wierszem poleceń standardowym wejściem są znaki wprowadzane przez użytkownika z klawiatury. Standardowe wejście można przekierować za pomocą powłoki poleceń, wprowadzając do niego dane z pliku. Symbol „< » служит для перенаправления содержимого файла на стандартный ввод программе. Например, если вызвать утилиту sort без параметра, она будет читать строки со стандартного ввода. Команда « sort < имя_файла» jako dane wejściowe pobierze dane sortowania z pliku.

$sort< textfile Пример 1. Это файл для примеров. $

Przykład 4. Przekierowanie standardowego wejścia z pliku

Działanie tego polecenia jest dokładnie takie samo, jak polecenie sortowania pliku tekstowego, z tą różnicą, że gdy „< », sort получает данные со стандартного ввода, ничего не зная о файле « textfile », откуда они поступают. Механизм работы shell в данном случае тот же, что и при перенаправлении вывода: shell читает данные из файла « textfile », запускает утилиту sort и передаёт ей на стандартный ввод содержимое файла.

Warto pamiętać, że operacja „>” destrukcyjny: Zawsze tworzy plik o zerowej długości. Dlatego na przykład do sortowania danych w pliku sortowanie należy zastosować sekwencyjnie < файл >nowy plik i mw nowy_plik plik. Wyświetl polecenie zespół< файл >ten sam_plik po prostu przytnę go do zerowej długości!

Wejście standardowe Strumień danych otwierany przez system dla każdego procesu w momencie jego uruchomienia i przeznaczony do wprowadzania danych.

Standardowe wyjście błędu

Jako pierwszy przykład i ćwiczenie przekierowania, Metody zdecydował się napisać przewodnik po kocie w swoim pliku cat.info:

$ info cat > cat.info info: Zapisz wywołanie węzła (coreutils.info.bz2)cat... info: Zakończono. $ head -1 cat.info Plik: coreutils.info, Węzeł: wywołanie cat, Dalej: wywołanie tac, Góra: Dane wyjściowe całych plików $

Przykład 5. Standardowe wyjście błędu

Zaskoczony Metody odkrył, że pomimo polecenia przejścia do pliku, dwie linie wyświetlane przez polecenie info nadal docierały do ​​terminala. Oczywiście linie te nie zostały uwzględnione standardowe wyjście ponieważ nie odnoszą się bezpośrednio do instrukcji, którą program powinien wyprowadzić, informują użytkownika o postępie pracy: zapisaniu instrukcji do pliku. Dla tego rodzaju komunikaty diagnostyczne, a także komunikaty o błędach, które wystąpiły podczas wykonywania programu, zapewnia Linux standardowe wyjście błędu(w skrócie stderr).

Standardowe wyjście błędu Strumień danych, który system otwiera dla każdego procesu podczas jego uruchamiania i zgodnie z zamierzeniem komunikaty diagnostyczne, wynik procesu.

Używanie standardowego wyjścia błędów razem ze standardowym wyjściem pozwala oddzielić rzeczywiste wyjście programu od różnych towarzyszących informacji, na przykład poprzez skierowanie ich do różnych plików. Standardowe wyjście błędów można przekierować w taki sam sposób, jak standardowe wejścia/wyjścia, używając kombinacji znaków „2”.

$ info cat > cat.info 2> cat.stderr $ cat cat.stderr info: Zapisz wywołanie węzła (coreutils.info.bz2)cat... info: Zakończono. $

Przykład 6. Przekieruj standardowe wyjście błędu

Tym razem nic nie dotarło do terminala, standardowe wyjście trafiło do pliku cat.info, standardowe wyjście błędu trafiło do cat.stderr. Zamiast „>” i „2” Metodiusz mógł napisać „1>” i „2>”. Liczby w tym przypadku wskazują numery deskryptorów otwieralny akta. Jeśli jakieś narzędzie spodziewa się otrzymać otwarty deskryptor z liczbą, powiedzmy 4, a następnie uruchom go Koniecznie będziesz musiał użyć kombinacji „4>”.

Czasami jednak chcesz połączyć standardowe wyjście i standardowe wyjście błędów w jeden plik, zamiast je rozdzielać. Powłoka bash ma do tego specjalną sekwencję „2>&1”. Oznacza to „bezpośrednie standardowe wyjście błędu w to samo miejsce, co standardowe wyjście”:

$ info cat > cat.info 2>&1 $ head -3 cat.info info: Zapisz wywołanie węzła (coreutils.info.bz2)cat... info: Zakończono. Plik: coreutils.info, Węzeł: wywołanie cat, Dalej: wywołanie tac, Góra: Dane wyjściowe całych plików $

Przykład 7. Łączenie standardowego wyjścia i standardowego wyjścia błędów

W tym przykładzie ważna jest kolejność przekierowań: w linii poleceń Metody najpierw wskazał, gdzie przekierować standardowe wyjście („> cat.info”), a dopiero potem nakazał przekierowanie tam standardowego wyjścia błędów. Gdyby zrobił to na odwrót („2>&1 > cat.info”), wynik byłby nieoczekiwany: do pliku trafiłoby tylko standardowe wyjście, a na terminalu pojawiłyby się komunikaty diagnostyczne. Jednak logika jest tutaj niezawodna: w momencie wykonania operacji „2>&1” standardowe wyjście było powiązane z terminalem, co oznacza, że Po Po wykonaniu standardowe wyjście błędu zostanie również powiązane z terminalem. Późniejsze przekierowanie standardowego wyjścia do pliku oczywiście nie będzie miało żadnego wpływu na standardowe wyjście błędów. Liczba w konstrukcji „&number” jest liczbą otwarty deskryptor. Jeśli powyższe narzędzie zapisujące do czwartego deskryptora zostało napisane w powłoce, użyłoby przekierowań takich jak „ >&4”. Aby uniknąć wpisywania kłopotliwej konstrukcji „> plik 2>&1”, bash używa skrótów: „ &> plik” lub, co jest tym samym, „ >& plik”.

Przekierowanie donikąd

Czasami wiadomo, że niektóre dane wyprowadzane przez program nie będą potrzebne. Na przykład ostrzeżenia ze standardowego wyjścia błędów. W takim przypadku możesz przekierować standardowe wyjście błędu do dziura w pliku, specjalnie zaprojektowany do niszczenia danych - /dev/null . Wszystko, co zostanie zapisane w tym pliku, zostanie po prostu wyrzucone i nie zostaną nigdzie zapisane.

$ info cat > cat.info 2 > /dev/null $

Przykład 8. Przekieruj do /dev/null

Dokładnie w ten sam sposób możesz pozbyć się standardowego wyjścia, wysyłając je do /dev/null .

  • Tłumaczenie

Jeśli opanowałeś już podstawy terminala, możesz być gotowy na połączenie poznanych poleceń. Czasami wykonanie poleceń powłoki pojedynczo wystarczy, aby rozwiązać określony problem, ale w niektórych przypadkach wpisywanie kolejnych poleceń jest zbyt żmudne i irracjonalne. W takiej sytuacji przydatne są specjalne symbole, takie jak nawiasy ostrokątne.

W przypadku powłoki, interpretatora poleceń Linuksa, te dodatkowe znaki nie są stratą miejsca na ekranie. To potężne zespoły, które potrafią połączyć różne informacje, oddzielić to, co wcześniej było całością i zrobić znacznie więcej. Jedną z najprostszych, a jednocześnie najpotężniejszych i powszechnie używanych funkcji powłoki jest przekierowywanie standardowych strumieni wejścia/wyjścia.

Trzy standardowe strumienie we/wy

Aby zrozumieć o czym będziemy tutaj mówić, ważne jest, aby wiedzieć, skąd pochodzą i dokąd trafiają dane, które można przekierować. Linux ma trzy standardowe strumienie we/wy.

Pierwszy to standardowy strumień wejściowy. W systemie jest to wątek nr 0 (ponieważ w komputerach liczenie zwykle zaczyna się od zera). Numery wątków nazywane są także deskryptorami. Strumień ten reprezentuje pewne informacje przekazywane do terminala, w szczególności instrukcje przekazywane powłoce w celu wykonania. Zazwyczaj dane wchodzą do tego strumienia, gdy użytkownik wprowadza je z klawiatury.

Drugi strumień to standardowy strumień wyjściowy, oznaczony numerem 1. Jest to strumień danych, który powłoka wysyła na wyjście po wykonaniu jakiejś akcji. Zazwyczaj dane te trafiają do tego samego okna terminala, w którym wprowadzono polecenie, które spowodowało ich wyświetlenie.

I wreszcie trzeci strumień to standardowy strumień błędów, ma uchwyt 2. Strumień ten jest podobny do standardowego strumienia wyjściowego, ponieważ zwykle to, co do niego trafia, kończy się na ekranie terminala. Jednakże z natury różni się ono od standardowego wyjścia, w związku z czym strumienie te można w razie potrzeby sterować oddzielnie. Jest to przydatne na przykład w następującej sytuacji. Istnieje zespół, który przetwarza dużą ilość danych, wykonując skomplikowaną i podatną na błędy operację. Chcesz mieć pewność, że ładunek generowany przez to polecenie nie jest pomieszany z komunikatami o błędach. Osiąga się to poprzez oddzielne przekierowanie strumieni wyjściowych i strumieni błędów.

Jak już zapewne się domyślasz, przekierowanie I/O oznacza pracę z opisanymi powyżej strumieniami i przekierowanie danych tam, gdzie programista tego potrzebuje. Odbywa się to za pomocą symboli > i< в различных комбинациях, применение которых зависит от того, куда, в итоге, должны попасть перенаправляемые данные.

Przekieruj standardowe wyjście

Załóżmy, że chcesz utworzyć plik, w którym będzie zapisywana bieżąca data i godzina. Aby ułatwić sprawę, istnieje polecenie o trafnej nazwie date , które zwraca to, czego potrzebujemy. Zwykle wysyła dane na standardowe wyjście. Aby dane te pojawiły się w pliku należy po poleceniu, przed nazwą pliku docelowego, dodać symbol >. Przed i po > musisz wstawić spację.

Podczas korzystania z przekierowania każdy plik określony po > zostanie nadpisany. Jeżeli w pliku nie ma nic wartościowego i jego zawartość może zostać utracona, w naszym projekcie dopuszczalne jest wykorzystanie już istniejącego pliku. Zwykle lepiej jest użyć w tym przypadku nazwy pliku, która jeszcze nie istnieje. Plik ten zostanie utworzony po wykonaniu polecenia. Nazwijmy to date.txt. Rozszerzenie pliku po kropce zwykle nie ma większego znaczenia, ale rozszerzenia pomagają zachować porządek. Oto nasze polecenie:

$data>data.txt
Nie oznacza to, że to polecenie samo w sobie jest niezwykle przydatne, jednak w oparciu o nie możemy już zrobić coś ciekawszego. Załóżmy, że chcesz wiedzieć, w jaki sposób Twój ruch jest przekierowywany przez Internet do jakiegoś punktu końcowego, rejestrując codziennie dane. W rozwiązaniu tego problemu pomoże polecenie traceroute, które raportuje szczegółowe informacje o trasie ruchu pomiędzy naszym komputerem a punktem końcowym określonym przy wywołaniu polecenia w formie adresu URL. Dane obejmują informacje o wszystkich routerach, przez które przechodzi ruch.

Ponieważ mamy już plik z datą, całkiem uzasadnione byłoby po prostu dołączenie do tego pliku danych otrzymanych z traceroute. W tym celu należy użyć dwóch symboli >, umieszczonych jeden za drugim. W efekcie nowe polecenie, które przekieruje dane wyjściowe do pliku, ale ich nie nadpisze, a jedynie doda nowe dane po starych, będzie wyglądać następująco:

$ traceroute google.com >> date.txt
Teraz wystarczy zmienić nazwę pliku na bardziej znaczącą za pomocą polecenia mv, które jako pierwszy argument przyjmuje oryginalną nazwę pliku, a jako drugi nową nazwę pliku:

$ mv data.txt śledzenie1.txt

Przekieruj standardowe wejście

Używanie znaku< вместо >możemy przekierować standardowe wejście, zastępując je zawartością pliku.

Załóżmy, że istnieją dwa pliki: lista1.txt i lista2.txt, każdy zawierający nieposortowaną listę ciągów znaków. Każda lista zawiera elementy, które są dla niej unikalne, ale niektóre elementy na liście są takie same. Linie znajdujące się zarówno na pierwszej, jak i na drugiej liście możemy znaleźć za pomocą polecenia comm, jednak przed jego użyciem listy muszą zostać posortowane.

Istnieje polecenie sort, które zwraca posortowaną listę do terminala bez zapisywania posortowanych danych do pliku, z którego zostały pobrane. Możesz wysłać posortowaną wersję każdej listy do nowego pliku za pomocą polecenia >, a następnie użyć polecenia comm. Jednak takie podejście będzie wymagało co najmniej dwóch poleceń, chociaż to samo można zrobić w jednej linii bez tworzenia niepotrzebnych plików.

Możemy więc użyć polecenia< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ kom<(sort list1.txt) <(sort list2.txt)
Nawiasy mają tu takie samo znaczenie jak w matematyce. Powłoka najpierw przetwarza polecenia w nawiasach, a potem wszystko inne. W naszym przykładzie najpierw sortowane są linie z plików, a następnie wynik przekazywany jest do polecenia comm, które następnie wyświetla wynik porównania list.

Przekierowanie standardowego strumienia błędów

Na koniec porozmawiajmy o standardowym przekierowaniu błędów. Może to być potrzebne na przykład do tworzenia plików dziennika z błędami lub do łączenia w jednym pliku komunikatów o błędach i danych zwracanych przez określone polecenie.

Co się na przykład stanie, jeśli chcesz przeszukać cały system w poszukiwaniu informacji o interfejsach bezprzewodowych dostępnych dla użytkowników, którzy nie mają uprawnień roota? Aby to zrobić, możesz użyć potężnego polecenia find.

Zwykle, gdy zwykły użytkownik uruchomi polecenie find w całym systemie, wyświetli ono na terminalu zarówno przydatne dane, jak i błędy. Jednocześnie tych drugich jest zwykle więcej niż pierwszych, co utrudnia znalezienie tego, czego potrzebujesz w wynikach poleceń. Rozwiązanie tego problemu jest dość proste: wystarczy przekierować standardowy strumień błędów do pliku za pomocą polecenia 2> (pamiętaj, że 2 jest deskryptorem standardowego strumienia błędów). W rezultacie na ekranie pojawi się tylko to, co polecenie wyśle ​​na standardowe wyjście:

$ find / -name bezprzewodowa 2> odrzucona.txt
Co się stanie, jeśli chcesz zapisać wyniki polecenia w osobnym pliku bez mieszania tych danych z informacjami o błędach? Ponieważ strumienie mogą być przekierowywane niezależnie od siebie, na końcu naszej konstrukcji możemy dodać polecenie przekierowujące standardowe wyjście do pliku:

$ find / -name wireless 2> odmówiono.txt > znaleziono.txt
Należy pamiętać, że pierwszy nawias ostry występuje z liczbą - 2>, a drugi bez niej. Dzieje się tak, ponieważ standardowe wyjście ma uchwyt 1, a polecenie > ma na celu przekierowanie standardowego wyjścia, jeśli nie określono numeru uchwytu.

Na koniec, jeśli chcesz, aby wszystko, co wyjdzie z polecenia, znalazło się w jednym pliku, możesz przekierować oba strumienie do tej samej lokalizacji za pomocą polecenia &>:

$ find / -name wireless &>results.txt

Wyniki

Tutaj omówiliśmy jedynie podstawy mechanizmu przekierowywania wątków w interpreterze wiersza poleceń Linuksa, ale nawet to, czego się dzisiaj nauczyłeś, daje ci niemal nieograniczone możliwości. A swoją drogą, jak wszystko inne związane z pracą w terminalu, opanowanie przekierowania strumienia wymaga praktyki. Dlatego zalecamy rozpoczęcie własnych eksperymentów od > i< .

Drodzy Czytelnicy! Czy znasz jakieś interesujące przykłady użycia przekierowania wątków w Linuksie, które pomogą początkującym oswoić się z tą techniką terminalową?