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