Przekierowania i potoki, standardowe wejście i wyjście procesu

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