Intro
Czasami widzimy w powłoce polecenia takie jak to:
- $ ls foo > /dev/null 2>&1
Może być trudno zrozumieć, co to robi po raz pierwszy, więc ta uwaga wyjaśni to pokrótce.
Przekierowanie I/O
Załóżmy, że masz teraz prosty plik tekstowy:
Teraz przekieruj zawartość tego pliku do innej lokalizacji:
W powyższej akcji przekierowania nie widzimy żadnego wyjścia wyświetlanego na terminalu, ponieważ polecenie > przekierowuje zawartość pliku test.txt dooutput.txt, który jest standardowym wyjściem (stdout).
W przeciwieństwie do standardowego wyjścia, istnieje standardowy błąd (stdr), np.
Podczas procesu przekierowania wystąpił błąd, ponieważ w bieżącym katalogu nie ma pliku o nazwie brak_takiego_pliku.txt. W tym przypadku, mimo użycia polecenia >, nie jest możliwe wpisanie zawartości do pliku output.txt, ponieważ nie ma tam zawartości stdout, lecz komunikat błędu stderror.
Deskryptor pliku
Deskryptor pliku może być traktowany jako dodatnia liczba całkowita dla otwartego pliku. Jeśli masz 100 otwartych plików, w zasadzie masz 100 odpowiadających im deskryptorów plików.
W systemach Unix/Unix-like, istnieją również deskryptory plików dedykowane dla stdout i stderr, które, aby było jasne, mają dedykowane miejsca docelowe dla wyjścia tychdla tych miejsc docelowych wyjścia:
- 1: dla stdout
- 2: dla stderr
Połączenie wszystkiego razem
Zgodnie z powyższą koncepcją, jeśli chcesz zapisać zawartość znanego pliku do innego pliku, możesz to zrobić
Cyfra 1 po tej stronie reprezentuje stdout, którego składnia jest reprezentowana jako:
- >
Więc kiedy widzisz, że ktoś pisze from.foo > to.bar, to po prostu pomija znak
Podobnie, aby przekierować stderr możesz zrobić tak:
Jeśli chcesz przekierować zarówno stdout jak i stderr do tego samego miejsca docelowego, możesz zrobić tak
.
- &1 jest używane jako odwołanie do deskryptora pliku o id równym 1, czyli odwołanie do stdout.
- 2>&1 oznacza przekierowanie zawartości stderr na stdout.
Podsumowanie
- Zazwyczaj istnieją dwa miejsca docelowe dla wyjścia: stdout i stderr.
- Możemy kierować wyjście do różnych miejsc, ale zazwyczaj do pliku.
- Deskryptor pliku może być użyty do rozróżnienia między stdout (1) i stderr (2).
- polecenie > output_location jest w rzeczywistości skrótem polecenia 1> output_location.
- Możemy używać & do odwoływania się do innych deskryptorów plików.