UNIX — универсальная среда программирования | страница 29



То же самое

>$ rm temp[a-z]     Удалить все tempa, …, tempz

Шаблон >? задает любой одиночный символ:

>$ ls ?        Список файлов с именем из одного символа

>$ ls -l ch?.1 Список ch1.1 ch2.1 ch3.1 и т.д., но не ch10.1

>$ rm temp?    Удалить все файлы temp1, …, tempa и т.д.

Отметим, что шаблоны сопоставляются только с именами существующих файлов. В частности, нельзя создать новые имена файлов с помощью шаблонов. Например, если вы захотите расширить >ch до >chapter в каждом имени файла, то такой вариант вам не поможет:

>$ mv ch.* chapter.* Не работает!

поскольку >chapter.* не соответствует ни одному из существующих имен файлов.

Символы шаблонов, подобные >*, могут использоваться в абсолютных именах наравне с обычными именами файлов; сопоставление происходит для каждого компонента абсолютного имени, содержащего специальный символ. Так, >/usr/mary/* инициирует поиск файлов в >/usr/mary/, a >/usr/*/calendar порождает список абсолютных имен всех пользователей, работающих с каталогом >calendar.

Если вам когда-нибудь придется отказаться от специального назначения символов >*, >? и др., заключите весь аргумент в апострофы, например:

>$ ls '?'

Можно также предварить специальный символ обратной дробной чертой:

>$ ls \?

(Вспомните, что, поскольку >? не является символом стирания или уничтожения, обратная дробная черта перед ним будет обрабатываться не ядром, а интерпретатором >shell.) Использование кавычек подробно рассматривается в гл. 3.

Упражнение 1.4

В чем состоит различие между следующими командами:

>$ ls junk  $ echo junk

>$ ls /     $ echo /

>$ ls       $ echo

>$ ls *     $ echo *

>$ ls '*'   $ echo '*'

Переключение ввода-вывода

Большинство команд, которые мы рассматривали, производят вывод на терминал, некоторые из них, подобно редактору, осуществляют ввод с терминала. А теперь приведем почти универсальное правило: терминал может быть заменен для ввода, вывода или обеих операций на файл.

Например,

>$ ls

выдает список файлов на ваш терминал. Но если задать

>$ ls > filelist

то тот же список файлов помещается вместо этого в файл >filelist. Символ >> означает, что выходной поток должен быть помещен в указанный далее файл, а не выведен на терминал. Файл будет создан, если он ранее не существовал, или будет заменено содержимое старого. На своем терминале вы ничего не получите. В качестве другого примера можно слить несколько файлов, "перехватив" выходной поток команды >cat и направив его в файл:

>$ cat f1 f2 f3 > temp

Символ >>>