8.2.0 Команден промпт

8.2.1 Изпълнение на програми

Трудно е да направите нещо без да стартирате програми; бихте могли да закрепите нещо със своя компютър или да подпирате вратата, някой дори бръмчат много приятно, но това не е тяхното предзназначение. Мисля всички сте съгласни, че неговата полза като бръмчаща подпирачка за врата не го е направила толкова пополярен.

Помните ли че всичко в Линукс е файл? Е, това се отнася и за праграмите. Всяка команда която използвате (освен тези които са вградени в shell-а) съществува като файл някъде. Пускате програма просто като посочите пътят до нея.

Примерно, помните ли su командата с която се запознахме в предишната глава? Е, всищност тя е в /bin директорията: /bin/su би я пуснала също.

Тогава защо и само su работи? Все пак не казахте, че е в /bin. Спокойно можеше да е в /usr/local/share, нали? Как shell-а знаеше? Отговорът се крие в ПЪТЯ на променливата среда: повечето shell програми имат ПЪТ или поне нещо като ПЪТ. Основно съдържа лист от директории в които се търсят програмите които искате да пуснете. Значи, като напишете su, вашият shell минава през листа си от директории, проберявайки всеки един от изпълнимите файлове наречен su който може да стартира; първия до който достигне се стартира. Това се случва когато пуснете програма без да определите точния път до нея; ако получите грешката ““Command not found””, това означава само че програмата която искате да стартирате не е във вашия ПЪТ (Разбира се, това ще е истина ако програмата не съществува) Обсъждаме променливата среда с повече подробности в 8.3.1 Променливи

Помнете, че “.” е съкращение за сегашна директория, така че ако се намирате в /bin, ./su ще работи като цялостен път.

8.2.2 Глобални символи (wildcards)

Почти всички shell-ове разпознават някои символи като заместници или съкращения. Такива символи са наричани глобални символи (wildcards); най-използвани са * и ?. Въпросителният ? обикновено свързва всеки отделен символ. Примерно, да предположим че сте в директория с три файла: ex1.txt, ex2.txt, и ex3.txt. Искате да копирате всички файлове (използвайки cp командата с която се запознаваме в глава 10.5.1) в друга директория, да кажем /tmp. Е, cp ex1.txt ex2.txt ex3.txt /tmp е твърде дълго за писане. Много по-лесно е да напишем cp ex?.txt /tmp; ? ще свърже всеки от символите “1”, “2”, и “3”, и всеки фаил ще бъде копиран.

Какво казвате? Все още е твъде много за писане? Прави сте. Ужасяващо е; имаме трудови закони да ни предпазват от такива неща. За щастие, имаме и както вече споменахме, * "свързва всички символи", включително 0. Такаче ако тези три файла са единствени в директорията, можем просто да напишем cp * /tmp и всички файлове се копират. Да предположим, че има още един файл с име ex.txt и един с име hejaz.txt. Искаме да копираме ex.txt, но не и hejaz.txt: cp ex* /tmp ще свърши работа.

cp ex?.txt /tmp, разбира се, ще копира само нашите три файла: понеже няма символ в ex.txt който ? да свърже, така че няма да бъде копиран.

Друг символ са чифт скоби []. Всеки символ в скобите ще бъде възприет на мястото на [] за да се намерят съвпадения. Звучи объркващо? Не е толкова лошо. Да предположим, че имаме директория съдържаща осем файла: a1, a2, a3, a4, aA, aB, aC, и aD. Искаме да намерим само файловете завърсващи на число; [] ще ни услужи.

% ls a[1-4]
a1 a2 a3 a4

Но тези които наистина искаме са a1, a2, и a4? В предишния пример ние използвахме - да зададем всички стойности между 1 и 4. Можем и да разделим индивидуално входящите със запетайки.

% ls a[1,2,4]
a1 a2 a4

Знам какво си мислите сега, "Ами буквите?" Линукс е чувствителен към малки и големи букви, т.е а и А са различни символи и са свързани единствено в ума ви. Главните букви са винаги преди малките, така че А и B идват преди а и b. Продължаваме с предишния пример, ако искаме файловете а1, и А1, можем да ги намерим бързо с [ ].

% ls [A,a]1
A1 a1

Забележка, ако заместим с тире запетайката, ще получим грешен резултат.

% ls [A-a]1
A1 B1 C1 D1 a1

Можем и да комбинираме тире и запетайка.

% ls [A,a-d]
A1 a1 b1 c1 d1

8.2.3 Входно/изходно пренасочване

(Ето нещо готино.)

% ps > blargh

Знаете ли какво е това? Това е ps за да видим какви процеси са стартирани; с ps се запознаваме в глава 11.3 ps. но това не е най-готината част. Готината част е > blargh което, грубо казано взима изхода от ps и го записва в файл наречен blargh. Но чакаите, става по-интересно.

% ps | less

Това взима изхода от ps и го филтрира през less, така че да можем да го видим в удобен момент.

% ps >> blargh

Това е третият най-често използван препращач; прави същото като ">", с изключение на това че ">>" ще закачи изхода от ps в файла blargh, ако предполобим че файла вече съществува. Ако не, същото като ">", ще създаде нов файл. (">" ще изтрие съдържанието на blargh.)

Съществува и "<", което значи че взимате въведеното в файла, но не се занимаваме толкова разширено с него в момента.

% fromdos < dosfile.txt > unixfile.txt

Пренасочването става толкова забавно, когато започенете да го схващате;

% ps | tac >> blargh

Това ще изпълни ps, обратно на линиите от изхода му, и ще закачи тези в файл blargh. Можете да закачите колтото си искате от тези; само вниваите и помнете че се влияят от ляво и дясно.

Вижте главната страница на bash(1) за по-подробна информация около пренасочванията.


Valid XHTML 1.0 Strict