Os2

Програмиране на команден език в UNIX и LINUX. Метасимволи

Забележка : не се чете! означава, че записките са нечетливи

Метасимволи - символи във специално значение за shell.Интерпретира се по специалне начин е определен контекст
интерпретиране == "заместване"(често), "разширение" (пак често)
"екраниране" на метасимволи - отмяна на специалното значение

Групи метасимволи:
1) имена на файлове
2) пренасочване на вход/изход и конвейер
3) режим на изпълнение на команда
4) групиране на команди
5) променливи
6) аритметично разширение

1) Генериране на списък от имена на файлове (Pathname expansion)
дума, съдържаща "*", "?", "[", "]" се интерпретира като шаблон и се записва с азбучноподреден списък от filenames в текущ/указан каталог.
"дума" - последователност от символи без whitespace (" ", "\t", "\n")

  • - произволен брой произволен символ (включва "скрити" символи)

? - един произволен символ
[abc]/[a-c] - един от изброените символи
[^abc] - един символ, неизброен тук (може и ! в някои shell-ове)
^/! - първи символ в низа

Ако текущият каталог съдържа
.bashrc a.o b.1.2 c f f1 fb file.c
f* -> f f1 fb file.c
*c -> c file.c
f? -> f1 fb
?b* -> fb
[ab]* -> a.o b.1.2
[a-c]* - > a.o b.1.2 c
[^ab]* -> c f f1 fb file.c

метасимволите не се разширяват до точка в началото на името .bashrc
*/? не се разширяват до "/"

думата със специални символи се разширява до списък от файлови имена и след това се изпълнява викнатата команда

/home/students/student/f*

2) пренасочване на вход/изход - всяка команда може да използва стандартен вход, изход, изход за грешки

команда < файл -> stdin се пренасочва към файл
команда > файл -> stdout се пренасочва и презаписва файла (overwrite)
команда » файл -> stdout се пренасочва и добавя в края на файла
команда 2> файл -> stderr се пренасочва с overwrite
команда 2» файл -> stderr се пренасочва с append

3те файла стандартно са свързани с екран(терминал), ***, екран. Пренасочване - може да се пренасочи към нещо,различно от терминал (напр. файл)
2>, 2» : Когато процес (отваря?/използва?) файл, той връща "файлов дескриптор" (int >= 0).
Той служи за идентификатор на файла (отворен? файл) стойности 0,1,2 - stdin, stdout, stderr

0/<, 1>, 1» подразбива се

Обща конструкция
[n] < файл -> n е дескриптор, default 0, отворен за вход
[n] > файл -> default 1, отворен за изход
»

Трябва дескриптора да е отворен за четене/писане съответно
[n] >&m -> default 1,при файлови дескриптори за изход, изходите по двата дескриптора се сливат
n, m -> отворен от един и същ процес
"сливат" - пренасочва се изхода от filedesc n към ?мястото, кудето е записан m

ls dir1 > dllist
1. date > logfile // дата, време от system clock
who » logfile // кой работи в системата в момента(сесии)
write student < letter // aко student работи в системата праща му се от letter
cc prog.c 2> errorlist // компилира се prog, грешките отиват в errorlist
find / -name core -print >clist 2> /dev/null
find /-name -core -print >clist 2>&1

1. създаване logfile с дата, време и сисък от сесии

find търси (и намира) файлове и прави нещо с тях
find / -name core -print >clist 2>/dev/null
// намери в root filesystem файл с име core, изпечатай в stdout, който е пренасочен в clist, a stderr - в /dev/null

/dev/null = черна дупка
find / -name core -prrint >clist 2>&1

// прави същото, но stdout и stderr сочат в clist; stderr се слива със stdout;
& - указва,че 1 e дескриптор, а не име на файл

Конвейер (Pipeline)

команда 1 | команда 2 [| команда 3] …

stdout на команда1 се пренасочва към stdin на команда2 и т.н

ls | wc - l // wc -word count
who | wc - l
who | grep "student" | wc - l
who | grep "student" | tee usrlist | wc - l

pipeline - реализиран чрез механизъм не се чете!
wc - пример за команда филтър

wc - l file1 file2 …

ls | wc - l // извежда файлове в каталог
who | wc - l // извежда брой сесии

grep |…| име_на_файл // търси във файла

who | grep "student" | wc - l // извежда колко сесии има потребител student
tee - специално направен за конвейер

tee file // чете от stdin, записва в stdout и едновременно във файл

who | grep "student" | tee usrlist | wc - l // извежда на екрана брой сесии на student, в usrlist - брой сесии

3) Фонов режим (асинхронен, background)

команда &

background - не се чете! пуска изпълнение на команда и не чака тя да завърши, а продължава работа.
По премълчаване командите са в режим forground. За български "&" накрая на реда. Ако командата използва stdin, той трябва да бъде пренасочен ( обикновено не й се позволява,
понеже ядрото не знае дали от stdin се въвежда за shell или за команда ). Същото се препоръчва за stdout и stderr. Ако процес опита от български да чете, не му се позволява изпада
в състояние stop.

cc bigprog.c 2>errlist &

При завършване процес, към процеса shell се връща exit status (ако е в режим forground). Exit status има стойности от 0 до 255. Стойност, различна от 0 означава неуспех.
grep връща 0, ако намери файл , други , ако не намери файл, друго, ако нямаме права и т.н
Повечето команди са изпълними файлове.

Конвейерът връща exit status на последната команда. Ако изгърми някоя междинна команда, връща exit status на командата.

4) Списък от команди
- последователмо изпълнение : команда 1 ; команда 2 [; команда 3]
- асинхронно изпълнение: команда 1 & команда 2 [& команда 3] … [& …]
- условно изпълнение: команда 1 && команда 2
команда 1 || команда

";" се интерпретира като нов ред
"&" указва, че командите работят на български. Ако накрая на реда има "&", то последната команда не се изчаква.

Условно изпълнение

команда 1 && команда 2 // команда 1 се изпълнява винаги

за &&: ако команда 1 върне 0, команда 2 се изпълнява, иначе не се изпълнява.
за ||: ако команда 1 НЕ върне 0, команда 2 се изпълнявa, иначе не се изпълнява.

Списъкът се интерпретира отляво надясно:
"&&" == "||" > "&" == ";" по приоритет

Скоби

{списък_команди; } и (списък_команди)

() създава subshell и той изпълнява списъка от команди; {} не.

" " - много важен символ. Shell e чувствителен към интервали.

{ списък; }
( списък[;])

Примери:

cmp - s f1 f2 && rm f2 // cmp сравнява побайтово файлове; aко f1 == f2, търси f2.

cmp - s f1 f2 { rm f2; mv f1 fa;} // същото, но търси и копира

grep "^ivan:" /etc/passwd 2>/dev/null || echo "No user ivan" // търси ред, започващ с "ivan"; ако няма, изписва, че няма такъв потребител (ако има, отпечатва го на екрана)

{ date; who; } > logfile // стандартните изходи на date и who се пренасочват към logfile

{cat dlist; ls dir 2;} | wc - l // брой редове; в cat и dir изходът се обединява

В конвейера може да има цял блок команди.
(cd dir; …) // извършва се временна промяна в контекста на shell (става в subshell)

(sleep 100; {date; who; } > logfile ) & // 100 секунди бездействие, след което в logfile се изписва date и who; скоби се използват, за да се укаже, че не цял списък да сe обработи в subshell

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License