
\chapter{Первое знакомство с Linux}
\label{Linux}
\section{Здравствуй, Linux, это я.}
Теперь пора перейти от слов к делу.

Возможно, вы уже имеете опыт работы с компьютером, умеете
запускать программы в DOS. 

Поэтому, после того как я прожужжал вам все уши по поводу
сходства разных операционных систем, вы решительно подойдете
к машине, на которой установлен Linux. Но вместо привычных
голубых панелей Norton Commander или хотя бы приглашения командной
строки, вы увидите загадочное слово {\tt login:}.

Что это значит?

Дело в том, что DOS, Windows и другие однопользовательские системы,
считают, что любой, кто подошел к клавиатуре~--- полноправный хозяин
системы. Linux же~--- система многопользовательская, и первое,
что он желает выяснить, это то, кто же хочет с ним сейчас работать.

Log in по-английски означает <<запишитесь>>, точнее <<распишитесь в
журнале регистрации>>.

В ответ на это приглашение надо ввести свое имя, точнее псевдоним,
под которым вы известны данной системе. 

В системной базе данных хранится и ваше полное имя, которое используется,
например, для того, чтобы подписывать ваши письма по электронной почте.
Но для собственных целей система всегда пользуется <<прозвищем>>, которое
вам дал системный администратор.

Имя вводится маленькими буквами. Если в DOS вы можете смешивать большие
и маленькие буквы как вам захочется, то в Unix большие и маленькие
буквы различаются, и в именах, как людей, так и машин, большие буквы
почему-то использовать не принято.

{\small Для тех, кто работает с компьютером в первый раз в жизни,
поясняю, что заканчивать ввод имени, пароля и любой другой команды
в командной строке следует нажатием на клавишу Enter, соответствующей
переводу строки на пишушей машинке.}

После этого вам предложат ввести пароль.

Вам может показаться, что это паранойя, но что делать~--- современные
компьютеры еще не научились узнавать пользователей в лицо\footnote{Уже 
существуют устройства, опознающие пользователей по отпечаткам пальцев или
рисунку сетчатки глаза, но они настолько дороги, что используются только
там где безопасность~--- действительно вопрос первостепенной важности}.

Пароль при вводе не изображается на экране, чтобы никто не мог его 
посдсмотреть. 

В пароле рекомендуется использовать и большие и маленькие буквы, а желательно
еще и цифры, чтобы труднее было догадаться.

Впрочем, вы пока секретов государственной важности в ваших файлах не храните,
так что на эти предосторожности можно не слишком обращать внимание.

Важно запомнить другое: если вы ошиблись при вводе пароля, лучше не пытаться
его редактировать, а нажать Enter и дождаться пока вам предложат
ввести имя и пароль еще раз.

Если вы ошиблись при вводе имени или пароля, вы получите сообщение
{\tt Login incorrect}, после чего приглашение появится снова.

Когда вы наконец преодолели все эти трудности, появляется сообщение
<<Last Login такого-то числа, такого-то месяца такого-то года>> и
на следующей строчке~--- приглашение операционной системы.

Можно начинать работать.

\section{Осмотримся вокруг}

Вид текстового экрана Unix может испугать начинающего пользователя:
черный экран и только короткая строчка, заканчивающаяся знаком доллара,
сиротливо светится с левом верхнем углу. 

Не пугайтесь, это ненадолго. Стоит набрать на клавиатуре шесть букв и картина
волшебным образом изменится~--- вы попадете в красивый цветной мир
X Window System. Но пока попробуем сделать кое-что на этом скучном текстовом
экране.

Во-первых, посмотрим внимательнее на приглашение. Его формат меняется
от системы к системе, но я обычно настраиваю его, чтобы оно имело вид
{\verb! user@host$!} где {\tt user} это то имя, под которым вы зареистерировались

в системе, а {\tt host} имя машины. 

