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.
5. 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.
6. Napisać nieduży skrypt w Python'ie zawierający kilka błędów składniowych,
uruchomić go przy użyciu polecenia
python3 skrypt
i obejrzeć wyświetlony wykaz
błędów. Użyć przekierowania standardowego wyjścia błędów:
python3 skrypt 2> plik
, obejrzeć zawartość utworzonego pliku.
7. Utworzyć skrypt w Python'ie:
n = int(input())
print(3*n);
Wypróbować działanie poleceń:
a) python3 skrypt
b) python3 skrypt | python3 skrypt
c) python3 skrypt | python3 skrypt | python3 skrypt
8. 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