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