Можно, конечно, настроить его так, чтобы оно, как и в DOS, показывало
текущий каталог, но по-моему, знать на какой машине\footnote{В главе \ref{Nets}
описывается, как сидя за клавиатурой одной машины, работать на совершенно
 другой.} и под чьим именем вы 
работаете~--- важнее.

Теперь узнаем, в каком каталоге мы находимся. Для этого существует команда
{\tt pwd}~--- Print working directory.

\begin{verbatim}

vitus@softweyr$ pwd
/home/vitus
vitus@softweyr$ _

\end{verbatim}

Здесь я привел точную копию моего диалога с машиной, на которой я пишу эти
строки. 

Как вы видите, текущим каталогом является каталог с именем, совпадающим
с вашим именем в системе (Login name), расположенный в каталоге home.

Это ваш так называемый {\it домашний каталог}~--- та часть дерева каталогов,
которая принадлежит лично вам, и где вы можете хранить все ваши личные
файлы.

Посмотрим, что здесь уже лежит. Для этого существует команда {\tt ls}~---
List sorted.

\begin{verbatim}

vitus@softweyr$ ls
vitus@softweyr$

\end{verbatim}

Ничего нет\footnote{Как вы понимаете этот пример я придумал сам.
ведь я работаю на этой машине уже долго, и естественно у меня в домашнем
каталоге много чего лежит}? Вроде бы откуда ему здесь взяться. Ведь это
наш первый вход в систему. 

А если так?

{\small
\begin{verbatim}
vitus@softweyr$ ls -a
.              .bash_logout   .fvwmrc        .mc.ini        .rhosts
..             .bash_profile  .inputrc       .minirc.dfl    .telnetrc
.Xclients      .bashrc        .less          .pinerc        .vimrc
.Xmodmap       .dialdir       .lessrc        .profile       .xfm
vitus@softweyr$
\end{verbatim}
}

Целая куча файлов. Из того, что я написал раньше, вы можете понять
происхождение только двух из них~--- ``.'' и ``..''. Это ссылки на 
текущий и родительский каталог.

Все остальные~--- это файлы конфигурации различных программ, которые
были записаны в ваш домашний каталог, когда системный администратор
его создавал.

Почему их не было видно при первой попытке посмотреть список файлов?

Потому что их имена начинаются с точки, а это для Unix~--- признак скрытого
файла.

Зачем они здесь?

Затем, что вам может захотеться настроить любую из программ по-своему.
А поскольку вы не единственный пользователь этой машины, это право
должен иметь каждый. Поэтому у любой программы в Linux есть два
конфигурационных файла~--- общесистемный и пользовательский.

И что бы вы ни сделали со своим пользовательским файлом конфигурации,
на других пользователях это никак не отразится.

Продолжим наши эксперименты:
\begin{verbatim}
vitus@softweyr$ who
vitus    tty1    Oct 11 11:28 
vitus@softweyr$
\end{verbatim}

Команда {\tt who} показывает, кто в данный момент работает в системе
Если ваша машина не подключена к сети, то вы скорее всего увидите
примерно то, что я вам сейчас продемонстрировал.

Если же подключена, то картинка может иметь следующий вид:

\begin{verbatim}
vitus@softweyr$ who
vitus    tty1    Oct 11 11:28 
senta    ttyp0   Oct 11 10:31 (sunny.agropc.)
vitus@softweyr$
\end{verbatim}

Как вы видите, кроме меня в системе есть еще кто-то. Этот кто-то
работает за клавиатурой машины с именем {\tt sunny} и начал пользоваться
ресурсами моей машины почти за час до того, как в систему вошел я.

Можно послать этому человеку сообщение:
\begin{verbatim}
vitus@softweyr$ write senta
Привет, Сента! Надеюсь, ты оставила мне хоть немного 
ресурсов для работы? :-) oo
^D
\end{verbatim}

