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