stdin, stdout, stderr Każde polecenie w UNIX

Transkrypt

stdin, stdout, stderr Każde polecenie w UNIX
stdin, stdout, stderr
Każde polecenie w UNIX-ie ma dostęp do trzech funkcji systemowych:
standardowe wejście (standard input - stdin)
standardowe wyjście (standard output - stdout)
standardowe wyjście diagnostyczne (standard error output - stderr)
Stosowanie standardowych strumieni jest wygodne, gdyż można je łatwo przypisać plikom lub potokom. Operatorem przekierowania (przeadresowania) standardowego wyjścia jest znak >. Standardowego
wyjście diagnostyczne przekierowujemy używając 2>. Standardowe wejście przeadresowujemy znakiem
<. Proszę prześledzić poniższe polecenia:
ls > lista
cat plik 1 > plik 2
man ls > pomoc
wc < lista
cal 2002 > tenrok
Polecenie pierwsze spowoduje zapisanie w pliku lista nazw plików i katalogów z katalogu bieżącego.
Polecenie drugie spowoduje zapisanie zawartości pliku plik 1 do pliku plik 2. Trzecie polecenie spowoduje umieszczenie wyniku polecenia man ls w pliku pomoc, tzn. umieszczenie pomocy do polecenia
ls w pliku pomoc. Czwarte polecenie da nam w wyniku liczbę wierszy, słów i znaków w pliku lista. W
ostatnim przykładzie kalendarz wygenerowany przez polecenie cal zostanie zapisany w pliku o nazwie
tenrok
Shell (powłoka) ustawia przeadresowanie przed uruchomieniem polecenia, po czym usuwa znaki przeadresowania z polecenia tak, że samo polecenie ich nie widzi. Trzy poniższe polecenia są równoważne:
cal 2002 > tenrok
cal > tenrok 2002
> tenrok cal 2002
> jest skrótem od 1>, stąd następujące dwa polecenia są równoważne:
cal 2002 > tenrok
cal 2002 1> tenrok
Przy stosowaniu operatora > pierwotna zawartość plików docelowych (np. lista, plik 2, pomoc) zostanie skasowana. Jeżeli nie chcemy utracić pierwotnej zawartości pliku docelowego używamy operatora
dopisywania >>. Np. polecenie man cd >> pomoc spowoduje dopisanie do pliku pomoc objaśnienia polecenia cd. Proszę prześledzić poniższy przykład:
ls > lista
who am i >> lista
wc < lista > wc lista
prześlij wynik polecenia ls do pliku lista;
dopisz dane o użytkowniku do pliku lista;
zlicz wiersze, słowa i znaki w pliku lista i umieść wynik w
pliku wc lista.
Komunikaty o błędach można zapisywać niezależnie od standardowego wyjścia używając operatora 2>
polecenie
polecenie
polecenie
polecenie
2> polecenie.bledy
> log 2> bledy
2> bledy > log
> log
W przypadku 1 standardowe wyjście nie zostało przeadresowane i zostanie wyprowadzone na ekran,
podczas gdy ewentualne komunikaty o błędach zostaną zapisane w pliku polecenie.bledy i nie pojawią
1
się na ekranie. W przypadku 2 standardowe wyjście zostanie przeadresowane do pliku log, a standardowe wyjście diagnostyczne do pliku bledy. Polecenie 3 jest równoważne poleceniu 2. W przypadku
4 standardowe wyjście diagnostyczne nie zostało przeadresowane i ewentualne komunikaty o błędach
zostaną wyświetlone na ekranie.
Aby zapisać standardowe wyjście i standardowe wyjście diagnostyczne w tym samym pliku, należy przeadresować standardowe wyjście diagnostyczne przy użyciu 2>&1:
polecenie > polecenie.wynik 2>&1
2>&1 musi być wpisane po przeadresowaniu w wierszu poleceń standardowego wyjścia. 2>&1 oznacza
przeadresowanie standardowego wyjścia diagnostycznego tam, gdzie idzie standardowe wyjście.
Ćwiczenie
Utwórz plik tekstowy o nazwie polecenie i następującej treści:
#!/bin/zsh echo "serdecznie witamy gospodarza domu"
kiszka
Nadaj mu prawa wykonywania poleceniem chmod a+x polecenie. Teraz plik polecenie jest tak zwanym skryptem napisanym w języku powłoki. Wykonaj polecenie file polecenie aby dowiedzieć się jakiego typu jest plik polecenie. Plik polecenie uruchamiamy wpisując w wierszu poleceń ./polecenie.
Wynikiem działania pliku polecenie jest wypisanie na standardowym wyjściu tekstu serdecznie witamy
gospodarza domu oraz wysłanie na standardowe wyjście diagnostyczne komunikatu o błędzie związanego z nie zdefiniowaną instrukcją kiszka.
Korzystając z polecenia ./polecenie przećwicz użycie opisanych w instrukcji operatorów przeadresowania.
Potoki i filtry
Standardowe wyjście z jednego polecenia może być przeadresowane jako standardowe wejście dla innego
polecenia, tworząc potok z jednego polecenia do drugiego. Do tworzenia potoków służy pionowa kreska
|.
Na przykład poniższe polecenie spowoduje wyświetlenie na ekranie zawartości pliku pomoc strona po
stronie.
cat pomoc | pg
tee - rozwidlenie standardowego wyjścia procesu
W UNIX-ie potok tee wysyła zduplikowane dane jednocześnie na standardowe wyjście i do podanego
pliku.
polecenie | tee plik1
W tym przypadku wyjście z polecenia polecenie zostaje zapisane w pliku plok1, a jednocześnie te
same dane są wyprowadzane na standardowe wyjście.
Poniższy przykład pokazuje, że w jednym potoku można użyć tee wielokrotnie.
file * | tee pliki | sort | tee posortowane
W wyniku wykonania powyższego polecenia powstaną dwa pliki: pliki, zawierający listę sklasyfikowanych plików oraz plik posortowane, zawierający tę samą listę uporządkowaną (posortowaną) alfabetycznie.
Sortowanie oznacza układanie wierszy tekstu w kolejności alfabetycznej.
sort plik1 plik2 > plik3
połączy pliki plik1 i plik2 posortuje i zapisze w pliku plik3
sort działa na podstawie wartości ASCII znaków w poszczególnych wierszach. Z kolejnością znaków w
tablicy ASCII można się zapoznać wpisując w linii poleceń man ascii.
Niektóre opcje polecenia sort:
2
-b
ignorowanie spacji na początku wierszy
-n
sortowanie numeryczne
-f
nie uwzględnia wielkości liter
-d
ignorowanie znaków interpunkcyjnych
-r
sortowanie w odwróconej kolejności
Przykład
Polecenie ls -s wyświetla listę wszystkich plików w bieżącym katalogu, wraz z rozmiarem podanym w
blokach. Gdy plików jest więcej trudno wyszukać największe z nich. Można przeadresować listę plików
do polecenia sort, żeby posortowało je kolejności malejącej.
ls -s | sort -rn
Polecenie sort traktuje każdy ciąg spacji lub tabulatorów jako początek nowego pola. Jeśli chcemy,
żeby sort ignorował lub opuszczał niektóre pola w wierszu, należy użyć opcji +n, gdzie n oznacza liczbę
pól do zignorowania.
Przykład
Polecenie ls -l dało w wyniku:
total 3
-rwx------ 1 kazio stud
-rwx------ 1 kazio stud
-rwx------ 1 kazio stud
15346 Jun
5346 Jun
17346 Feb
1 12:32 plik1
2 11:15 plik2
1 10:17 plik3
Chcemy wyświetlić te pliki w kolejności rosnącej względem rozmiaru w bajtach tj. czwartego pola. W
tym celu musimy użyć następującego polecenia:
ls -l | sort -n +4
Ćwiczenie
Wykonaj powyższy przykład na swoim katalogu macierzystym.
Przykład
Chcemy dowiedzieć się w ilu linijkach pliku pomoc występuje słowo ”file”. Odpowiedź uzyskamy wpisując w linii poleceń:
cat pomoc | grep file | wc -l
Objaśnienie.
wc - podaje liczbę wierszy, słów i znaków w pliku.
Składnia: wc [opcje] [plik]
Opcje:
-c
zlicza tylko znaki
-l
zlicza tylko wiersze
-w
zlicza tylko słowa
Polecenie zlicza wiersze, znaki i słowa występujące w podanym pliku. W przypadku jego braku liczy je
w strumieniu standardowego wejścia. grep - poszukiwanie wzorca w pliku.
Składnia: grep [opcje] wzorzec [pliki]
Niektóre opcje:
-c
wyświetl tylko liczbę zgodnych wierszy
-n
wyświetlaj numery wierszy
-v
wyświetlaj niezgodne wiersze
Polecenie poszukuje podanego wzorca w przeszukiwanym sekwencyjnie pliku lub w strumieniu danych
ze standardowego wejścia i przekazuje wiersze zawierające wzorzec na standardowe wyjście.
Ćwiczenie
Wpisując w linii poleceń man sort > pomoc utworzono plik pomoc Co należy wpisać w linii poleceń
aby dowiedzieć się jaka jest liczba wierszy w pliku pomoc zawierających równocześnie słowo file oraz
słowo text?
Procesy
Uruchomienie dowolnego programu poprzez wydanie polecenia powłoce powoduje utworzenie osobnego
procesu. W momencie utworzenia proces otrzymuje jednoznaczny identyfikator (PID - process iden3
tification number). Proces może zostać uruchomiony jako pierwszoplanowy lub proces w tle. Proces
w tle uruchamia się przez zakończenie polecenia znakiem & (ampersand). Stan istniejących procesów
wyświetlamy poleceniem ps. Składnia: ps [opcje].
Niektóre opcje:
-a
wszystkie procesy oprócz liderów grup
-e
wszystkie procesy w systemie
-f
długa lista informacji
-g lista
tylko te procesy, których liderzy znajdują się na liście
-l
pełna lista informacji
-u
tylko procesy należące do użytkowników na liście
lista
lista argumentów oddzielonych przecinkami lub spacjami.
Znaczenie nagłówków poszczególnych kolumn wyniku polecenia ps.
F
S
UID
PID
PPID
C
PRI
NI
SZ
WCHAN
TTY
TIME
CMD
status procesu
stan procesu (S-uśpiony, R-aktywny)
identyfikator właściciela procesu
numer procesu macierzystego
pełna lista informacji
wykorzystanie procesora
priorytet
wartość nice służąca do zmiany priorytetu
rozmiar obrazu procesu w pamięci
wydarzenie, na które proces czeka
terminal sterujący procesem
sumaryczny czas wykonania
wywołane polecenie
Ćwiczenie
Utwórz plik tekstowy o nazwie loop i następującej treści:
#!/bin/zsh while true
do
:
done
Nadaj mu prawa wykonywania poleceniem chmod a+x loop. Teraz plik loop jest tak zwanym skryptem
napisanym w języku powłoki.
Uruchom plik loop w tle wpisując w wierszu poleceń ./loop &
Po wykonaniu zostanie wyświetlona liczba - identyfikator PID utworzonego procesu. Wykonaj polecenie
ps -u <login>. Teraz zakończ proces poleceniem kill (kill -9 <PID procesu loop>).
Ćwiczenie
Uruchom plik loop jako proces pierwszoplanowy wpisując w wierszu poleceń ./loop Otwórz drugą,
równoległą sesję z systemem UNIX. Wykonaj polecenie ps -u <login> aby wyświetlić listę procesów.
Teraz zakończ proces loop poleceniem kill (kill -9 <PID procesu loop>).
Ćwiczenie
Sprawdź jaki będzie wynik zabicia aktualnej powłoki.
4

Podobne dokumenty