Символ \verb!^D! указывает здесь то место, где я нажал клавиши Ctrl-D, чтобы
объяснить команде {\tt write}, что больше я ничего вводить не хочу, и она
может завершиться.

На экране у Сенты появится при этом следующий текст:
{\footnotesize
\begin{verbatim}
Message from vitus@softweyr on tt1 at 11:36 ...
Привет, Сента! Надеюсь, ты оставила мне хоть немного ресурсов для работы? :-) oo
EOF
\end{verbatim}
}
Здесь мой символ \verb!^D! изображается как {\tt EOF}, что означает
end of file (конец файла).

Можно еще посмотреть, кто работал на машине последнее время:
{\footnotesize
\begin{verbatim}
vitus@softweyr$last -10
vitus    ttyp3        :0.0           Fri Oct 11 11:14 - 12:01 (still logged in)
vitus    ttyp3        :0.0           Fri Oct 11 11:14 - 11:14  (00:00)
vitus    tty3                        Fri Oct 11 11:03 - 11:03  (00:00)
senta    tty1                        Thu Oct 10 10:35 - 12:01 (still logged in)
vitus    ttyp0        :0.0           Wed Oct  9 20:25 - 12:01 (still logged in)
vitus    tty1                        Wed Oct  9 20:13 - 20:25  (00:11)
ira      ttyp0        :0.0           Wed Oct  9 20:11 - 20:25  (00:13)
vitus    ttyp0        :0.0           Wed Oct  9 20:11 - 20:11  (00:00)
vitus    ttyp1        :0.0           Wed Oct  9 19:27 - 12:01 (still logged in)
vitus    tty1                        Wed Oct  9 19:16 - 20:12  (00:55)

wtmp begins Wed Jul 31 11:20:02 1996
vitus@softweyr$
\end{verbatim}
}
Как вы видели, в некоторых случаях после имени команды я указываю
какие-то еще символы. В команде {\tt write} это было имя пользователя,
которому я хотел послать сообщение, в команде {\tt last}, как вы можете
догадаться~--- количество последних входов в систему, которые я хотел увидеть,
а в команде {\tt ls}, когда я хотел посмотреть скрытые файлы~--- нечто совсем
загадочное.

Эта загадочная комбинация {\tt -a} называется {\it ключом} команды ls.
Программы могут иметь {\it параметры} и {\it ключи}. 

Параметр обычно указывает программе, с чем ей работать. Например,
имя пользователя в команде {\tt write}~--- это параметр. 
А ключ тем или иным способом меняет поведение команды. Например, ключ {\tt -a}
указывает {\tt ls}, что нужно показывать все (all) файлы, в том числе и скрытые,
а ключ {\tt -10} в {\tt last}~--- что я хочу увидеть только последние 10
записей. 

Ключи традиционно начинаются со знака ``-''\footnote{
В DOS ситуация несколько 
интереснее~--- встроенные команды понимают в качестве признака ключа
дробную черту, а многие другие, особенно те, которые сначала были написаны
для UNIX, а потом перенесены в DOS~--- минус. В результате у разных
пользователей возникают разные привычки, поэтому многие программы
понимают в качестве признака ключа и тот и другой символ.
}.

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

Эта подсказка вызывается командой {\tt man}, которая происходит от
английского слова manual (руководство) и требует одного обязательного
параметра~--- имени команды, руководстово по которой вы хотите получить.

Например {\tt man ls} позволит вам узнать все о том как можно просмотреть
список файлов\footnote{Признаюсь честно, {\it всего} я не знаю. Я запомнил
только самые основные возможности, а если мне вдруг понадобится какая-то
еще, честно полезу в man.}.

Описание одной команды в man называется <<страницей>> (manual page). 
Не обольщайтесь этим названием, далеко не каждая команда Unix может быть
описана на одной странице. Если распечатать, например, manual page для
командного процессора, получится целая брошюра.

