3.8.2 Перенаправление входа и выхода Теперь, предположим, что мы хотим послать результат сортировки в файл, чтобы где-то сохранить список планируемых покупок. Shell дает нам возможность перенаправлять стандартный выход в файл, используя символ ``>''. Вот как это работает.
/home/larry/papers# sort > shopping-list
bananas
carrots
apples
[ctrl-D]
/home/larry/papers#
Как вы можете видеть, результат работы команды sort не отображается на экране, вместо этого он сохраняется в файле shopping-list (список покупок). Давайте посмотрим на этот файл.
/home/larry/papers# cat shopping-list
apples
bananas
carrots
/home/larry/papers#
Теперь мы можем не только сортировать (упорядочивать) список планируемых покупок, но и сохранять его! Но предположим, что мы хранили наш неотсортированный исходный закупочный список в файле под именем items. Один из способов сортировки и сохранения его, это отсортировать файл с данным именем, вместо получения файла со стандартного входа, и перенаправить стандартный выход в файл. Например так
/home/larry/papers# sort items > shopping-list
/home/larry/papers# cat shopping-list
apples
bananas
carrots
/home/larry/papers#
Но это можно сделать и по-другому. Перенаправлен может быть не только стандартный выход, но также и стандартный вход, используя символ ``<''.
/home/larry/papers# sort < items
apples
bananas
carrots
/home/larry/papers#
Технически, sort < items эквивалентно sort items, но последний вариант позволяет нам продемонстрировать сказанное: sort < items ведет себя так, словно данные файла items были напечатаны на клавиатуре. shell обслуживает перенаправление. sort не было дано имя файла (items) и команда читала со стандартного входа, как будто шел ввод с клавиатуры.
Это иллюстрирует концепцию фильтра. Фильтр, это программа, которая получает данные со стандартного входа, обрабатывает их каким-то образом и посылает результат обработки на стандартный выход. С помощью перенаправления стандартные вход и выход могут быть переведены на файлы. sort - простейший фильтр: она сортирует входные данные и посылает результат на стандартный выход. cat - даже еще проще: она ничего не делает со входными данными, а только выдает все, что не поступит, на выход.
3.8.3 Использование конвейера Мы уже показали, как использовать команду sort в качестве фильтра. Но эти примеры предполагали, что вы откуда-то получили данные в файл, или ввели данные с клавиатуры своими собственными руками. А что, если данные, которые вы хотите отсортировать, являются выходными данными другой программы, например, такой как ls? Если вы используете при сортировке опцию -r, данные будут расположены в порядке, обратном лексикографическому. Если вы хотите получить перечень файлов вашего каталога в обратном порядке, один из способов сделать это будет:
/home/larry/papers# ls
english-list
history-final
masters-thesis
notes
/home/larry/papers# ls > file-list
/home/larry/papers# sort -r file-list
notes
masters-thesis
history-final
english-list
/home/larry/papers#
Здесь мы сохранили результат работы команды ls в файле, а затем выполнили sort -r над этим файлом. Но это очень коряво выглядит и требует создания временного файла для хранения результата работы ls.
Выход из положения дает трубопровод (pipeline) (прим. переводчика: в нашей литературе принят термин "конвейер", так далее и будем переводить "pipeline"). Конвейер - это еще одно замечательное свойство shell, которое позволяет связывать последовательность команд в конвейер, где stdout первой команды посылается прямо на stdin второй команды и так далее. Здесь мы хотим послать stdout команды ls на stdin команды sort. Символ ``|'' олицетворяет конвейер:
/home/larry/papers# ls | sort -r
notes
masters-thesis
history-final
english-list
/home/larry/papers#
Эта команда намного короче и, очевидно, проще набирается. Другой полезный пример. Команда
/home/larry/papers# ls /usr/bin
выдает на дисплей длинный список имен файлов, большинство из которых слишком быстро промелькнет на экране, чтобы вы успели прочитать их. Давайте подключим к просмотру перечня имен файлов каталога /usr/bin команду more.
/home/larry/papers# ls /usr/bin | more
Теперь вы можете постранично листать файл в свое удовольствие.
Но чудеса на этом не кончаются! Мы можем связать в конвейер более, чем две команды. Команда head представляет из себя фильтр, который отображает первые строки входного потока (здесь, пришедшего по конвейеру). Если мы хотим отобразить последнее имя текущего каталога, упорядоченного по алфавиту, мы можем написать:
/home/larry/papers# ls | sort -r | head -1
notes
/home/larry/papers#
где head -1 просто выдает первую строку получаемого входного потока (в данном случае это отсортированный в обратном порядке перечень имен файлов текущего каталога, выданных командой ls).
3.8.4 Перенаправление с добавлением Использование ``>'' для перенаправления выхода смертельно для файла, в который происходит перенаправление (если было, что уничтожать), другими словами
/home/larry/papers# ls > file-list
уничтожает прежнее содержимое файла file-list. Если вместо этого использовать символ перенаправления ``>>'', выход будет добавлен к содержимому названного файла (вместо того, чтобы быть записанным на место старого).
/home/larry/papers# ls >> file-list
добавит выходную информацию команды ls в файл file-list.
Имейте в виду, что перенаправления и конвейер, это средства, предоставляемые оболочкой shell, это синтаксис shell и символы ``>'', ``>>'' и ``|'' не имеют никакого отношения к командам, как таковым.
3.9 Права доступа к файлам
3.9.1 Концепция прав доступа Поскольку UNIX - многопользовательская система, чтобы защитить файлы каждого пользователя от дурного влияния других пользователей, UNIX поддерживает механизм, известный, как система прав доступа к файлам. Этот механизм позволяет каждому файлу приписать конкретного владельца. Как пример, поскольку Larry создал файлы в своем домашнем каталоге, именно Larry владелец этих файлов и имеет к ним доступ.
UNIX позволяет также совместно использовать файлы нескольким пользователям и группам пользователей. Если Larry так пожелает, он может закрыть доступ к своим файлам так, что никто другой не сможет к ним подступиться. Однако в большинстве систем по умолчанию другим пользователям разрешается читать ваши файлы, но запрещается изменять или удалять.
Как объяснялось выше, каждый файл имеет конкретного владельца. Но, кроме того файлами, также владеют конкретные группы пользователей, которые определяются при регистрации пользователей в системе. Каждый пользователь становится членом как минимум одной группы пользователей. Системный администратор может даровать пользователю доступ более, чем к одной группе.
Группы обычно определяются типами пользователей данной машины. Например, в университетском UNIX пользователи могут быть разбиты на группы студент, преподаватель, руководство, гость. (прим. переводчика: осмелюсь предположить, что в отечественной книге перечисление примеров групп было бы начато с группы "руководство"...).
Есть также несколько системно-зависимых групп (вроде bin и admin), которые используются самой системой для управления доступом к ресурсам. Очень редко обычный пользователь принадлежит к этим группам.
Права доступа подразделяются на три типа: чтение (read), запись (write) и выполнение (execute). Эти типы прав доступа могут быть предоставлены трем классам пользователей: владельцу файла, группе, в которую входит владелец, и всем (прочим) пользователям.
Разрешение на чтение позволяет пользователю читать содержимое файлов, а в случае каталогов - просматривать перечень имен файлов в каталоге (используя, например, ls). Разрешение на запись позволяет пользователю писать в файл и изменять его. Для каталогов это дает право создавать в каталоге новые файлы и каталоги, или удалять файлы в этом каталоге. Наконец, разрешение на выполнение позволяет пользователю выполнять файлы (как бинарные программы, так и командные файлы). Разрешение на выполнение применительно к каталогам означает возможность выполнять команды вроде cd.
3.9.2 Интерпретация прав доступа Давайте рассмотрим пример, демонстрирующий работу с правами доступа. Используя команду ls с опцией -l можно получить на экране перечень файлов данного каталога в "длинном" формате, включающем информацию о правах доступа.
/home/larry/foo# ls -l stuff
-rw-r--r-- 1 larry users 505 Mar 13 19:05 stuff
/home/larry/foo#
Первое поле в выведенной строке представляет права доступа. Третье поле - владельца файла (larry) и четвертое - группу (users). Очевидно, что последнее поле есть имя файла (stuff), а остальные поля мы обсудим позже.
Этим файлом владеет larry, и он принадлежит группе users. Давайте посмотрим на права доступа. В строке -rw-r--r-- по порядку указаны права владельца, группы и всех прочих.
Первый символ этой строки прав доступа (``-'') представляет тип файла. Символ ``-'' означает, что это обычный файл (в противоположность каталогу или специальному файлу какого-то устройства). Следующие три позиции (``rw-'') представляют права доступа, которые имеет владелец файла larry. Символ ``r''означает ``read''(читать), ``w'' - ``write''(писать). Таким образом larry может читать файл stuff и писать в него.
Как мы уже упоминали, кроме разрешений на чтение и запись существует разрешение на выполнение ``execute'' - представляемое символом ``x''. Но в данном случае на этой позиции ``-'', так что у Larry нет прав на выполнение этого файла. И это чудесно, файл stuff совсем даже не является программой. Разумеется, поскольку Larry владеет файлом, он может дать сам себе разрешение на выполнение этого файла, если захочет. Мы эту процедуру скоро обсудим.
Следующие три символа r-- представляют права доступа группы для этого файла. Эта группа имеет имя users. Поскольку тут есть только ``r'', любой пользователь этой группы может только читать файл.
Последние три символа представляют ту же комбинацию r--, то есть для всех прочих доступно чтение этого файла и запрещены запись и выполнение.
Вот еще несколько примеров на права доступа.
-rwxr-xr-x
Владелец файла может читать, писать и выполнять файл. Члены группы и все прочие пользователи могут читать и выполнять файл.
-rw-------
Владелец файла может читать и писать в файл. Всем остальным доступ к файлу закрыт.
-rwxrwxrwx
Все могут читать писать и выполнять файл.
3.9.3 Зависимости
Важно заметить, что права доступа, которые имеет файл зависят также от прав доступа к каталогу, в котором этот файл находится. Например, даже если файл имеет -rwxrwxrwx, другие пользователи не смогут до него добраться, если у них не будет прав на чтение и выполнение каталога, в котором находится файл. Например, если Larry захочет ограничить доступ ко всем своим файлам, он может просто изменить права доступа своего домашнего каталога /home/larry на drwx------. Таким образом, никто другой не будет иметь доступ в его каталог, а следовательно посторонним будут недоступны и все файлы. Так что Larry может не заботиться об индивидуальной защите своих файлов.
Другими словами, чтобы иметь доступ к файлу, вы должны иметь доступ ко всем каталогам, лежащим на пути от корня к этому файлу, а также разрешение на доступ собственно к этому файлу.
Обычно пользователи UNIX весьма открыты всеми своими файлами. Обычно файлам устанавливается защита -rw-r--r--, которая позволяет другим пользователям читать файлы, но ни коим образом их не менять. Каталогам обычно устанавливаются права доступа drwxr-xr-x, что позволяет другим пользователям ходить с правами экскурсантов по вашим каталогам. Но ничего в них не трогать и не записывать.
Но многие пользователи хотят держать других пользователей подальше от своих файлов. Установив права доступа файла, -rw------- вы никому не покажете этот файл и не дадите записать в него. Также хорошо закрывает от всех файлы защита соответствующего каталога drwx------ .
3.9.4 Изменение прав доступа Команда chmod используется для установки (изменения) прав доступа файла. Только владелец файла может менять права доступа к нему.
Синтаксис команды имеет вид:
chmod {a,u,g,o}{+,-}{r,w,x} <filenames>
Кратко, вы выбираете из all (все), user (пользователь), group (группа) или other (другие). Далее указываете, либо вы добавляете права (+), либо лишаете прав (-). И наконец, вы указываете один или несколько режимов: read, write или execute. Несколько примеров допустимых команд:
chmod a+r stuff
Дает всем пользователям право читать файл stuff.
chmod +r stuff
То же самое, что и ранее (a - по умолчанию).
chmod og-x stuff
Лишает права на выполнение всех, кроме владельца.
chmod u+rwx stuff
Разрешает владельцу все (read, write и execute).
chmod o-rwx stuff
Запрещает все (read, write и execute) пользователям категории другие (other).
3.10 Управление связями файлов Связи позволяют давать одному физическому файлу много имен. Системой файлы распознаются по индексам файлов, которые являются уникальными идентификаторами в рамках системы. Команда ls -i выдаст вам индексы файлов. На самом деле каталог - это перечень индексов файлов с соответствующими этим индексам номерами. Каждое имя файла в каталоге привязано к конкретному индексу.
3.10.1 Жесткие связи Команда ln используется для создания множества связей для одного файла. Например, скажем, что у вас есть файл foo. Используя ls -i можно посмотреть индекс этого файла.
# ls -i foo
22192 foo
#
Здесь файл foo имеет в файловой системе индекс 22192. Мы можем создать новую связь для этого файла под именем bar:
# ln foo bar
С помощью ls -i можно убедиться, что оба файла имеют один и тот же индекс.
# ls -i foo bar
22192 bar 22192 foo
#
Теперь, обращаясь к foo или bar мы фактически обратимся к одном у тому же файлу. Поэтому, если мы меняем что-то в файле foo, эти же самые изменения произойдут в файле bar.
Эти связи известны, как жесткие связи (hard links), поскольку они реализуются прямой ссылкой на индекс файла. Обратите внимание, что в рамках одной файловой системы вы можете организовать только жесткие связи; символические связи (смотрите ниже) не имеют этого ограничения.
Когда вы удаляете файл командой rm, на самом деле вы удаляете только одну ссылку на файл. Если вы введете команду
# rm foo
Удаляется только связь, имеющая имя foo; bar будет как и прежде существовать. Файл только тогда действительно удаляется, когда на него больше нет связей. Обычно файлы имеют только одну связь, так что команда rm действительно приведет к удалению файла. Однако, если файл имеет много ссылок, применение rm приведет только к удалению одной связи; для того, чтобы удалить файл, вы должны удалить все связи на этот файл.
Команда ls -l покажет число ссылок на файл (кроме прочей информации)
# ls -l foo bar
-rw-r--r-- 2 root root 12 Aug 5 16:51 bar
-rw-r--r-- 2 root root 12 Aug 5 16:50 foo
#
Вторая колонка с цифрой ``2'' показывает число связей файла.
Самом деле оказывается, что каталоги представляют из себя справочник типа "имена-индексы". Кроме прочего, каждый каталог имеет минимум две жесткие ссылки: ``.'' (ссылка, указывающая на самого себя) и ``..'' (ссылка, указывающая на родительский каталог). В корневом каталоге (/) ссылка ``..'' указывает на сам же каталог /.
3.10.2 Символические связи
Символические связи, это другой тип связей, отличающийся от жестких связей. Символические связи позволяют давать новые имена файлам, но при этом не ссылаются на индекс файла.
Команда ln -s создаст символическую ссылку на указанный файл. Например, если мы воспользуемся командой
# ln -s foo bar
мы создадим символьную ссылку bar, указывающую на файл foo. Если теперь используем команду ls -i, то увидим, что два файла имеют различные индексы.
# ls -i foo bar
22195 bar 22192 foo
#
Однако, используя ls -l, мы видим, что файл bar имеет символический указатель на foo.
# ls -l foo bar
lrwxrwxrwx 1 root root 3 Aug 5 16:51 bar -> foo
-rw-r--r-- 1 root root 12 Aug 5 16:50 foo
#
При символической ссылке не используются биты прав доступа (они всегда отображаются, как rwxrwxrwx). Вместо этого, права доступа к файлу, полученному символической ссылкой, определяются правами доступа к файлу, на который он ссылается (в нашем примере определяется правами файла foo).
Функционально, жесткие ссылки и символические ссылки похожи, но есть некоторые различия. Например, вы можете создать символическую ссылку на файл, который не существует; так нельзя сделать применительно к жесткой ссылке. Символические ссылки обрабатываются ядром иным образом, чем жесткие. Это скорее техническое отличие, но иногда важное. Символические ссылки полезны, поскольку они позволяют идентифицировать файл, на который они указывают; для жестких ссылок нет простого способа определить, какие файлы привязаны к одному и тому же индексу.
Ссылки используются во многих местах системы Linux. Символические ссылки особенно важны для образов разделяемых библиотек в /lib. Смотри дополнительную информацию в Разделе 4.7.2.
3.11 Управление работами
3.11.1 Работы и процессы
Управление работами (job control) это возможность, которую предоставляют многие оболочки, включая (Bash и Tcsh). Управление работами (прим. переводчика: job - работа в добрые старые времена страшноватых IBM/360 переводилось как "задание", но лучше это не тащить в сегодня) позволяет управлять множеством команд или работ одновременно. Прежде, чем вы закопаетесь значительно глубже, следует поговорить о процессах.
Каждый раз, когда вы выполняете программу, вы начинаете то, что известно, как процесс. Процесс - это название для выполняемой программы. Команда ps выдает перечень имеющих место в данный момент процессов. Вот пример:
/home/larry# ps
PID TT STAT TIME COMMAND
24 3 S 0:03 (bash)
161 3 R 0:00 ps
/home/larry#
PID (Process IDentificator), перечисленные в первой колонке, это неповторяющиеся числа приписанные всем идущим процессам.
Последний столбец (COMMAND) дает имя выполняемой команды. Здесь мы видим только процессы, которые инициировал Larry. (В системе выполняется и много других процессов. Команда ``ps -aux'' может выдать перечень всех происходящих в данный момент процессов).
В выведенном перечне указаны bash (это оболочка, используемая Larry) и сама команда ps. Как вы видите, bash выполняется параллельно с командой ps. bash выполнит ps, когда Larry введет команду. После окончания ps (после того, как выдана таблица процессов), управление возвращается к процессу bash, который выдает на экран подсказок готовности к приему новых команд.
Выполняемый процесс известен shell как работа. Термины процесс и работа взаимозаменяемы. Однако процесс обычно воспринимается, как "работа", когда речь идет об управлении работами (job control)- свойстве shell, позволяющем уделять внимание нескольким независимым работам.
В большинстве случаев пользователи выполняют в каждый момент времени одну работу, ту которая соответствует последней переданной shell команде. Однако, используя управление работами, вы можете одновременно выполнять несколько работ, по необходимости переключаясь с одной на другую. Какая от этого польза? Давайте предположим, что вы редактируете текстовый файл и неожиданно хотите прерваться и сделать что-то другое. С помощью управления работами вы можете отложить редактирование и, вернувшись к подсказке shell, начать какую-то другую работу. После этого вы можете вернуться к редактированию, именно к тому месту, где вы прервали редактирование. Это всего один пример. Управление работами очень полезно на практике.
3.11.2 Выполнение работ на переднем плане и в фоне
Работы могут выполняться как на переднем плане, так и в фоне. На переднем плане в каждый момент может быть только одна работа. Работа переднего плана, это работа, с которой вы взаимодействуете, она получает информацию с клавиатуры и посылает результаты на ваш экран. (Кроме, разумеется, случаев, когда вы сами перенаправляете вход или выход, как описывалось в Разделе 3.8). С другой стороны, фоновые работы не получают информации с терминала, в общем случае они тихо (в смысле - мирно) выполняются, не испытывая потребности в общении с пользователем.
Некоторые работы требуют очень большого времени для своего завершения и не свершают ничего внешне интересного в процессе этой работы. Компиляция программ - одна из таких работ, как и компрессия больших файлов. Нет вразумительных причин, почему вы должны при этом сидеть рядом и мучительно ждать, когда эти работы закончатся. Вы можете просто запустить их в фоне. Пока они там выполняются, вы можете заняться другими программами.
Работы могут быть также отложены. Отложенная работа - это работа, которая в данный момент не выполняется и временно остановлена. После того, как вы остановили работу, в дальнейшем вы можете ее продолжить как на переднем плане, так и в фоне. Возобновление приостановленной работы не изменит ее состояния - при возобновлении она начнется с того места, на котором была приостановлена.
Имейте в виду, что приостановка работы, это не прерывание работы. Когда вы прерываете идущий процесс (нажимая клавиши прерывания, обычно это ctrl-C), то убиваете процесс насовсем. (Клавиши прерывания можно переустанавливать командой stty. По умолчанию прерывание находится под ctrl-C, но мы не можем это гарантировать для всех систем). Если работа убита, то уж убита, и нет другого способа возобновить ее, как вновь запустить сначала, используя прежнюю команду. Заметим также, что некоторые программы могут перехватывать прерывания, тогда нажатие ctrl-C не приведет к немедленному прекращению работы. Это позволит программе выполнить необходимые операции аккуратного завершения. Некоторые программы вообще не позволят вам их прервать.
3.11.3 Работа в фоне и ликвидация работ
Давайте начнем с простого примера. Команда yes - вроде бы бесполезная команда, посылающая бесконечный поток "y" на стандартный выход. (Но это очень полезно. Если вы направите через конвейер эти "y" на вход другой команды, которая требует ответов yes и "no" на вопросы, поток "y" даст подтверждение на все вопросы). Попробуйте.
/home/larry# yes
y
y
y
y
y
Это закончится в бесконечности. Вы можете убить процесс, нажав клавиши прерывания; обычно это ctrl-C. Чтобы нас больше не раздражал поток нескончаемых "y", перенаправим его в /dev/null. Как вы помните, /dev/null выступает в качестве "черной дыры" для данных. В ней исчезают бесследно любые данные.
/home/larry# yes > /dev/null
Ох, теперь намного лучше. Ничего не печатается, но и подсказка shell не появляется. Это потому, что программа продолжает работать, посылать "y" в /dev/null. Снова нажмите клавиши прерывания, чтобы прекратить это.
Давайте предположим, что мы хотим, чтобы команда yes продолжала работать, но также хотим получить обратно подсказку shell, чтобы выполнять другие работы. Мы можем перевести команду yes в фоновый режим, что позволит ей выполняться, но без выхода на взаимодействие с пользователем.
Чтобы переместить процесс в фоновый режим, необходимо после команды символ ``&''.
/home/larry# yes > /dev/null &
[1] 164
/home/larry#
Вы видите, что мы вновь получили подсказку. Но что значит ``1 164''? И выполняется ли команда yes на самом деле?
``1'' представляет номер работы для программы yes. Shell приписывает номер каждой выполняемой работе. Поскольку "yes" - одна единственная работа, которая в данный момент выполняется, ей присвоен номер 1. ``164'' - идентификатор процесса (PID); это номер, присвоенный системой работе. Любой из этих номеров можно использовать при обращении к работе, как это будет показано в дальнейшем.
Теперь мы имеем выполняемый процесс yes в фоновом режиме, непрерывно посылающий поток "y"-ков в /dev/null. Чтобы проверить состояние этого процесса, используйте внутреннюю команду shell - jobs.
/home/larry# jobs
[1]+ Running yes >/dev/null &
/home/larry#
Ясно, что она выполняется. Вы можете также воспользоваться командой ps, показанной ранее, для проверки статуса работ.
Для завершения работы используйте команду kill. Эта команда может брать в качестве аргумента как номер работы, так и идентификатор процесса. Это была работа номер 1, так что используя команду
/home/larry# kill %1
мы ликвидируем работу. При идентификации работы по номеру необходимо впереди ставить символ процента (``%'').
Теперь, после ликвидации, мы можем снова использовать jobs для проверки:
/home/larry# jobs
[1]+ Terminated yes >/dev/null
/home/larry#
Работа действительно мертва, и если мы снова воспользуемся командой jobs, ничего не будет выведено на экран.
Вы можете также убить работу, используя номер идентификатора процесса (PID), который выводится наряду с работой, когда вы начинаете работу (в фоновом режиме). В нашем пример PID равен 164, так что команда
/home/larry# kill 164
эквивалентна
/home/larry# kill %1
Вам не надо использовать ``%'', когда вы обращаетесь к работе по номеру идентификатора процесса.
3.11.4 Остановка и возобновление работы
Есть другой способ перевести работу в фоновый режим. Вы можете начать работу нормально (в режиме переднего плана), остановить работу и продолжить в фоновом режиме.
Сначала начнем работу "нормально":
/home/larry# yes > /dev/null
Поскольку опять работа выполняется на переднем плане, вы не получите обратно на экран подсказку shell.
Теперь, вместо того, чтобы прерывать работу с помощью ctrl-C, мы остановим работу. Приостановка работы не убивает ее. Чтобы осуществить приостановку работы, надо нажать соответствующие клавиши, обычно это ctrl-Z.
/home/larry# yes > /dev/null
[ctrl-Z]
[1]+ Stopped yes >/dev/null
/home/larry#
Пока работа остановлена, она просто не выполняется. На нее не тратится время процессора. Но вы всегда можете возобновить работу, и она продолжится как ни в чем не бывало.
Для возобновления работы в режиме переднего плана используйте команду fg (``foreground'' - передний план).
/home/larry# fg
yes >/dev/null
Shell снова выдаст на экран имя команды, чтобы вы могли проконтролировать, какую работу вы активизировали в режиме переднего плана. Вновь остановите работу с помощью ctrl-Z. В этот раз используйте команду bg (``background'' - задний план, фоновый режим), чтобы перевести работу в фоновый режим. Эффект будет аналогичен тому, как если бы вы набрали после команды ``&''.
/home/larry# bg
[1]+ yes >/dev/null &
/home/larry#
И мы получили назад подсказку. Команда jobs сообщит, что команда yes действительно выполняется, и мы можем снова ее убить с помощью команды kill, как мы это уже делали.
Как теперь остановить работу? Использование ctrl-Z не поможет, поскольку работа находится в фоновом режиме. Ответ - переместить работу на передний план, а затем остановить. Вы можете использовать fg как для остановленных работ, так и для работ, находящихся в фоне.
Существует большая разница между фоновой работой и остановленной. Остановленная работа не выполняется и не использует время процессора, да и никакой работы, честно говоря, в этот момент не делает (но занимает память, хотя по воле своппинга может оказаться на диске). Работа в фоновом режиме и выполняется, и занимает память. Она может даже выводить что-то на экран, хотя это может раздражать вас, когда вы работаете над чем-то другим. Например, если вы использовали команду:
/home/larry# yes &
без перенаправления stdout в /dev/null, поток "y" будет выводиться на экран без возможности прервать это (вы не сможете использовать ctrl-C для прерывания работ фонового режима). Чтобы остановить эту бесконечную выдачу, вам следует использовать команду fg для перевода работы в режим переднего плана, а затем использовать ctrl-C, чтобы ее убить.
Еще одно замечание. Команды fg и bg обычно переводят на передний план или в фоновый режим работы, которые были остановлены последними (что определяется символом ``+'' после номера работы, это когда вы используете команду jobs). Если вы выполняете много работ одновременно, вы можете перевести на передний план или, наоборот, в фоновый режим конкретную работу заданием идентификатора работы в качестве аргумента команд fg или bg, как в
/home/larry# fg %2
(перевод на передний план работы номер 2) или
/home/larry# bg %3
(перевод в фон работы номер 3).
Для этих команд нельзя использовать идентификаторы процессов. Кроме того, использование только номеров работ, как в
/home/larry# %2
эквивалентно
/home/larry# fg %2
Помните, что управление работами, это свойство shell. Команды fg, bg и jobs - внутренние команды shell. Если по какой-то причине вы используете shell, который не поддерживает управление работами, там вы не найдете этих команд.
В дополнение к этому, есть некоторые аспекты управления работами, которые различаются в Bash и Tcsh. Некоторые оболочки не имеют управления работами, хотя большинство оболочек Linux имеют такую возможность.
3.12 Использование редактора vi
Текстовый редактор, это программа, используемая для редактирования файлов, которые содержат текст, например письма, С-программы или системные конфигурационные файлы. Хотя в Linux много всяких разных редакторов, единственный редактор, который вы с гарантией найдете в любом UNIX - это vi (``visual editor''). vi - это не самый простой в использовании редактор. Но поскольку он так распространен в мире UNIX и в любой момент может вам потребоваться, он заслуживает хоть какого-то описания здесь.
Выбор редактора, это дело персонального вкуса и стиля. Многие пользователи предпочитают витиеватый и мощный Emacs - редактор с самым большим набором возможностей, по сравнению со всеми другими редакторами в мире UNIX. Например, Emacs имеет свой собственный встроенный диалект языка программирования LISP и множество расширений (одно из которых ``Eliza''- в некотором роде программа искусственного интеллекта). Однако, поскольку Emacs со всеми поддерживающими его файлами сравнительно велик, его нет на многих системах. vi, наоборот, маленький и удаленький, но, увы, более сложный в использовании. Но когда вы с ним освоитесь, вы поймете, что он очень простой. Правда осваивать его сложно.
Этот раздел - вразумительное введение в vi. Мы не будем обсуждать все его свойства, а только те, которые вы должны знать, чтобы начать работать. Если вы пожелаете знать больше деталей, обратитесь к страницам Руководства.
3.12.1 Концепции
При использовании vi в любое время вы можете находиться в одном из трех режимов работы. Эти режимы известны как командный режим, режим вставки и режим последней строки.
Когда вы начинаете работать с vi - вы в командном режиме. Этот режим позволяет использовать определенные команды для редактирования файлов или перехода в другие режимы. Например, напечатав ``x'' при нахождении в командном режиме, удаляете символ, находящийся перед курсором. Стрелки передвигают курсор по редактируемому файлу. Большинство команд, используемых в командном режиме, состоит из одного или двух символов.
Вставку или редактирование текста вы осуществляете в режиме вставки. При использовании vi вы, возможно, большую часть времени находитесь именно в этом режиме. Вы переходите в режим вставки с помощью команды ``i'' (``insert'' - вставка) из командного режима. В режиме вставки вы вставляете текст в документ на место, указываемое курсором. Для завершения режима вставки и возврата в командный режим следует нажать esc.
Режим последней строки - это специальный режим, используемый для расширения возможностей командного режима. При вводе таких команд они появляются в последней строке экрана. Например, если вы напечатаете ``:'' в командном режиме, вы перейдете в режим последней строки и сможете использовать такие команды, как ``wq'' (записать (write) файл и выйти (quit) из vi), или ``q!'' (выйти из vi без сохранения изменений). Режим последней строки в общем случае используется для команд vi, которые длиннее одного символа. В режиме последней строки вы вводите однострочные команды и нажимаете enter для их выполнения.
3.12.2 Начала vi
Лучший способ освоить эту концепцию, это вызвать vi и отредактировать файл. В примере ``screens'', приводимом ниже, мы собираемся только показать несколько строк текста, будто бы экран состоит всего из шести строк (вместо двадцати четырех).
Вызов vi
vi <filename>
где <filename> - имя редактируемого файла.
Ну так вызовите vi, напечатав
/home/larry# vi test
для редактирования файла test. Вы увидите нечто вроде
____________________________________________________________________
|~_ |
|~ |
|~ |
|~ |
|~ |
|"test"_[New_file]__________________________________________________|
Столбец символов ``~'' говорит о том, что вы стоите на конце файла.
3.12.3 Вставка текста
Вы находитесь в командном режиме; для того, чтобы вставлять текст в файл, нажмите i (что переведет вас в режим вставки) и начинайте печатать.
____________________________________________________________________
|Now is the time for all good men to come to the aid of the party._ |
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
При вставке текста вы можете напечатать столько строк, сколько пожелаете (нажимая return после каждой строки), и можете корректировать ошибки используя клавишу возврата (backspace).
Для завершения режима вставки и возврата в командный режим нажмите esc.
В командном режиме вы можете использовать клавиши со стрелками для перемещения по файлу. Здесь, поскольку мы имеем только одну строку текста, попытки использовать стрелки "вверх" и "вниз" приведут лишь к тому, что vi на вас загудит.
Есть несколько способов вставки текста, отличных от использования команды i. Например, команда a вставляет в текст, начиная после текущего положения курсора, вместо текущей позиции курсора. Используйте левую стрелку для перемещения курсора между словами ``good'' и ``men''.
____________________________________________________________________
|Now is the time for all good_men to come to the aid of the party. |
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Нажмите a, для начала режима вставки, напечатайте ``wo'', а затем нажмите esc для возврата в командный режим.
____________________________________________________________________
|Now is the time for all good women to come to the aid of the party.|
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Для того, чтобы начать вставку текста в строку ниже текущей, используйте команду ``о''. Например, нажмите o и напечатайте строчку или две
____________________________________________________________________
|Now is the time for all good women to come to the aid of the party.|
|Afterwards, we'll go out for pizza and beer._ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Но помните, что в любое время вы находитесь либо в командном режиме (где команды, такие как i, a или o могут применяться) или в режиме вставки (где вы вставляете текст, а затем с помощью esc возвращаетесь в командный режим) или в режим последней строки (в котором вы расширяете расширяемые команды, как это обсуждается ниже).
3.12.4 Удаление текста
В командном режиме команда "x" удаляет символ перед курсором. Если вы нажмете x пять раз, вы закончите в ситуации:
____________________________________________________________________
|Now is the time for all good women to come to the aid of the party.|
|Afterwards, we'll go out for pizza and _ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Теперь нажмите a, вставьте некоторый текст, а затем нажмите esc:
____________________________________________________________________
|Now is the time for all good women to come to the aid of the party.|
|Afterwards, we'll go out for pizza and Diet Coke._ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Вы можете удалять целые строки, набирая команду dd (т.е. нажимая d дважды). Если ваш курсор на второй строке, и вы напечатали dd,
____________________________________________________________________
|Now is the time for all good women to come to the aid of the party.|
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Чтобы удалить слово, на котором находится курсор, используйте команду dw. Поместите курсор на слово ``good'' и напечатайте dw.
____________________________________________________________________
|Now is the time for all women to come to the aid of the party. |
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
3.12.5 Изменение текста Вы можете заменить фрагменты текста, используя команду R. Поместите курсор на первую букву слова ``party'', нажмите R и напечатайте слово ``hungry''.
____________________________________________________________________
|Now is the time for all women to come to the aid of the hungry._ |
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Использование R для редактирования текста очень походит на на команды i и a, но R заменяет прежний текст вместо вставки в него. Команда r заменяет один символ, отмеченный курсором. Например, переместите курсор на начало слова ``Now'' и напечатайте r, а следом C, то вы получите:
____________________________________________________________________
|Cow is the time for all women to come to the aid of the hungry._ |
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
Команда ``&tilde'' изменяет размер буквы, отмеченной курсором: большую делает маленькой и наоборот. Например, если вы поместите курсор на ``o'' в ``Cow'' и затем последовательно будете нажимать ~, вы в конечном итоге получите:
____________________________________________________________________
|COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. |
|~ |
|~ |
|~ |
|~ |
|~__________________________________________________________________|
3.12.6 Команды перемещения Вы уже знаете, как использовать стрелки для перемещений по документу. Вы также можете использовать команды h, j, k, и l для перемещения курсора влево, вниз, вверх и вправо соответственно. Это удобно, если (по каким-то причинам) ваши клавиши со стрелками не работают как надо.
Команда w перемещает курсор на начало следующего слова; b - перемещает на начало предыдущего слова.
Команда 0 (это ноль) передвигает курсор на начало текущей строки, а команда $ перемещает на конец строки.
При редактировании больших файлов вы хотите перемещаться вперед и назад сразу на размер экрана. Нажатием ctrl-F курсор перемещается на экран вперед, с помощью ctrl-B - на экран назад.
Для того, чтобы переместить курсор в конец файла, напечатайте G. Можно переместиться также на любую строку, напечатав команду 10G вы переместите курсор на десятую строку файла. Для того, чтобы встать на начало (на первую строку), используйте 1G.
Вы можете сочетать команды перемещения с другими командами, такими как удаление. Например, команда d$ удалить от местоположения курсора до конца строки; dG удалит все от курсора до конца файла и т.д.
3.12.7 Сохранение файлов и выход из vi Для выхода из vi без внесения изменений в ранее существовавший файл используйте команду :q!.
Когда вы напечатаете ``:'', курсор переместится на последнюю строку экрана, поскольку вы перейдете в режим последней строки.
____________________________________________________________________
|COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. |
|~ |
|~ |
|~ |
|~ |
|~ |
|:__________________________________________________________________|
В режиме последней строки могут выполняться некоторые расширенные команды. Одна из них - q!, которая позволяет выйти из vi без записи. Команда :wq сохраняет (записывает) файл, а затем выходит из vi. Команда ZZ (в режиме команд, без `:'') эквивалентна :wq. Помните, что вы должны нажать enter после набора команды в режиме последней строки. Если хотите записать файл без выхода из /vi, используйте просто :w.
3.12.8 Редактирование еще одного файла
Для того, чтобы отредактировать другой файл, используйте команду :e. Например, чтобы прекратить редактирование файла test и перейти к редактированию файла foo, используйте команду
____________________________________________________________________
|COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. |
|~ |
|~ |
|~ |
|~ |
|~ |
|:e foo_____________________________________________________________|
Если вы используете :e без предварительного сохранения файла, то сначала вы получите сообщение об ошибке.
____________________________________________________________________
|No_write_since_last_change_(":edit!"_overrides)____________________|
которое просто означает, что vi не желает редактировать другой файл, пока не будет сохранен первый. В этот момент вы можете использовать :w, чтобы сохранить исходный файл, а затем использовать :e или использовать команду
____________________________________________________________________
|COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. |
|~ |
|~ |
|~ |
|~ |
|~ |
|:e! foo_____________________________________________________________|
``!'' говорит vi, что вы на самом деле имеете в виду - редактировать новый файл без сохранения изменений, которые делались в первом.
3.12.9 Включение других файлов
Если вы используете команду :r, вы можете включить содержимое другого файла в текущий файл. Например, команда
:r foo.txt
вставит содержимое файла foo.txt в данное место текста.
3.12.10 Выполнение команд Shell
Вы можете также выполнять команды прямо из vi. Команда :r! работает как :r, но вместо чтения файла она вставляет выход данной команды в буфер, в место, где находится курсор. Например, если вы используете команду
:r! ls -F
вы получите в результате
____________________________________________________________________
|COW IS THE TIME FOR ALL WOMEN TO COME TO THE AID OF THE HUNGRY. |
|letters/ |
|misc/ |
|papers/_ |
|~ |
|~__________________________________________________________________|
Вы можете выполнить команду a, находясь в редакторе vi и вернуться в редактор после ее завершения Например, если вы используете команду
:! ls -F
будет выполнена команда ls -F, а результат выдан на экран, а не вставлен в редактируемый файл. Если вы используете команду
:shell
vi запустит shell, который позволит временно "отложить" vi и выполнить команды. После выхода из shell (используя команду exit) вы вернетесь в vi.
3.12.11 Получение помощи
vi не слишком силен в интерактивной помощи (да и большинство UNIX-ов также), но вы всегда можете посмотреть страницы Руководства для vi. vi - это "визуальная составляющая" редактора ex; это ex делает многое для поддержания режима последней строки и командного режима в vi. Так что в дополнение к чтению Руководства по vi посмотрите также Руководство по ex.
3.13 Установка среды
Shell обеспечивает различные механизмы настройки вашей рабочей среды. Мы уже упоминали ранее, что shell больше, чем команда интерпретации - это также мощный язык программирования. Но обсуждение программирования на shell увело бы нас далеко в сторону, а мы бы хотели познакомить вас с некоторыми способами упрощения вашей работы в UNIX за счет использования некоторых дополнительных полезных свойств shell.
Как мы упоминали ранее, различные оболочки используют различный синтаксис для написания своих программ. Например, Tcsh использует синтаксис, похожий на язык Си, в то время как shell Баурна имеет другой синтаксис. В этом разделе мы не будем заниматься их различиями, а рассмотрим примеры, используя синтаксис shell Баурна (прим. переводчика: как все обычно и делают).
3.13.1 Сценарии shell
прим. переводчика: применительно к программам этого типа в англоязычной литературе последнее время преимущественно используют слово script - "сценарий", хотя то, что под этим имеется в виду во многих книгах на русском называется "традиционно" как "программа на shell" или "командный файл"
Предположим, что вы часто используете серию команд и хотели бы сократить объем постоянной печати за счет группировки их в одну команду. Например, команды
/home/larry# cat chapter1 chapter2 chapter3 > book
/home/larry# wc -l book
/home/larry# lp book
об'единяют файлы, содержащие главы книги: chapter1, chapter2, chapter3 и помещают результат в файл book. Затем подсчитывается число строк в книге (в файле book) и отображается на дисплее и, наконец, печатается командой lp.
Вместо введения каждый раз этих команд, вы можете собрать их в один сценарий (командный файл). Сценарии shell мы кратко опишем в Разделе 3.13.1. А сценарий, который выполнит вышеприведенные команды, будет выглядеть следующим образом
#!/bin/sh
# A shell script to create and print the book
cat chapter1 chapter2 chapter3 > book
wc -l book
lp book
Если этот сценарий будет помещен в файл makebook, то вы можете просто использовать далее команду
/home/larry# makebook
которая выполнит все команды сценария. Сценарии shell - это обычные текстовые файлы, которые вы можете создавать с помощью редактора вроде emacs или vi. (vi обсуждался в Разделе 3.12)
Давайте посмотрим на этот сценарий. Первая строка ``#!bin/sh/'' говорит о том, что этот файл есть сценарий и сообщает shell, как выполнить сценарий. В данном случае необходимо передать сценарий для выполнения команде bin/sh/, где bin/sh/ - сама программа shell. Почему это важно? В большинстве систем UNIX bin/sh/ - это shell Баурновского типа, например bash. Инициируя работу сценария shell выполняется, используя bin/sh/, при этом мы гарантируем, что сценарий будет выполняться именно под shell Баурновского типа (а не, скажем, под C shell). Этот сценарий будет выполняться под shell Баурна, даже если вы используете Tcsh (или какой-то другой C shell) как свою рабочую оболочку.
Вторая строка представляет из себя комментарий. Комментарии начинаются символом ``#'' и могут продолжаться до конца строки - они игнорируются shell и могут использоваться программистом для пояснений.
Остальные строки сценария - обычные команды в том виде, в каком бы вы их вводили прямо на выполнение. Shell читает каждую строку сценария и выполняет эту строку, как будто вы ввели эту строку в ответ на подсказку shell.
Права доступа важны для сценариев. Если вы создали сценарий, вы должны убедиться, что вы имеете права на его выполнение. Если вы создавали сценарий в редакторе, то он (обычно) не получает автоматически прав на выполнение. Можно использовать команду
/home/larry# chmod u+x makebook
чтобы дать самому себе разрешение на выполнение shell-сценария makebook.
3.13.2 Перемещение shell и среда
Shell позволяет определять переменные, как и большинство языков программирования. Переменная - это порция данных, которой дано имя. (прим. переводчика: В языке shell переменные не определяются (в традиционном смысле), так как все они одного типа - "строкового", речь может идти только об их инициировании: присваивании начальных значений).
ВНИМАНИЕ! Имейте в виду, что Tcsh, также, как и C shell, используют различные механизмы определения переменных, отличающиеся от используемых здесь. Здесь обсуждается shell Баурна. Когда вы присвоите значение переменной (используя оператор ``='' ), вы сможете получить это значение, добавив перед именем переменной символ ``$'', как это показано ниже
/home/larry# foo=``hello there''
Переменной foo присвоено значение ``hello there''. Теперь вы можете обратиться к этой переменной, добавив перед именем символ ``$''. Команда
/home/larry# echo $foo
hello there
/home/larry#
дает тот же самый результат, что и
/home/larry# echo ``hello there''
hello there
/home/larry#
Эти переменные являются внутренними для shell. Это означает, что только shell имеет доступ к этим переменным. Это может быть полезно для сценариев; если вам надо сохранить информацию о имени файла, вы, например, можете поместить его в переменную. Команда set может показать вам перечень всех определенных переменных shell.
Shell позволяет экспортировать переменные в среду. Среда - это множество переменных, к которым могут иметь доступ все выполняемые команды. Определив однажды переменную внутри shell (прим. переводчика: определить - здесь означает "присвоить значение"), командой export вы можете передать ее среде.
ВНИМАНИЕ! Здесь вновь есть отличие между Bash и Tcsh. При использовании Tcsh используется другой синтаксис для помещения переменных в среду (используется команда setenv). Дополнительную информацию можно найти в Руководстве по Tcsh.
Среда очень важна в системах UNIX. Она позволяет конфигурировать некоторые команды за счет установки переменных, о которых знают команды.
Вот небольшой пример. Переменная среды PAGER используется командой man. Она указывает команду, которая используется в свою очередь командой man для просмотра Руководства на экране. Если вы установите в качестве значения PAGER имя другой команды, то эта команда вместо будет обеспечивать просмотр вместо more (которая применялась по умолчанию).
Присвойте PAGER значение ``cat''. Выдача на экран руководства будет вся разом, а не поэкранно, как это делала команда more.
/home/larry# PAGER=cat
Теперь экспортируйте PAGER в среду.
/home/larry# export PAGER
Попробуйте команду man ls. Руководство промелькнет по вашему экрану без (желательных) задержек.
Теперь, если присвоить PAGER значение ``more'', то для выдачи на экран будет использоваться команда more.
/home/larry# PAGER=more
Обратим внимание на то, что нам не надо заново использовать команду export после изменения значения PAGER. Необходимо только раз экспортировать переменную; любые изменения, которые будут происходить после этого, будут отражаться в среде.
Страницы Руководства для конкретных команд содержат информацию о том, использует ли команда какие-то переменные среды. Например, Руководство по команде man говорит о том, что для определения режима выдачи страницы руководства на экран используется переменная PAGER. Некоторые команды совместно используют переменные среды, например, многие команды используют переменную среды EDITOR для указания используемого редактора.
Переменные среды используются также для сохранения важной информации о процедуре входа. Например переменная HOME содержит имя вашего домашнего каталога.
/home/larry/papers# echo $HOME
/home/larry
Другая интересная переменная среды - PS1, которая определяет главную подсказки shell. Например,
/home/larry# PS1=``Your command, please: ''
Your command, please:
Для переустановки подсказки обратно в нормальное состояние (когда она показывает текущий рабочий каталог, после которого следует значек ``#''), выполните следующее:
Your command, please: PS1=``\w# ''
/home/larry#
В Руководстве bash есть подробное описание синтаксиса, используемого при установке подсказки.
3.13.2.1 Переменная среды PATH Когда вы используете команду ls, как shell находит соответствующий выполняемый файл (программу) для ls? На самом деле в большинстве систем ls находится в /bin/ls. shell использует переменную среды PATH ("ТРОПА") для указания возможного местоположения выполняемых файлов соответствующих команд.
Например, ваша переменнаяPATH может иметь значение
/bin:/usr/bin:/usr/local/bin:.
Это список каталогов (в которых shell будет искать команду), отделяемых друг от друга двоеточием ``:''. Когда вы используете команду ls, shell прежде всего проверяет наличие /bin/ls, затем /usr/bin/ls и т.д.
Обратите внимание на то, что переменная PATH не помогает находить обычные файлы. Например, если вы используете команду
/home/larry# cp foo bar
shell не использует PATH для нахождения местопребывания файлов foo и bar - предполагается, что эти имена однозначно определяют место. shell использует PATH только для нахождения команды cp.
Это экономит вам массу времени; это означает, что вы не обязаны помнить, где находятся выполняемые файлы команд. Во многих системах выполняемые файлы разбросаны во многих местах, таких как /usr/bin, /bin или /usr/local/bin. Вместо того, чтобы писать полное имя команды (вроде /usr/bin/cp), вы просто указываете в PATH перечень каталогов, которые бы вы хотели, чтобы shell автоматически просматривал.
Обратите внимание, что PATH содержит ``.'', что означает "текущий рабочий каталог". Это позволяет вам создавать shell-сценарии или программы и выполнять их как команды из текущего каталога, без необходимости указывать это прямо (как в случае ./makebook). Если каталог не указан в PATH, то shell не будет его просматривать в поиске команд, это касается и текущего каталога.
3.13.3 Shell-Сценарии инициализации
В дополнение к shell-сценариям, которые создаете вы, существует множество сценариев, которые использует сам shell для своих целей. Наиболее важными среди них являются сценарии инициализации, которые автоматически выполняются shell при вашем входе в систему.
Сценарии инициализации сами по себе - это обычные сценарии, как это описывалось выше. Но они очень полезны при установке вышей среды путем автоматического выполнения набора команд при вашем входе в систему. Например, если вы всегда используете команду mail для проверки своей почты в момент входа в систему, вы можете поместить эту команду в свой сценарий инициализации и она будет выполнена автоматически.
Как Bash, так и Tcsh делают различие между начальным shell (вызываемым при входе в систему) и прочими вызовами shell. Начальный shell вызывается в момент входа пользователя в систему; часто это единственный экземпляр shell, который вы используете. Но если вы вызываете shell из другой программы, такой какvi, вы тем самым запускаете новый (экземпляр) shell. Кроме того, когда вы запускаете на выполнение shell-сценарии, вы автоматически инициируете новый экземпляр shell.
Файлы инициализации, используемые в Bash: /etc/profile (устанавливается системным администратором, выполняется всеми экземплярами начальных пользовательских bash, вызванными при входе пользователей в систему), $HOME/.bash_profile (выполняется при входе пользователя) и $HOME/.bashrc (выполняемый всеми прочими не начальными экземплярами bash). Если .bash_profile отсутствует, вместо него используется .profile.
Tcsh использует следующие сценарии инициализации: /etc/csh.login (выполняется всеми пользовательскими tcsh в момент входа в систему), $HOME/.tcshrc (выполняется во время входа в систему и всеми новыми экземплярами tcsh) и $HOME/.login (выполняется во время входа после .tcshrc). Если .tcshrc отсутствует, вместо него используется .cshrc.
Для того, чтобы лучше понять функции этих файлов, вам следует больше узнать о shell. Программирование на shell сложный вопрос, далеко выходящий за рамки этой книги. Дополнительную информацию можно получить из Руководства на bash и tcsh.
3.14 Не хотите ли отправиться в самостоятельное плавание
Надеемся, что мы дали достаточно информации относительно того, как использовать систему. Имейте в виду, что большая часть интересных и важных аспектов Linux здесь не обсуждалась - здесь рассматривались только самые базовые. Но этот фундамент поможет вам быстро освоить и использовать более сложные приложения. Если все рассмотренное здесь вам не показалось волнующе интересным, не унывайте - в Linux есть еще много того, с чем следовало бы познакомиться. Один из незаменимых способов изучения системы - это чтение Руководства. Хотя многие страницы Руководства могут выглядеть и достаточно сложными, если вы будете достаточно глубоко копать, вы откопаете несметные россыпи полезной информации.
Мы также советуем прочитать какую-то полную книгу по системе UNIX. В UNIX значительно больше разнообразных возможностей, чем можно увидеть с первого взгляда - к сожалению, они выходят за рамки этой книги. Некоторые хорошие книги по UNIX указаны в Приложении A.
взято тут
http://www.xserver.ru/computer/os/linux/46/3.shtml
Счастье есть - его не может не быть.
Не бойся смерти - бойся непрожитой жизни.
Как бы не было плохо, нужно расслабиться и получать удовольствие, а если хорошо, то тем более.
Мозги надо менять а не конституцию.
Это мы то нубы?! Да я вас всех продам, куплю, а потом еще раз продам но уже дороже!!!
<> ужос...сегодня впервые за пару месяцев на ночь выключил комп.......
<> еле в этой долбаной тишине уснул.......