Deskryptor pliku skryptu powłoki

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:

Aprosty plik tekstowy.

Teraz przekieruj zawartość tego pliku do innej lokalizacji:

Przekieruj zawartość pliku.

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.

Błąd wystąpił podczas6082>Podczas procesu przekierowania wystąpił błąd.

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ć

Przekieruj zawartość pliku do innej lokalizacji przezstdout.

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:

Przekierowanie komunikatu o błędzie do innej lokalizacji przez stderr.

Jeśli chcesz przekierować zarówno stdout jak i stderr do tego samego miejsca docelowego, możesz zrobić tak

Przekierowanie stderr do tej samej lokalizacji co stdout.

.

  • &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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.