Кстати, а как распечатать страницу manual, список файлов каталога 
или просто текст?

Для этого предназначена команда {\tt lpr}

Если вам надо распечатать файл, то можно просто указать его имя в
качестве параметра. 
\begin{verbatim}
vitus@softweyr$ lpr myfile.txt
vitus@softweyr$
\end{verbatim}

А если надо распечатать вывод программы?
Тогда это делается так:
\begin{verbatim}
vitus@softweyr$ ls -al|lpr
\end{verbatim}
Здесь мы сталкиваемся с понятием {\it трубопровода} (pipe), которому
ниже посвящен целый раздел (\ref{pipes}).

Общий принцип такой: если вы не хотите читать вывод какой-либо программы
сами, а хотите поручить это другой программе, поставьте после команды
вертикальную черту, а после нее~--- ту команду, которая должна это читать.

В частном случае {\tt lpr} и {\tt man} вы можете добиться гораздо более
красивого результата, если объясните команде man, что вывод предназначен
не для экрана, а для принтера. Это делается с помощью ключа {\tt -t}.

\begin{verbatim}
vitus@softweyr$ man -t ls|lpr -P ps
\end{verbatim}

Результат, полученный с помощью такой команды на хорошем (например, лазерном)
принтере, по качеству не уступает типографской печати.

Как видите, команде {\tt lpr} тоже пришлось кое-чего указать дополнительно.

Ключ {\tt -P} позволяет задать имя принтера. Слово {\tt ps} в данном случае
не отдельный параметр, а {\it параметр ключа \tt -P}. Он указывает,
что печатать надо не на принтере по умолчанию, который обычно называется 
{\tt lp}, а на принтере с именем {\tt ps}. Это необходимо, потому что
{\tt man -t} выдает текст на языке PostScript, который позволяет управлять
принтером, и печатать не только текст различными шрифтами, но и графику.
(см. раздел \ref{Postscript}).

И еще немного о команде {\tt man}. Когда вы вызываете ее, приглашение
к вводу следующей команды не появляется. Вместо этого весь экран занимается
текстом, который вы можете прокручивать с помощью клавиш со стрелками или
{\bf PgUp, PgDn}.

Как отсюда выйти? Если вы внимательно читали раздел \ref{NewProgr}, то
вы наверное уже попытались применить некоторые стандартные клавиши.

Действительно, буква <<q>> работает.

Кроме того, рекомендую обратить внимание на возможность поиска нужного
слова. Это делается с помощью клавиши <<{\tt /}>>. Когда вы ее нажмете,
курсор переместится в нижнюю строку экрана и там вы можете набрать шаблон
для поиска. Шаблон это не просто слово или сочетание букв. Он может
содержать {\it регулярные выражения}, которые позволют сформулировать 
достаточно сложное условие типа <<слово, начинающееся на букву ``Б'' и
кончающееся на ``я'', в котором обязательно должна быть ``р'', но не
должно быть мягкого знака>>. Подробнее мы с этим разберемся, когда
займемся редактированием текстов (раздел \ref{vi}).

Если вы хотите просмотреть какой-нибудь текстовый файл таким же образом,
как и страницу manual, то воспользуйтесь командой {\tt less}\footnote{Почему
эта команда называется {\tt less} (меньше)? Потому что она позволяет вернуться
назад к той части файла, которая уже уехала с экрана. В ранних версиях Unix
ее не было, была, как и в DOS, только команда {\tt more} (еще, больше),
которая выводит
файл на экран порциями и ждет нажатия пробела после каждой из них, чтобы текст
можно было не спеша прочитать. Когда появилась программа, которая позвляла
перемещаться по тексту не только вперед, но и назад, ее назвали {\tt less}%
\footnotemark.}\footnotetext{На ftp-сервере garbo версия less для DOS 
сопровождается такой аннотацией: {\tt less} is more than {\tt more}.}.

