Укрощение @Интернет@

       

A:Как работать с UNIX?


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

Для UNIX существует множество интерактивных оболочек с развитым пользовательским интерфейсом – от Mortal Commander (аналог Norton Commander) до графических сред a la Windows. Они упрощают освоения мира UNIX, но оказываются крайне неудобными для удаленного управления компьютером. Даже консольный Mortal Commander ощутимо тормозит на модемных каналах. А о графических оболочках вспоминать и вовсе не приходится, – комфортная работа возможна лишь при наличии шустрой локальной сети! Поэтому, придется поступиться некоторыми удобствами, и, расставшись с мышью, разговаривать с компьютером языком текстовых команд. Такое общение с UNIX в чем-то напоминает работу с интерпретатором MS-DOS "command.com". Разумеется, названия команд окажутся другими, но в целом принцип тот же.

В UNIX (в отличие от MS-DOS) нет стандартной командной оболочки, и первая задача пользователя – выяснить, что именно установлено в системе, и какие альтернативные оболочки доступны.

Путь к используемой в данный момент оболочке содержится в переменной $SHELL, и вывести ее содержимое на экран поможет команда "echo" – "echo $SHELL" (внимание, – соблюдайте регистр – UNIX к нему чувствительна). Результат работы на компьютере автора выглядит так:

Эмулятор UWIN

>echo $SHELL

/usr/bin/ksh

Эмулятор CYGWIN

>echo $SHELL

/bin/sh

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




Имя файла

Название оболочки

bash

Усовершенствованная оболочка Борна

csh

Оболочка С

ksh

Оболочка Корна

sh

Оболочка Борна

tcsh

Оболочка TC

Таблица 6 Имена исполняемых файлов некоторых популярных оболочек

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

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

К тому же открытость исходных текстов "С" вызвала появление массы несовместимых между собой клонов. Некоторые из них дожили и до наших дней (как, например, "TC",– своеобразный гибрид "С" и "TENEX" – операционной системы PDP-10).

Существовали и коммерческие оболочки. Из них наибольшей популярностью пользовалось творение, созданное Дэвидом Корном, объединившее в себе лучшие черты своих предшественников. Компания AT&T распространяла ее вместе с операционной системой System V, объявив стандартном де-юре.

Стандарт – хорошо, но платить компании никто не хотел, и вскоре оболочка Борна была полностью переписана в рамках проекта GNU, получив название bash – Borne Again Shell. Многочисленные усовершенствования и перенос в среду LINUX сделали bash самой популярной оболочкой всех времен и народов, хотя многие до сих пор предпочитают пользоваться C-Shell или оригинальной оболочкой Борна. К тому же, по-прежнему не иссякает поток энтузиастов, пишущих свои собственные оболочки.



Во многих случаях различия между оболочками не столь существенны и не отражаются на простейших операциях, но все примеры, приводимые в книге, предназначены для оболочки Корна и их успешное выполнение в других оболочках не гарантируется (хотя и предполагается). Поэтому, полезно знать, какие оболочки установлены администратором на машине. В этом поможет команда "cat /etc/shells", результат работы которой на свежеустановленном эмуляторе UWIN выглядит следующим образом:

cat /etc/shells

/usr/bin/ksh

/usr/bin/sh

/usr/bin/tcsh

/usr/bin/csh

/bin/sh

/bin/ksh

/bin/csh

/bin/tcsh

Запустить любую оболочку можно, набрав ее имя (возможно, вместе с полным путем), в командной строке. А вернуться назад обычно помогает команда "exit". В качестве тренировочного упражнения полезно запустить все доступные оболочки по очереди. (Чаще всего пути "/usr/bin" и "/bin" указывают на один и тот же каталог, поэтому эквивалентны друг другу).

$ echo $SHELL

/usr/bin/ksh

$ /usr/bin/sh

# echo $SHELL

/usr/bin/ksh

# exit

$ /usr/bin/tcsh

# echo $SHELL

/usr/bin/ksh

# exit

$ /usr/bin/csh

%echo $SHELL

/usr/bin/ksh

%exit

