Standardowe wejście wyjście i przekierowania :: Łączenie poleceń :: Sterowanie procesami :: Działanie w tle :: Sztuczki z *[]$()?

Bash

Bash jest jednym z najpopularniejszych interpretatorów poleceń (jest on oparty na składni sh), podobnie jak inne umożliwia on zarówno pracę interaktywną (wydawanie kolejnych poleceń przez operatora systemu), jak i pracę w trybie wsadowym (czyli wykonywanie skryptów powłokowych, stanowiących zapisane w pliku tekstowym ciągi poleceń - oczym więcej w częsci poświećonej programowaniu w bash).

Praca interaktywna polega na wprowadzaniu ciągu poleceń (przy pomocy jakiejś formy klawiatury), które są wykonywane i ich wyniki widoczne są w postaci zmian w plikach/systemie plików lub w postaci komunikatów wyświetlanych na ekranie. Normalnie odpalony bash uruchamia się w trybie pracy interaktywnej, uprzednio czytając swoje pliki konfiguracyjne (m.in. ~/.bashrc - prosty przykład, bardziej rozbudowany plik zamieszczam w konfiguracja środowiska pracy). W trybie tym możemy:

Standardowe wejście wyjście i przekierowania

Do przekierowywania wejść i wyjść poleceń służą znaki:
| - przekierowanie wyjścia (polecenia z lewej strony) do programu (polecenia po prawej stronie)
> - przekierowanie wyjścia do pliku
< - pobieranie wejścia z pliku.
możliwe jest też przekierowanie stdout dwóch poleceń jako wejść plikowych - np. diff <(cat plik1) <(cat plik2). Dzięki konstrukcji exec 1> plik.txt można przekierować całe standardowe wyjście do pliku, natomiast zmienna=`cat` umożliwi wczystanie standardowego wejścia do pliku. Warto w tym miejscu wspomnieć także o programie tee, który wypisuje swoje standardowe wejście do pliku i na standardowe wyjście jednocześnie.

Łączenie poleceń

Do łączenia poleceń oprócz przekierowywania wejść i wyjść służą także inne znaki:

Polecenia możemy także grupować przy pomocy nawiasów klamrowych { polecenia; } (uwaga średnik i spacje, które możemy ewentualnie zastapić znakami nowej linii są konieczne) lub nawiasów okrągłych (polecenia), wtedy wykonywane są w podpowłoce (uruchomiony jest osobny proces basha).

Sterowanie procesami

W systemach unixowatych z uruchomionymi procesami możemy komunikować się m.in. przy pomocy sygnałów. Do ich wysyłania służy program kill. Warto jednak wspomnieć także o kombinacji klawiszy [Ctrl]+[c] wysyłającej sygnał SIGINT (nr. 2, przerwanie) oraz [Ctrl]+[/] wysyłającej sygnał SIGQUIT (nr. 3, zakończenie programu). Jeżeli jest już mowa o kombinacjach specjalnych kończących działanie programu to trzeba wspomnieć też o [Ctrl]+[d] wysyłającej znak ASCII o numerze 4 czyli EOT (koniec transferu) czyli informację o końcu wprowadzania danych tekstowych (nie jest to EOF ani ETX mające podobne znaczenie). Kombinacja ta wprowadzana np. w bashu kończy jego działanie.

Działanie w tle

Celem uruchomienia polecenia w tle podajemy na końcu linii poleceń znak &. Listę tak uruchomionych zadań z aktualnego shela możemy wyświetlić poprzez polecenie jobs a następnie przenieść na pierwszy plan poleceniem fg %n lub zakończyć poprzez kill %n (gdzie n jest wyświetlonym przez jobs numerem zadania). Warto też wspomnieć o kombinacji [Ctrl]+[z] (wysyłającej sygnał SIGTSTP) zawieszającej wykonywanie aktualnego programu i powodującej ponowne przejście do shela, następnie można spowodować odwieszenie i przesunięcie w tło tak przerwanego procesu poprzez bg [%n]. Procesy uruchomione w tle możemy także odłączyć od powłoki z wykorzystaniem disown.

Sztuczki z *[]$()?

Warto też wspomnieć o możliwości korzystania ze znaków wieloznacznych: * - dowolny ciąg znaków niezaczynający się od kropki, ? - dowolny jeden znak, [-xawA-F] - dowolny ze znaków wymienionych : -, x, a, w oraz przedział od A do F. Aby podejrzeć jakie pliki zostaną dopasowane do naszego wzorca polecam echo - np. echo ?[a-z]* wypisze wszystkie pliki mające na drugiej pozycji mała literę (w Unixach wielkość liter ma znaczenie).

Jest także możliwość przekazania wyniku polecenia jako parametru innego polecenia: inne_polecenie `polecenie`, jeżeli chcemy jeszcze bardziej zagnieżdzać zamiast ` w Bashu możemy używać konstrukcji z $(), np. inne_polecenie $(polecenie).

Przy użyciu podwójnych nawiasów możemy korzystać z wbudowanej prostej arytmetyki stałopozycyjnej - echo $((2+2)) wypisze 4. Podobnie działają też pojedyncze nawiasy kwadratowe - np. echo $[2+2] wypisze 4, należy jednak pamiętać iż metoda z nawiasami kwadratowymi (w odróżnieniu od okrągłych) jest nieprzenośna na inne sh. Prostą artmetykę można realizować także przy pomocy polecenia let - np. let zm++ zwiększy wartość zm o jeden, jednak jest to równierz metoda nieprzenośna na inne sh. Do bardziej zaawansowanej matematyki wykorzystać można program bc - echo "2+2" | bc robi to samo ... (więcej man 1 bc).

Kolejną sztuczką jest wbudowane przetwarzanie napisów przy pomocy {%}, np. echo ${PATH%:*} wybisze zawartość zmiennej $PATH bez ostatniego członu (po ostatnim :), proktycznym zastosowaniem może być np. masowa zamiana rozszerzeń plików for f in *.txt ; do mv "$f" "${f%.txt}.htm"; done. Inne zastosowanie klamerek (podstawienia wielkrotne każdy z każdym) pokazuje echo A{7,8}X{1,2}. Warto także wspomnieć o różnicy między echo $zmienna a echo "$zmienna", gdy zmienna zawiera znaki nowej linii (w pierwszym wypadku zostaną ope zastąpione spacjami). Więcej o tego typu sztuczkach w części o zmiennych.



Copyright (c) 1999-2015, Robert Paciorek (http://www.opcode.eu.org/), BSD/MIT-type license


Redystrybucja wersji źródłowych i wynikowych, po lub bez dokonywania modyfikacji JEST DOZWOLONA, pod warunkiem zachowania niniejszej informacji o prawach autorskich. Autor NIE ponosi JAKIEJKOLWIEK odpowiedzialności za skutki użytkowania tego dokumentu/programu oraz za wykorzystanie zawartych tu informacji.

This text/program is free document/software. Redistribution and use in source and binary forms, with or without modification, ARE PERMITTED provided save this copyright notice. This document/program is distributed WITHOUT any warranty, use at YOUR own risk.

Valid XHTML 1.1 Dokument ten (URL: http://www.opcode.eu.org/debian_and_posix/bash) należy do serwisu OpCode. Autorem tej strony jest Robert Paciorek, wszelkie uwagi proszę kierować na adres e-mail serwisu: webmaster@opcode.eu.org.
Data ostatniej modyfikacji artykulu: '2015-10-04 07:47:50 (UTC)' (data ta może być zafałszowana niemerytorycznymi modyfikacjami artykułu).