(На самом деле {\tt man} вызывает {\tt less}, когда обнаруживает что его
вывод направлен на экран.)

Ей, как и lpr, можно указать файл в качестве параметра, а можно подать
на вход результат какой-то другой программы с помощью трубопровода.

И еще одна вещь, которую можно посмотреть~--- какие программы выполняются
в данный момент.
\begin{verbatim}
vitus@softweyr$ ps
 6368 v01 S     0:00 -bash
 6370 v01 R     0:00 ps
\end{verbatim}
Мы видим, что исполняется {\tt bash}~--- так называемый  shell или оболочка,
то есть программа, которая воспринимает введенные с клавиатуры и запускает
соответствующие программы, и собственно программа {\tt ps}.

Как мало на первый взгляд. Но это только программы, которые запущены 
с под вашим именем, с того терминала, на котором работаете вы

{\small
(могут быть еще терминалы, подключенные через последовательный порт,
виртуальные терминалы, позволяющие работать на одной машине с другой
по сети и эмуляторы терминала через модем). 

}%
Кроме этого в список не входят программы, обеспечивающие работу системы,
которые не связаны ни с каким терминалом. Для того, чтобы получить их
список, команде {\tt ps} надо указать определенные ключи. Например {\tt -a}
позволяет посмотреть процессы, запущенные другими пользователями,
{\tt -x}~--- процессы, не связанные ни с каким терминалом и так далее.
Как пишут в manual и других руководствах по Unix, см.~{\tt{\bf ps}(1)},
то есть смотрите описание команды ps в разделе 1 manual. 

\section{Немного красивых рамочек}
Теперь вы получили первое представление о том, как выглядит командная
строка Unix. Именно эта кажущаяся сложность и некрасивость обеспечила
популярность Unix, поскольку сложный командный язык идеально подходит
для выражение сложных мыслей, а работа на компьютере в чем-то сродни 
магии~--- если вы сумели правильно выразить свою мысль, то задача уже
решена. С другой стороны невысокие требования к изобразительным способностям
терминала позволяют программам работать практически на любом оборудовании.

Но эти же свойства отпугивают от Unix многих начинающих пользователей.

Впрочем, современный Unix не сводится к черному экрану и и командной строке.
Наберите команду {\tt startx}\footnote{В вашей системе может быть и другая 
команда для запуска X Window. Например, на рабочих станциях Sun обычно 
используется
команда {\tt openwin} или {\tt ow}} и вы увидите совершенно другую картину.

Вы попали в среду X Window System~--- графического интерфейса Unix.

Одно из окон, (обычно то, которое на переднем плане~---) это окно {\it виртуального терминала}, в котором вы можете набирать все те же команды Unix, что
и на любом другом терминале. То окно, которое будет воспринимать ввод с
клавиатуры, обычно выделяется цветом рамки. Про это окно говорят, что оно
имеет {\it фокус}\footnote{Слово <<фокус>> здесь заимствовано не из цирка,
а скорее из оптики. Ведь и в русском языке говорят ``внимание сфокусировано на\dots''}. 

Окна можно перемещать, перетаскивая их мышью. Для этого надо <<ухватиться>>
за заголовок. 

В углах заголовка обычно есть несколько кнопок. Они позволяют выполнить
наиболее распространенные операции с окнами. 

Углы окна обычно выделены каким-либо способом. Ухватившись за этот угол 
окно можно растянуть, или наоборот, сжать.


Нажав кнопку мыши за пределами окон~--- на чистом фоне, вы получите меню,
с помощью которого запускаются основные программы. Возможно, нужной вам
программы среди них нет, но всегда можно найти окно виртуального терминала 
(Shell, Shelltool, Command Tool, XTerm), открыв которое вы можете запустить
ее с клавиатуры.

