Wejście i wyjście standardowe oraz wyjście standardowe błędów
Procesy (uruchomione programy) w trybie tekstowym mają od początku działania
przyporządkowane trzy otwarte deskryptory:
- 0 - wejście standardowe (standard input, stdin)
- 1 - wyjście standardowe (standard output, stdout)
- 2 - standardowe wyjście błędów (standard error output, stderr)
Przez domniemanie wejście standardowe skojarzone jest z klawiaturą terminala, zaś wyjście
standardowe i standardowe wyjście błędów z oknem tekstowym terminala. Dlatego też
pojawiają się w nim zarówno użyteczne wyniki działania programów, jak i komunikaty o
błędach.
Przekierowania
Domniemane przyporządkowanie deskryptorów można zmienić (na przykład chcąc
wprowadzić z pliku dużą ilość danych lub zapisać w pliku dużą ilość wyników) przy użyciu
operatorów przekierowania:
program < plik
-wejście standardowe procesu zostanie skojarzone z danym plikiem (uwaga:
plik musi istnieć)
program > plik
-wyjście standardowe procesu zostanie skojarzone z danym plikiem. Jeżeli plik
nie istniał, będzie utworzony (jako pusty plik). Jeżli plik już istniał, jego dotychczasowa
zawartość zostanie usunięta (nadpisana)
program >> plik
-wyjście standardowe procesu zostanie skojarzone z danym plikiem. Jeśli plik
nie istniał, będzie utworzony (jako pusty plik). Jeśli plik już istniał, jego dotychczasowa
zawartość nie zostanie usunięta (proces będzie dopisywał do niej swoje wyniki)
program 2> plik
-standardowe wyjście błędów procesu zostanie skojarzone z danym plikiem.
Jeśli plik nie istniał, będzie utworzony (jako pusty plik). Jeśli plik już istniał, jego
dotychczasowa zawartość zostanie usunięta (nadpisana)
Potok
program1 | program2
-obydwa procesy zostaną uruchomione współbieżnie, standardowe
wyjście pierwszego procesu zostanie połączone bezpośrednio ze standardowym wejściem
drugiego procesu
UWAGA: powyższe operatory przekierowań i potoku mogą być wykorzystywane
jednocześnie w linii poleceń, służąc do konstruowania poleceń złożonych.
ZADANIA:
1. Przy użyciu polecenia
ls -l > plik
zapisać w pliku zawartość bieżącego katalogu.
Wyświetlić (
cat plik
), sprawdzić.
2. Użyć polecenia
cat > plik
do bezpośredniego zapisu tekstu (kilka linijek) do pliku
(
ctrl i d
kończy działanie polecenia). Sprawdzić (
cat plik
). Sprawdzić także, że ponowne
polecenie
cat > plik
nadpisuje poprzednią zawartość pliku, a polecenie
cat >> plik
dopisuje nowy tekst do poprzedniej zawartości. Wypróbować działanie samego polecenia
cat
.
UWAGA: w systemach uniksowych znak ASCII pełniący rolę standardowego znacznika
końca strumienia tekstowego (EOT - End Of Transmission) jest skojarzony z kombinacją
kluczy
ctrl i d
. W systemach Windows analogiczną rolę pełni
ctrl i z
.
3. Zapisać w pliku (przy użyciu dowolnego edytora tekstowego) ciąg kilkunastu
wyrazów - po jednym w jednej linii (nie używać polskich znaków). Wyświetlić
posortowaną listę wyrazów korzystając z polecenia
cat plik | sort
, porównać jego
działanie z działaniem polecenia
sort < plik
oraz polecenia
sort plik
. Zapisać wynik
sortowania w drugim pliku:
sort < plik > plik1
, sprawdzić (
cat plik1
). Użyć polecenia
sort > plik
do posortowania ciągu wyrazów wprowadzonego z klawiatury (
ctrl i d
kończy wpisywanie). Wypróbować działanie samego polecenia
sort
.
4. Przeczytać opisy poleceń
head
oraz
tail
. Utworzyć polecenie złożone (potok poleceń),
które pobierze od użytkownika listę nazwisk wprowadzonych z klawiatury (po jednym
w jednej linii, bez polskich znaków), posortuje ją alfabetycznie i wyświetli:
a) 5 pierwszych pozycji;
b) 3 ostatnie pozycje w posortowanym ciągu nazwisk.
6. Przeczytać opis polecenia
tee
. Wykorzystać polecenie
tee plik > plik1
do zapisu tekstu
wprowadzonego z klawiatury do dwóch plików jednocześnie. Porównać zawartości
obu plików.
7. Napisać nieduży program w języku C zawierający kilka błędów składniowych,
skompilować go przy użyciu polecenia
gcc program.c
i obejrzeć wyświetlony wykaz
błędów. Użyć przekierowania standardowego wyjścia błędów:
gcc program.c 2> plik
, obejrzeć zawartość utworzonego pliku.
8. Utworzyć program w języku C:
#include
main(){
unsigned n;
scanf("%d",&n);
printf("%d",2*n);
return;
}
Skompilować go przy użyciu polecenia
gcc program.c -o program
. Wypróbować działanie
poleceń:
a) ./program
b) ./program | ./program
c) ./program | ./program | ./program
9. Zapoznać się z możliwością używania przez proces interpretera poleceń deskryptorów
plików większych, niż 2:
echo -n abcdefghijklmn > nazwa_pliku
-zapis ciągu znaków do pliku o podanej
nazwie
cat nazwa_pliku
-sprawdzenie, że plik zawiera to, co wpisaliśmy
exec 3<> nazwa_pliku
-otwarcie pliku do zapisu i odczytu przy użyciu deskryptora 3
read -n 5 <&3
-przesunięcie miejsca bieżącego dostępu do zawartości otwartego
pliku o 5 pozycji do przodu
echo -n ABC >&3
-nadpisanie trzech kolejnych znaków w pliku innymi znakami
exec 3>&-
-zamknięcie deskryptora 3
cat nazwa_pliku
-wyświetlenie aktualnej zawartości pliku