Для просмотра содержимого директорий в командном интерпретаторе "command.com" (MS-DOS) предусмотрена встроенная команда "dir", но UNIX-оболочки не поддерживают такой команды. Вместо этого пользователю предоставляется возможность вызвать внешнюю утилиту, выполняющую всю необходимую работу.

Обычно в UNIX для отображения содержимого каталога используется программа "ls", находящаяся в каталоге "/bin". Кстати, пользователи CYGWIN, прежде чем смогут ей воспользоваться, должны скачать с сервера архив fileutils.tar.gz – в минимальный комплект поставки она не входит.

Вызов без параметров выводит на экран содержимое текущего каталога, а заглянуть в корень поможет наклонная черта – "ls /"

ls /

A                                                             E                                                             proc



base.bat                                                 etc                                                           reg

baseserviceslink.sh                              F                                                              sys

bin                                                          H                                                             tmp

C                                                             home                                                      usr

D                                                             lib                                                            var

dev                                                         linka                                                       win

Узнать, что находится в каталоге "/etc" можно передав его имя в качестве параметра команде "ls":

$ ls /etc

crontab                  inetdconfig.sh                       passwd.add           traceit

in.ftpd                    init.exe                                   priv.exe                  tracer.exe

in.rlogind               login.allow                             profile                    ucs.exe

in.rshd                    login.deny                             rc                             ums.exe

in.telnetd               mailx.rc                                 services

inetd.conf              mkpasswd.exe                     shells

inetd.exe                passwd                                   stop_uwin

Конечно же, поддерживаются символы-джокеры, – знаки "звездочка" и "вопрос". В UNIX, в отличие от MS-DOS, существует конструкция [char set], которую имеет смысл рассмотреть подробнее. Но для начала нелишне вспомнить назначение "*" и "?". Знак "*" обозначает любое множество любых символов (включая пустое), а "?" всего один непустой символ. Поэтому, "ls x*" выведет на экран все файлы (и каталоги), начинающиеся с буквы "x", а "ls ?tmp"- покажет "_tmp","$tmp" и так далее.



Конечно же, временами гибкости таких шаблонов оказывается недостаточно, например, как быть, когда требуется получить список файлов, начинающихся и на букву "i", и на букву "p"? В MS-DOS с этим приходится управляться в два захода, последовательно отдавая команды "dir i*" и "dir p*". UNIX же с этой проблемой управляется за один присест! Например, так:

$ ls /etc/[ip]*

/etc/in.ftpd            /etc/inetd.conf                      /etc/passwd

/etc/in.rlogind       /etc/inetd.exe                        /etc/passwd.add

/etc/in.rshd            /etc/inetdconfig.sh               /etc/priv.exe

/etc/in.telnetd       /etc/init.exe                           /etc/profile

А как быть, если необходимо отобразить все файлы, в имени которых присутствует хотя бы одна цифра? Неужели придется писать утомительно длительную последовательность "ls *[0123456789]*"? К счастью нет! - необходимый интервал можно задать следующим образом: "[0-9]", например, вот так:

$ls /etc/*[0-9]*

/etc/k1y                 /etc/mkss2old                       /etc/track7

Если такой информации окажется недостаточно и потребуется узнать, скажем, права доступа к файлу, имя владельца и время последнего изменения, то воспользуйтесь ключом "-l" (маленькая латинская буква L, не спутайте с единицей). Например, так:

ls –l /etc

-rwxr–-r–-  1 root    Everyone    46 Feb 16  1999 crontab

-rwxr–-r–-  1 root    Everyone 19968 Feb 17  1999 mkpasswd.exe

drwxr–-r–-  2 root    Everyone   512 Jul  2 16:52 mydir

-rwxr––r–-  1 root    Everyone   119 Jul  1 12:45 passwd

lrwxr–-r–-  1 root    Everyone    20 Jun  4 03:10 services -> /C/WINDOWS//services

-rwxr––r–-  1 root    Everyone    88 Feb 17  1999 shells

-rwxr–-r–-  1 root    Everyone 73216 Feb  2 07:25 ums.exe

Первая слева колонка сообщает права доступа. Она состоит из тех трехсимвольных групп, определяющих права доступа создателя (то бишь владельца файла), его группы и всех остальных пользователей. Каждая группа в свою очередь состоит из трех атрибутов, разрешающих чтение (r), запись (w) и исполнение (x).





Рисунок 58 Рисунок 008.txt Расшифровка файловых атрибутов

Тут надобно заметить, что в UNIX выполняемые файлы распознаются по атрибуту "x", и могут иметь любое расширение или вовсе не иметь его. Обычно большинство файлов и каталогов имеют следующие права доступа "rwxr––r––r", т.е. создатель файла может делать с ним что угодно, а всем остальным разрешается читать, но не модифицировать или запускать.

Для изменения прав доступа предусмотрена утилита chmod

(сокращение от Change Mode). Она принимает следующие аргументы командной строки: первой указывается группа пользователей

("u" – для владельца, "g" – для членов его группы, "o" – для всех прочих и "a" для всех-всех, т.е. "u"+"g"+"o" одновременно), затем наличие (знак "+") или отсутствие (знак "-") требуемого атрибута. Например, защитить собственные файлы от "чужого глаза" можно так: "chmod g-r,o-r *".

Директории отличаются от простых файлов по стоящему впереди символу "d" (смотри рисунок 58)



Рисунок 59 Рисунок 009.txt Директории в UNIX отличаются от файлов наличием атрибута "d"

Следующая колонка сообщает количество псевдонимов, под которыми файл (директория) известен системе. Например, для каталога "/bin" это число равно двум, поскольку обычно "/bin" и "/usr/bin" ссылаются на одну и ту же директорию.

drwxrwxrwx  2 root     Everyone     512 Jun  4 00:50 bin

drwxrwxrwx  3 root     Everyone     512 Jun  4 00:51 dev

drwxrwxrwx 16 root     Everyone     512 Jun  4 00:51 lib

Третья колонка содержит имя владельца файла (в данном примере "root") и группу, к которой он принадлежит ("Everyone"). И замыкают строку размер, время создания и имя файла (директории). Вся остальная информация по работе с "ls" содержится в руководстве "man" и может быть получена с помощью команды "man ls".



Перейти в другой каталог, как и в MS-DOS, можно с помощью команды "cd". Стоит заметить: в UNIX нет понятия диска, поэтому нет и команды для его изменения – для навигации достаточно одного "cd". Например:

$ cd /

$ ls

A                                             E                             proc

base.bat                                 etc                           reg

baseserviceslink.sh              F                              sys

bin                                          H                             tmp

C                                             home                      usr

D                                             lib                            var

dev                                         linka                       win

$ cd /A

$ ls

tpna.arj

$ cd /var

$ ls

adm                                        tmp                         uninstall

Для создания новых каталогов предназначена команда "mkdir" (Make Directory). Вызов "mkdir myname" создаст в текущем каталоге новую директорию "myname". А вот попытка создать несколько вложенных друг в друга каталогов провалится, если не указать ключ "-p". Например:

$ mkdir temp

$ cd temp

$ ls

$ mkdir 1/2/3

mkdir: 1/2/3: [No such file or directory]

$ mkdir -p 1/2/3

$ ls

1

$ ls 1

2

$ ls 1/2

3

Кстати, обратите внимание, – в UNIX ключи задаются до имен файлов, иначе вместо ключа "-p" создастся директория с таким именем. Да, "mkdir" позволяет создать более одного каталога за вызов. Например:

$ mkdir 1 2 3

$ ls

1              2              3

Удалить ненужные каталоги поможет команда ‘rm’. По умолчанию удаляются одни файлы, а для уничтожения директорий необходимо задать дополнительный ключ ‘-d’. Если удаляемый каталог содержит вложенные директории, то начать удаление необходимо с самого «нижнего» из них или воспользоваться ключом ‘-r’, рекурсивно стирающим все без разбора. Так, для уничтожения созданных в предыдущем примере каталогов ‘/1/2/3’ можно воспользоваться следующими командами:



rm –d /1/2/3

rm –d /1/2

rm –d /1

Или обойтись всего одной:

rm –d –r /1

А для копирования файлов в UNIX предусмотрена утилита "cp" – аналог "copy" из MS-DOS. Например, скопировать "/etc/passwd" в свой собственный каталог можно командой: “cp /etc/passwd /home”, а просмотреть его содержимое поможет утилита "cat". Например:

$ cp /etc/passwd /home

$ cat /home/passwd

root:x:0:13:Built-in account for administering the computer/domain:/tmp:/usr/bin/ksh

telnetd:x:1:1:telnetd:/:/dev/null

Тут необходимо сделать небольшое пояснение. Изначально "cat" разрабатывалась для объединения нескольких файлов в один, но в качестве целевого файла использовался стандартный вывод, поэтому пользоваться утилитой приходилось приблизительно так “cat file1 file2 file3 > file123”. Знак “>” обрабатывался оболочкой, подменяющей стандартный вывод указанным файлом. Если же целевой файл не указывался, утилита последовательно выводила содержимое перечисленных файлов на экран.

Конечно, существуют и более элегантные способы просмотра содержимого файла и его редактирования. Например, редактор "vi" (от Visual Interface). Это классическая утилита UNIX может вызвать насмешку у пользователей MS-DOS/Windows, привыкших к визуальному редактированию, поскольку редактор "vi" управляется своим собственным командным языком, без знаний которого невозможно даже сохранить файл или выйти из vi!

Сначала это шокирует, но позже, освоившись с vi, начинаешь понимать насколько же оболванивает и ограничивает визуальный интерфейс. С другой стороны, edit.com не требует никакого обучения – сел и работай, а командный язык редактора vi можно изучать месяцами, в течение которых большую часть времени придется провести за листанием документации, с небольшими перерывами на собственно набивку текста.

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



Действительно, в UNIX существуют вполне привычные пользователям Windows редакторы, и выбор того или иного – личное дело каждого. Разумеется, при условии, что выбранный редактор установлен в системе. К сожалению, администраторы многих серверов не балуют своих пользователей разнообразием, тем более, когда предоставляют хостинг бесплатно. Теоретически возможно связаться с администратором и попросить установить ваш любимый редактор, но практически это оказывается сложнее изучения vi, который поставляется со всеми UNIX-совместимыми системами, и всегда доступен.

Поэтому минимальные навыки работы с редактором vi никогда не помешают, и как знать – может быть, через некоторое время он окажется вашим любимым редактором!

Для того чтобы пользоваться vi, вовсе не обязательно устанавливать на своем компьютере операционную систему UNIX или один из ее эмуляторов, – vi дал рождение многочисленным клонам, некоторые из которых успешно перенесены в среду Windows 9x/Windows NT и даже MS-DOS. Большую популярность завоевал vim, портированный на платформы Amiga, Atari, Mac System 7, UNIX, MS-DOS, Windows, словом практически для любого компьютера существует реализация vim. Остается добавить, что vim свободно распространяется вместе с исходными текстами и находится, например, на быстром германском ftp сервере – ftp://ftp.fu-berlin.de/misc/editors/vim.

Сразу же после запуска, vi будет выглядеть приблизительно так, как показано на рисунке 59 (в данном случае vi был запушен с параметром hello для создания нового файла).



Рисунок 60 Рисунок 054.bmp Внешний вид редактора vim – клона vi, запущенный в операционной системе Windows

Знаки "~" (тильда) указывают на конец файла и в действительности отсутствуют в его теле.

Если попытаться набрать текст "Hello, World!" на экране ничего не появится, а vi ответит разраженным покрикиванием. Дело в том, что у vi есть два режима – командный режим и режим вставки.

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



Сразу же после запуска vi оказывается в командном режиме и переключиться в режим вставки можно, например, нажатием клавиши <i>. Дождавшись появления курсора вверху экрана, наберите восклицание "Hello, Word!" или что-нибудь в этом духе, а затем попробуйте сохранить файл на диск. Для этого нажмите клавишу <Esc>, чтобы переключиться в командный режим, и наберите следующую последовательность <:>,<q>,<w>,<ENTER>.

Да… сложная вещь vi, но на самом деле настоящие сложности еще впереди! Загрузите только что созданный файла в редактор, указав его имя в командной строке, и попробуйте отредактировать строку, например, измените "Hello, World!" на "Hello, my world!". Что, пытаетесь подвести курсор к месту правки, а стрелки не действуют? Хорошенькое начало, – чем же тогда управлять курсором?!

Не стоит волноваться понапрасну – раскладка клавиатуры обычно подбирается так, чтобы пользователи могли работать ни о чем не задумываясь, но все же иногда встречаются нерадивые администраторы, криво инсталлирующие vi на свою машину. Поэтому, на всякий случай полезно знать, что клавиша <h> в командном режиме перемещает курсор на одну позицию влево, <l> - вправо, а <j> и <k> вниз и вверх соответственно.

Нажмите шесть раз клавишу <l> или воспользуйтесь комбинацией <6><l> (обычно цифра стоящая перед любой командой предписывает повторить эту команду надлежащие количество раз). Теперь наберите "my", автоматически раздвигая остальные символы, а для замены большую буквы "W" на строчечную войдите в командный режим по <Esc> и включите режим вставки символа, нажатием <r>. Или же используйте команду "~" (тильда) для инвертирования регистра символов.

Конечно, никто не и не утверждает, что пользоваться vi легко, но тягостные дни и месяцы обучения окупятся богатыми предоставляемыми возможностями, – vi поддерживает именованные буферы, макросы, обладает развитым механизмом шаблонного поиска, позволяет запускать команды оболочки, не выходя из редактора, словом, в умелых руках способен творить чудеса. Но эта книга не учебник по vi, поэтому, не задерживаясь на нем дальше, вернемся к освоению UNIX.



Продемонстрировать многозадачность UNIX поможет тот же vi – как быть, если, не выходя из редактора, потребуется выполнить какое-нибудь действие? В Windows достаточно щелкнуть мышкой по заголовку окна другой программы или нажать <Alt>-<Tab>, но разработчики UNIX пошли по другому пути.

Если нажать <Ctrl-Z>, выполнение текущего процесса приостановится, и произойдет выход в оболочку. Убедиться в том, что "vi" еще жив поможет команда "ps", отображающая список всех процессов в системе (процесс vi.exe выделен жирным шрифтом):

$ ps

PID TT        TIME COMMAND

148799 tty10        0 vi.exe

150872 tty10        0 ps.exe

320924 tty10        0 ksh.exe

Слева показаны идентификаторы процессов. Зная идентификатор процесса, его можно "прибить" командной "kill" или запустить передним планом утилитой "fg". Например, так: "fg 148799" или так – "fg %1", где "%1" –порядковый номер процесса в списке. Независимо от способа запуска "fg", редактор vi вновь появится на экране. Нажмите еще раз <Ctrl-Z> и убийте процесс командной kill – "kill 148799" или "kill %1" – оба варианта хороши одинаково, но второй писать существенно короче.

А как поступить, если в vi требуется провести поиск сложного шаблона по всему тексту, выполняющийся неприлично длительный промежуток времени, в течение которого ничего не остается, как сидеть и тупо пялится на экран?

На помощь приходит фоновое выполнение задач, – понижение приоритета процесса, с предоставлением экрана другому приложению. Перевести приложение в фоновой режим поможет команда "bg", запускаемая точно так же как и "fg" (которая, кстати, пригодится для возращения процесса из фонового в нормальный режим). Большинство оболочек распознают символ "&", расположенный в конце командной строки, и автоматически запускают приложение в фоновом режиме. Например:

$ vi &

[1]     141008

$ ps

PID TT        TIME COMMAND

87458 tty10        0 ps.exe

141008 tty10        0 vi.exe

320924 tty10        0 ksh.exe

[1] + Stopped (SIGTTIN)        vi &

$

На этом краткое введение в UNIX можно считать законченным. Умения прогуляться по каталогам и запустить нужную программу для начала окажется вполне достаточно. Конечно, это не избавляет от необходимости приобретения справочных руководств и учебников по UNIX, но множество полезной информации можно найти и во встроенной справочной системе, доступной для просмотра с помощью утилиты "man".

Получить помощь по любой команде можно, указав ее название в командной строке, например, так "man ls"

Родственные вопросы:

Как из Windows сделать UNIX?

Что такое telnet и как с ним работать?


Содержание раздела