Облик XWindow на разных машинах может различаться. Во-первых, как и все в Unix
она имеет очень много возможностей настройки на вкусы конкретного пользователя,
во вторых, сама по себе X Window обеспечивает только стандартные способы
взаимодействия программ с дисплеем, а такими мелочами как оформление заголовка
окна, способы управления окнами и внешний вид меню, занимается отдельная
программа, которая называется Window Manager.

Таких программ существует несколько. В Linux обычно используется fvwm\footnote{не спрашивайте меня, как это расшифровывается, лучше посмотрите fvwm(1)}.

В fvwm каждая из трех кнопок мыши вызывает свое меню. Левая~--- меню программ,
которые можно запустить, средняя~--- меню операций с окнами, такое же как
и при нажатии на кнопку в левом верхнем углу окна, а правая ~--- список 
существующих окон. 

Очень полезная вещь, если вы потеряли окно с вашим редактируемым текстом
под другими окнами.

Я обычно держу окошко со списком окон в левом нижнем углу экрана.

В левом верхнем углу fvwm создает маленькую "карту экрана" на которой 
изображены все открытые окна. Обратите внимание, что все, что вы видите
на экране, занимает только один из девяти прямоугольников этой карты, 
подсвеченный розовым. Остальные восемь прямоугольников невидимы, но щелкнув
на любом из них мышью можно переключиться на него. Попасть на другой
прямоугольник вы можете также, нажав {\bf Ctrl}-стрелку

Таким образом fvwm представляет вам {\it виртуальный} экран втрое шире и
втрое выше настоящего. Зачем? Для того, чтобы можно было оперативно 
переключаться между разными задачами. Например, на одном экране вы пишете
текст, на другом работаете с картой, а на третьем у вас открыта программа
чтения почты. При необходимости вы одним движением попадаете в нужное место.

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

Бороться с этим можно только одним способом~--- выбрать из меню операций
с окнами команду "Lower" (понизить) и указать на это окно. Другое окно,
которое обладает теми же свойствами это часы. В принципе, редактируя файл
конфигурации fvwm вы можете наделить такими свойствами окно любой программы.

Еще одна возможность, о которой стоит помнить, работая в X Window, это
копирование информации между окнами. 

Перемещая мышь с нажатой левой клавишей по тексту вы можете выделить нужный
фрагмент, а потом, нажав среднюю клавишу~--- скопировать его в другое окно%
\footnote{Именно так получены примеры диалога с Linux в этой главе}.

Если у вас двухкнопочная мышь, то нажатие на среднюю клавишу можно
заменить одновременным нажатием на обе клавиши.

 
\section{Файловые операции}
\label{FileOp}

Теперь попробуем сделать что-нибудь с файлами.

Для начала создатим один, для эксперимента.
Чтобы не разбираться с текстовыми редакторами, воспольуемся тем, что 
вывод любой программы можно перенаправить.
\begin{verbatim}
vitus@softweyr$ echo Мой первый файл>myfile.txt
vitus@softweyr$ ls
myfile.txt
vitus@softweyr$ ls -l myfile.txt
-rw-r--r--   1 vitus    users          16 Oct 12 22:04 myfile.txt
vitus@wagner$
\end{verbatim}

Вот у нас есть файл. Команда {\tt ls} с ключом {-l} (long format) рассказала
о нем практически все, что известно системе.

Начнем с конца. 
\begin{enumerate}
\item Имя этого файла myfile.txt. 
\item Создан он в 10 вечера 12 октября
текущего года (если бы он был создан в прошлом году, в выводе появился
бы год).
\item Размер его 16 байт.
\item Принадлежит он пользователю vitus из группы users.
\item На этот файл существует ровно одна ссылка~--- его основное имя.
\item Права доступа к этому файлу такие (слева направо):
      \begin{itemize}
       \item  Владелец~--- может его читать (read) и писать (write).
       \item Другие пользователи из той же группы users~--- только читать.
       \item Все остальные пользователи~--- тоже только читать.
      \end{itemize}
