logo [8kb]
Strumienie danych

Strumienie danych

Każdy uruchomiony w Linuxie proces skądś pobiera dane, gdzieś wysyła wyniki swojego działania i komunikaty o błędach. Tak więc procesowi przypisane są trzy strumienie danych:
  • stdin (ang. standard input) czyli standardowe wejście, skąd proces pobiera dane, domyślnie jest to klawiatura
  • stdout (ang. standard otuput) to standardowe wyjście, gdzie wysyłany jest wynik działania procesu, domyślnie to ekran
  • stderr (ang. standard error) standardowe wyjście błędów, tam trafiają wszystkie komunikaty o błędach, domyślnie ekran
Rys.Strumienie danych
stream.gif

Linux wszystko traktuje jako plik, niezależnie od tego czy to jest plik zwykły, katalog, urządzenie blokowe (klawiatura, ekran) itd. Nie inaczej jest ze strumieniami, BASH identyfikuje je za pomocą przyporządkowanych im liczb całkowitych ( od 0 do 2 ) tak zwanych deskryptorów plików.
I tak:
  • 0 to plik z którego proces pobiera dane stdin
  • 1 to plik do którego proces pisze wyniki swojego działania stdout
  • 2 to plik do którego trafiają komunikaty o błędach stderr
Za pomocą operatorów przypisania można manipulować strumieniami, poprzez przypisanie deskryptorów: 0, 1, 2 innym plikom, niż tym reprezentującym klawiaturę i ekran.

  • Przełączanie standardowego wejścia

    Zamiast klawiatury jako standardowe wejście można otworzyć plik:

    < plik

    Przykład:

    Najpierw stwórzmy plik lista o następującej zawartości:

    slackaware
    redhat
    debian
    caldera
    
    Użyjemy polecenia sort dla którego standardowym wejściem będzie nasz plik.

    sort < lista

    Wynikiem będzie wyświetlenie na ekranie posortowanej zawartość pliku lista:

    caldera
    debian
    redhat
    slackware
    
  • Przełączanie standardowego wyjścia

    Wynik jakiegoś polecenia można wysłać do pliku, a nie na ekran, do tego celu używa się operatora:

    > plik

    Przykład:

    ls -la /usr/bin > ~/wynik

    Rezultat działania polecenia ls -la /usr/bin trafi do pliku o nazwie wynik, jeśli wcześniej nie istniał plik o takiej samej nazwie, to zostanie utworzony, jeśli istniał cała jego poprzednia zawartość zostanie nadpisana.

    Jeśli chcemy aby dane wyjściowe dopisywane były na końcu pliku, bez wymazywania jego wcześniejszej zawartości, stosujemy operator:

    >> plik

    Przykład:

    free -m >> ~/wynik

    Wynik polecenia free -m (pokazuje wykorzystanie pamięci RAM i swap'a) zostanie dopisany na końcu pliku wynik, nie naruszając jego wcześniejszej zawartości.

  • Przełączanie standardowego wyjścia błędów

    Do pliku można też kierować strumień diagnostyczny:

    2> plik

    Przykład:

    #!/bin/bash
    
    echo "Stderr jest skierowane do pliku error"
    ls -y 2< ~/error    #błąd
    
    W powyższym skrypcie polecenie ls jest użyte z błędną opcją -y, komunikat o błędzie trafi do pliku error.

    Za pomocą operatora:

    << plik

    można dopisać do tego samego pliku kilka komunikatów o błędach, dopisanie kolejnego nie spowoduje skasowania wcześniejszej zawartości pliku.

    Przykład:

    #!/bin/bash
    
    echo "Stderr jest skierowane do pliku error"
    ls -y 2> ~/error             #błąd
    cat /etc/shadow 2> ~/error   #błąd2
    
    Jako błąd drugi zostanie potraktowane polecenie cat /etc/shadow (zakładając, że zalogowałeś się jako użytkownik) ponieważ prawo odczytu pliku /etc/shadow ma tylko root.

[ Index ]