Przekierowanie wejścia/wyjścia w przykładach systemu Linux/Unix

⚡ Inteligentne podsumowanie

Przekierowanie w systemach Linux i Unix zmienia miejsce, w którym polecenie odczytuje dane wejściowe lub wysyła dane wyjściowe,ping klawiatura i ekran dla plików lub urządzeń przy użyciu operatorów takich jak znak większości, znak mniejszości i operator dołączania.

  • 🔀 przekierowanie: Przekierowanie zmienia standardowe dane wejściowe lub wyjściowe polecenia z klawiatury i ekranu na plik lub urządzenie.
  • ➡️ Wyjście: Operator > zapisuje dane wyjściowe do pliku, natomiast >> dołącza je do istniejącego pliku bez jego usuwania.
  • ⬅️ Wejście: Operator < wprowadza plik do polecenia jako standardowe dane wejściowe zamiast do klawiatury.
  • 🔢 Deskryptory plików: Każdy otwarty plik otrzymuje numer: 0 dla stdin, 1 dla stdout i 2 dla stderr.
  • ⚠️ Przekierowanie błędu: Użycie 2> powoduje wysłanie komunikatów o błędach do osobnego pliku, dzięki czemu nie zaśmiecają normalnego wyjścia.
  • 🔗 Połączone strumienie: Składnia 2>&1 kieruje standardowy błąd do tego samego celu, do którego kierowane jest standardowe wyjście.
  • 🤖 Pomoc AI: Asystenci AI i GitHub Copilot mogą tworzyć i objaśniać polecenia przekierowywania i skrypty powłoki.

Przekierowanie wejścia/wyjścia w systemach Linux i Unix z przykładami

Przekierowanie jest jedną z najprzydatniejszych funkcji Linux i powłoka Unix, ponieważ pozwala określić, gdzie polecenie odczytuje dane wejściowe i wysyła dane wyjściowe. Ta strona wyjaśnia przekierowywanie danych wyjściowych, wejściowych i błędów wraz z przykładami.

Co to jest przekierowanie?

Przekierowanie to funkcja w Linuksie, dzięki której podczas wykonywania polecenia można zmienić standardowe urządzenia wejściowe i wyjściowe. Podstawowy przepływ pracy każdego Polecenie Linuksa polega na tym, że przyjmuje dane wejściowe i daje dane wyjściowe.

  • Standardowym urządzeniem wejściowym (stdin) jest klawiatura.
  • Standardowym urządzeniem wyjściowym (stdout) jest ekran.

Dzięki przekierowaniu można zmienić powyższe standardowe dane wejściowe i wyjściowe.

Przekierowanie wyjścia

Poniższa grafika stanowi początek przykładów przekierowywania wyjścia.

Grafika nagłówka sekcji przekierowania wyjściowego

Symbol '>' służy do przekierowania wyjścia (STDOUT).

Przykład:

ls -al > listings

W tym przypadku wynik polecenia ls -al jest przekierowywany do pliku „listings” zamiast na ekran. Wynik pokazuje poniższy zrzut ekranu.

Terminal pokazujący listę ls -al przekierowaną do pliku lists

Uwaga: Podczas przekierowywania wyników polecenia do pliku należy użyć prawidłowej nazwy pliku. Jeśli plik o tej samej nazwie już istnieje, przekierowane polecenie usunie jego zawartość, a następnie ją nadpisze.

Jeśli nie chcesz nadpisać pliku, ale chcesz dodać więcej treści do istniejącego pliku, użyj operatora „>>”. Poniższy zrzut ekranu pokazuje treść z dołączonym operatorem „>>”.

Terminal pokazujący wynik polecenia dołączony do istniejącego pliku za pomocą operatora podwójnego „większy niż”

Możesz przekierować standardowe wyjście nie tylko do plików, ale także do urządzeń.

$ cat music.mp3 > /dev/audio

Polecenie cat odczytuje plik music.mp3 i wysyła dane wyjściowe do /dev/audio, czyli urządzenia audio. Jeśli konfiguracja dźwięku na komputerze jest poprawna, to polecenie odtworzy plik music.mp3.