\item И наконец, прочерк в первой позиции означает, что это обычный файл,
      который не обладает никакими специальными свойствами.
\end{enumerate}
   
Попробуем дать этому файлу второе имя~--- создать на него ссылку.
{\small
\begin{verbatim}
vitus@softweyr$ ln myfile.txt mylink
vitus@softweyr$ ls -l 
-rw-r--r--   2 vitus    users          16 Oct 12 22:04 myfile.txt
-rw-r--r--   2 vitus    users          16 Oct 12 22:04 mylink
vitus@softweyr$ 
\end{verbatim}
}      
Как вы видите, обе строчки выглядят совершенно одинаково. 
Даже дата создания не изменилась, хотя ссылку мы создали явно позже.

Ведь дата создания касается содержимого файла, а не его имени.

Попробуем посмотреть содержимое этого файла. Про комаду less я вам уже 
рассказывал, но для такого маленького файла в ней нет необходимости. Он
уместится на экране от начала до конца. Поэтому можно воспользоваться командой
cat.

\begin{verbatim}
vitus@wagner$ cat myfile.txt
Мой первый файл
vitus@wagner$
\end{verbatim}

Команда {\tt cat} просто выводит на экран содержимое файлов, указанных
в качестве аргументов. Если указать несколько файлов, то она их
объединит в общий выходной поток или конкатенирует, откуда и ее название.

Как правило, использовать эту команду для вывода на экран неудобно,
но если вы хотите пропустить несколько файлов через программу (или несколько),
то начать этот {\it конвейер} удобно как раз с команды {\tt cat}.

Теперь создадим новый каталог.
\begin{verbatim}
vitus@wagner$ mkdir junk
vitus@wagner$ 
\end{verbatim}

{\small
Обратите внимание, что в Unix нельзя сокращать {\tt mkdir} и {\tt rmdir} 
до {\tt md} и {\tt rd}, как в DOS. Зато у команды сметы каталога работает
{\bf только} короткая форма~--- {\tt cd}.

}

Попробуем теперь переместить файл в этот каталог. Очевидное решение: создать
там ссылку на этот файл с помощью команды {\tt ln} и удалить старую ссылку.

Этот способ действительно работает. Но существует более простой и удобный
способ~--- команда {\tt mv} (сокращение от move~--- передвинуть).

Команда {\tt mv} позволяет переместить сразу несколько файлов.
Например так:
\begin{verbatim}
$ mv myfile.txt mylink junk
\end{verbatim}

Если же надо {\tt скопировать} файлы, то команда может называться
{\tt cp}~--- сокращение от copy.

Эти две команды копируют (или перемещают) все файлы указанные в качестве
аргументов в каталог, указанный последним аргументом. Если последний
аргумент не каталог, то исходный файл должен быть один. Команда {\tt mv}
может перемещать также и каталоги вместе со всеми содержащимися в них
файлами и каталогами но только в том случае, если перемещение сводится
к созданию новой ссылки и удалению старой. Если надо переместить каталог
с одного диска на другой, например на дискету, то лучше воспользоваться
средствами {\it архивирования}(см. раздел \ref{archiving}).


\subsection{Джокеры}

Если нам надо скопировать два-три файла, то мы вполне можем набрать их
имена с клавиатуры. А как быть, если файлов у нас сотня?

Можно, конечно, попросить команду {\tt ls} сформировать их список и подставить
результат ее работы в качестве командной строки команде {\tt cp}, но есть более
простой способ.

Командный процессор UNIX прежде чем передать аргументы команде, сначала
обрабатывает их сам. В частности он может превратить слова, содержащие
определенные специальные символы в списки файлов, удовлетворяющих
некоторому шаблону. Эти специальные символы называются по английски
{\it wildcards}, что можно перевести на русский как джокеры.

