8.2. Командная строка

8.2.1. Запуск программ

Трудно достичь нужного результата, не запуская программы. Вы, конечно, можете сделать из своего компьютера подставку для чего-нибудь или подпереть им дверь, чтобы она не закрывалась, а кому-то может быть нравится шум вентиляторов в корпусе. Никто не запрещает вам делать этого. И я думаю, что все согласятся с тем, что использование компьютера в качестве жужжащей подставки для маминых цветов - это не то, за что ПК получили популярность, которой они могут сейчас похвастаться.

Итак, помните, что почти всё в Linux является файлом? Это также относится и к программам. Каждая команда, которую вы запускаете (если только она не встроена в командный процессор), представляет собой файл, находящийся где-то в системе. Вы запускаете программу, просто указывая полный путь к ней.

Например, помните команду su из последнего раздела? На самом деле она находится в каталоге /bin: /bin/su точно так же запустит её.

Однако почему тогда работает просто команда su? Ведь вы не указывали, что она находится в /bin. Она с таким же успехом может находиться и в /usr/local/share, не так ли? Как шелл об этом узнал? Ответ на этот вопрос заключается в переменной окружения PATH (путь). В большинстве командных процессоров используется PATH или что-то очень похожее на эту переменную. Как правило в ней содержится список каталогов, в которых выполняется поиск запускаемых вами программ. Поэтому, когда вы запускали su, ваш шелл прошёлся по списку этих каталогов, проверив в них наличие исполняемого файла su, который бы он смог запустить. Первый найденный файл и был запущен. Это происходит и в том случае, если вы запускаете программу без указания полного пути к ней. Если вы получите ошибку типа ““Command not found”” (““Команда не найдена””), это означает только то, что программы, которую вы пытаетесь запустить, нет в вашей переменной PATH. (Естественно, это произойдёт также в том случае, если программы вообще не существует...) Более детально мы рассмотрим переменные окружения в Разд. 8.3.1.

Помните также, что “.” (точка) является условным обозначением текущего каталога, поэтому, если вы окажетесь в каталоге /bin, ./su будет работать так, как если бы вы указали полный путь.

8.2.2. Шаблоны подстановки

Практически все командные процессоры воспринимают некоторые символы как замену или аббревиатуру, вместо которых может подставляться всё что угодно. Такие символы называются шаблонами подстановки или масками (wildcard); наиболее общими являются * (звёздочка) и ?. По общепринятому соглашению ? обычно означает один произвольный символ. Например, допустим, что вы находитесь в каталоге с тремя файлами: 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; команда 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

Я знаю, о чём вы сейчас подумали: “А как насчёт букв?” В Linux регистр символов имеет значение, т.е. a и A - это разные символы, и связь между ними присутствует только в вашем уме. Прописные символы всегда следуют перед строчными, поэтому A и B идут перед a и b. Вернёмся к нашему примеру. Если нам нужны файлы a1 и A1, мы легко можем найти их с помощью шаблона [ ].

% 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. Эта часть не слишком интересна. Более интересной частью является > blargh, которая выражается, грубо говоря, в следующем: взять вывод команды ps и записать его в файл blargh. Однако подождите, можно сделать ещё круче.

% ps | less

В этой команде вывод ps перенаправляется по конвейеру (pipe) в программу less, чтобы вывод можно было просмотреть в более удобном виде.

% ps >> blargh

Это третье из наиболее часто используемых перенаправлений; оно выполняет то же самое, что и “>”, но за тем исключением, что “>>” добавит вывод команды ps к файлу blargh, если этот файл существует. В противном случае будет создан файл как и в случае с перенаправлением “>” (“>” уничтожает текущее содержимое файла blargh.)

Также ещё существует оператор “<”, который означает “взять входные данные из следующего файла”, однако он используется не так уж и часто.

% fromdos < dosfile.txt > unixfile.txt

Перенаправления проявляются во всей своей красе, когда вы начинаете комбинировать их:

% ps | tac >> blargh

При этом будет выполнена команда ps, изменён порядок строк её вывода, а результат добавлен в конец файла blargh. Вы можете комбинировать сколько угодно таких перенаправлений, однако помните, что интерпретируются они слева направо.

Дополнительную информацию о перенаправлении смотрите на странице руководства bash(1) .