Przekierowanie wejścia

Poniższa grafika przedstawia przekierowywanie danych wejściowych.

Grafika nagłówka sekcji przekierowania wejściowego

Symbol „<” służy do przekierowania danych wejściowych (STDIN).

Przykład: Program pocztowy w systemie Linux może pomóc w wysyłaniu wiadomości e-mail z terminala.

Treść wiadomości e-mail możesz wpisać za pomocą klawiatury, czyli standardowego urządzenia wejściowego. Jeśli jednak chcesz dołączyć plik do wiadomości e-mail, możesz użyć operatora przekierowania danych wejściowych w poniższym formacie.

mail -s "Subject" to-address < Filename

Poniższy zrzut ekranu pokazuje polecenie mail odczytujące plik jako swoje dane wejściowe.

polecenie poczty elektronicznej wykorzystujące przekierowanie danych wejściowych do dołączenia pliku do wiadomości e-mail

Plik zostaje dołączony do wiadomości e-mail i wysłany do odbiorcy.

Powyższe przykłady były proste. Teraz przyjrzyjmy się zaawansowanym technikom przekierowywania, które wykorzystują deskryptory plików.

filet Descriptory (FD)

W systemach Linux i Unix wszystko jest plikiem. Zwykłe pliki, katalogi, a nawet urządzenia są plikami. Każdy plik ma przypisany numer zwany deskryptorem pliku (FD).

Poniższy diagram przedstawia standardowe strumienie i ich deskryptory plików.

Schemat standardowych strumieni wejściowych, wyjściowych i błędów oraz ich deskryptorów plików

Twój ekran ma również deskryptor pliku. Po uruchomieniu programu, dane wyjściowe są wysyłane do deskryptora pliku ekranu, a Ty widzisz dane wyjściowe programu na monitorze. Gdyby dane wyjściowe zostały wysłane do deskryptora pliku drukarki, dane wyjściowe programu zostałyby wydrukowane.

Błąd przekierowania

Za każdym razem, gdy uruchamiasz program lub polecenie w terminalu, otwarte są trzy pliki: standardowe wejście, standardowe wyjście i standardowe wyjście błędów.

Pliki te są zawsze obecne przy każdym uruchomieniu programu. Jak wyjaśniono wcześniej, z każdym z tych plików jest powiązany deskryptor pliku.

filet filet Descriptor
Standardowe wejście STDIN 0
Standardowe wyjście STDOUT 1
Błąd standardowy STDERR 2

Domyślnie strumień błędów jest wyświetlany na ekranie. Przekierowanie błędów kieruje błędy do pliku innego niż ekran.

Dlaczego przekierowanie błędów?

Przekierowywanie błędów jest jedną z bardzo popularnych funkcji systemów Unix i Linux.

Doświadczeni użytkownicy Uniksa wiedzą, że wiele poleceń generuje mnóstwo błędów. Na przykład podczas wyszukiwania plików zazwyczaj pojawia się… pozwolenie błędy odmowy, które zazwyczaj nie pomagają osobie wyszukującej konkretny plik. Podczas wykonywania skryptów powłoki często nie chcemy, aby komunikaty o błędach zaśmiecały normalne wyjście programu.

Rozwiązaniem jest przekierowanie komunikatów o błędach do pliku.

1 przykład

$ myprogram 2>errorsfile

Zrzut ekranu poniżej pokazuje to polecenie w terminalu.

Terminal uruchamiający program MyProgram ze standardowym błędem przekierowanym do pliku Errorfile

Powyżej wykonujemy program o nazwie myprogram. Deskryptor pliku dla standardowego wyjścia błędów to 2. Używając „2>”, przekierowujemy wyjście błędu do pliku o nazwie „errorsfile”. Dzięki temu wyjście programu nie jest zaśmiecone błędami.

2 przykład

Oto kolejny przykład wykorzystujący polecenie find.

find . -name 'my*' 2>error.log

Używając polecenia find, przeszukujemy bieżący katalog „.” w celu znalezienia pliku, którego nazwa zaczyna się od „my” i wysyłamy wszelkie błędy do pliku error.log.