Наиболее часто используются джокеры ``{\tt *}'' и ``{\tt ?}''.
Звездочка заменяет любую последовательность символов, а вопросительный знак~---
любой одиночный символ. Поэтому команда {\tt cp * junk} скопирует в директорию
{\tt junk} все файлы в текущей директории, а {\tt cp *.txt junk}~--- все файлы
с расширением {\tt .txt}.

Из этого правила есть одно важное исключение: шаблону, начинающемуся со
звездочки не соответствуют файлы, имена которых начинаются с точки. На звездочку в середине шаблона это не распространяется. Например, {\tt a.txt} удовлетворяет шаблону {\tt a*t}, а {\tt .fvwmrc} {\bf не} удовлетворяет шаблону {\tt *rc}

{\small В MS-DOS и системах, выросших из нее (OS/2, Windows) эти виды джокеров
тоже работают, но немного менее логично. Например, любой символ после звездочки
кроме точки игнорируется, поэтому шаблоны {\tt a*2.txt} и {\tt a*.txt} 
эквивалентны. Кроме того, поскольку расширение является обязательной частью,
то шаблон {\tt *} соответствует не всем файлам, а всем файлам без расширения.
Для поиска всех файлов нужно использовать {\tt *.*}.

Кроме того, в этих системах джокеры раскрывает не процессор команд (которого
в Windows просто нет), а сами прикладные программы. Поэтому использовать
их можно далеко не всегда.

} 

Кроме того полезной конструкцией является {\tt\verb![!{\it набор символов}\verb!]!}.
Эта конструкция соответствует одному любому символу из указанного набора.
Например \verb![A-Z]!~--- одна большая латинская буква, \verb![0-9]! любая цифра, \verb![aeiou]!~--- любая из пяти указанных букв. Если первым символом 
после открывающей скобки является ``\verb!^!'', то смысл конструкции меняется
на обратный~---- любой символ {\bf кроме} указанных.

\begin{table}
\caption{Специальные символы в командной строке UNIX}
\label{wildcards}
\begin{tabular}{|c|p{2.5in}|p{1in}|}
\hline
конструкция&Действие&Поддержка в других ОС\\
\hline
\multicolumn{3}{|c|}{Джокеры}\\
\hline
``{\tt *}''&Соответствует любому набору символов в именах 
существующих файлов&ограниченно\\
``{\tt ?}''&Соответствует любому одиночному символу&есть\\
\verb![!{\it набор}\verb!]!& Соответствует любому из символов, входящих в набор&нет\\
\verb![^!{\it набор}\verb!]!& Соответствует любому из символов, не входящих 
     в набор&нет\\
\hline
\multicolumn{3}{|c|}{Другие подстановки}\\
\hline
\$\it имя & 
Подстановка значений переменных&
 Обычно используется другой синтаксис\\
\parbox{1in}{\raggedright\$({\it команда}), \tt`{\it команда}\tt`}&
Подстановка результата команды.&нет\\
\verb!{!слово,слово\verb!}!&Генерирует ряд параметров, образованных из параметра, содержащего
эту конструкцию, последовательной подстановкой каждого из слов на место конструкции. В отличие от джокеров не зависит от существования файлов с такими именами.
&нет\\
\verb!$[!\it арифм. выр.\verb!]!& Результат вычисления арифметического выражения&нет\\
\hline
\multicolumn{3}{|c|}{Защита от интерпретации}\\
\hline
\verb!\!& Защищает любой один символ, непосредственно следующий за ним&нет\\
\tt "\dots"& Защищает текст в кавычках от разбиения на параметры
и подстановки джокеров&иногда реализуется прикладными программами самостоятельно\\
\tt '\dots' &Защищает от любой специальной интерпретации&нет\\
\hline
\end{tabular}
\footnotetext{Поскольку в DOS командная строка доступна программе
в том виде, в каком ее ввел пользователь, многие программы реализуют
правильную интерпретацию двойных кавычек сами.}
\end{table}