3 przykład: Przyjrzyjmy się bardziej złożonemu przykładowi.

Administratorzy serwerów często tworzą listę katalogów i zapisują zarówno komunikaty o błędach, jak i standardowe wyjście w pliku, który można później przetworzyć. Oto polecenie.

ls Documents ABC> dirlist 2>&1

Poniższy diagram przedstawia oba strumienie przechwytywane w jednym pliku.

Schemat standardowego wyjścia i standardowego błędu przekierowanych do listy katalogów plików

Tutaj:

  • 2>&1 oznacza, że ​​STDERR jest przekierowywany do tego samego celu co STDOUT (czyli do listy katalogów plików).
  • Wyjście błędu jest przekierowywane na standardowe wyjście, które z kolei jest przekierowywane do pliku dirlist. W związku z tym oba strumienie są zapisywane do pliku dirlist.

Poniższy diagram podsumowuje, w jaki sposób przekierowywanie danych wejściowych, wyjściowych i błędów jest ze sobą powiązane.

Schemat podsumowujący przekierowanie danych wejściowych, wyjściowych i błędów w systemach Linux i Unix

FAQ

A rura (|) wysyła dane wyjściowe jednego polecenia bezpośrednio do innego polecenia jako dane wejściowe. Przekierowanie natomiast łączy polecenie z plikiem lub urządzeniem, zapisując do niego dane wyjściowe lub odczytując z niego dane wejściowe. Potoki łączą polecenia; przekierowanie łączy polecenie z plikiem.

Operator > zapisuje dane wyjściowe polecenia do pliku, zastępując istniejącą zawartość. Operator >> dołącza dane wyjściowe na końcu pliku.ping co już tam jest. Używaj >> zawsze, gdy chcesz dodać coś do pliku, zamiast go nadpisywać.

/dev/null to specjalny plik, który usuwa wszystkie dane do niego zapisane. Dodanie 2>/dev/null do polecenia przekierowuje komunikaty o błędach do tego pliku, po cichu je usuwając, tak aby na ekranie wyświetlały się tylko normalne dane wyjściowe. To powszechny sposób na ukrycie niechcianych błędów.

Polecenie tee odczytuje dane ze standardowego wejścia i zapisuje je jednocześnie na ekranie oraz w jednym lub kilku plikach, na przykład ls -al | tee listing.txt. Pozwala ono zapisać wynik polecenia do pliku, jednocześnie wyświetlając go na ekranie.

Dokument here używa operatora << do wprowadzenia kilku wierszy tekstu do polecenia jako danych wejściowych, kończącego się wybranym przez Ciebie słowem-znacznikiem. Jest to przydatne w skryptach powłoki do przekazywania wielowierszowych danych wejściowych, takich jak treść wiadomości e-mail, bez konieczności używania osobnego pliku.

Użyj składni 2>&1 po przekierowaniu wyjścia, jak w poleceniu > plik 2>&1, aby standardowe wyjście błędów podążało za standardowym wyjściem do pliku. W nowoczesnym Bash skrócona wersja polecenia &> plik działa tak samo. Kolejność ma znaczenie: umieść 2>&1 po przekierowaniu wyjścia.

Asystenci AI potrafią przekształcić żądanie w prostym języku angielskim w poprawne polecenie przekierowania, wyjaśnić działanie operatorów takich jak 2>&1 lub &> oraz sygnalizować błędy przed ich uruchomieniem. Narzędzia uczenia maszynowego skanują również przekierowane pliki dziennika i błędy, aby wykryć anomalie, które mogłyby zostać pominięte podczas ręcznej weryfikacji.

Tak. Drugi pilot GitHub może generować polecenia i skrypty, które przekierowują dane wejściowe, wyjściowe i błędy na podstawie krótkiego komentarza opisującego cel, i uzupełniają je w miarę pisania. Revprzeglądaj wszystkie sugerowane polecenia dotyczące twoich plików, zwłaszcza te używające >, które nadpisują istniejące dane.

Podsumuj ten post następująco: