Пиши Дома Нужные Работы

Обратная связь

Стандартный ввод и стандартный вывод.

Многие команды Linux получают информацию с так называемого стандартного ввода и посылают информацию на (опять же) так называемый стандартный вывод. (Для них часто используются сокращения ``stdin'' и ``stdout'' соответственно). Ваш shell организует дело так, что стандартным вводом служит клавиатура, а стандартным выводом экран.

Вот пример использования команды cat. Нормально cat читает данные из файлов, чьи имена даны в командной строке и посылает эти данные прямехонько на stdout. Поэтому при выполнении команды:

 

/home/larry/papers# cat history-final masters-thesis

 

на экран пойдет файл history-final, а за ним следом masters-thesis.

Но если команде cat не даны имена файлов в качестве параметров, она читает данные с stdin и опять же посылает на stdout. Вот пример:

 

/home/larry/papers# cat

Hello there

Hello there

Bye

Bye

 

Ctrl-D

 

/home/larry/papers#

 

 

Как видите, каждая строка, которую напечатал пользователь, немедленно выдается командой cat на экран. При вводе со стандартного входа команда знает, что ввод закончен тогда, когда она получит в каком-то виде сигнал EOT (End-Of-Text). Обычно он обеспечивается нажатием ctrl-D.

Вот другой пример. Команда сортировки sort читает построчно текст (здесь опять с stdin, поскольку имена файлов в параметрах не указаны, и посылает отсортированный результат на stdout. Попробуйте так:

 

/home/larry/papers# sort

bananas

carrots

apples

Ctrl-D

apples

bananas

 

/home/larry/papers#

 

Теперь мы можем упорядочить наш список продуктов, подлежащих закупке, в алфавитном порядке... ну разве Linux не полезная вещь?

Перенаправление ввода и вывода.

 

Теперь, предположим, что мы хотим послать результат сортировки в файл, чтобы где-то сохранить список планируемых покупок. 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 даже еще проще: она ничего не делает со входными данными, а только выдает все, что не поступит, на вывод.

Использование конвейера.

Мы уже показали, как использовать команду sort в качестве фильтра. Но эти примеры предполагали, что вы откуда-то получили данные в файл, или ввели данные с клавиатуры своими собственными руками. А что, если данные, которые вы хотите отсортировать, являются выходными данными другой программы, например, такой как ls?

Если вы используете при сортировке опцию -r, данные будут расположены в порядке, обратном алфавитному. Если вы хотите получить перечень файлов вашего каталога в обратном порядке, один из способов сделать это будет:

 

/home/larry/papers# 1s

english-list

hist ory-final

masters-thesis

notes/

 

Здесь мы сохранили результат работы команды ls в файле, а затем выполнили sort -r над этим файлом. Но это очень коряво выглядит и требует создания временного файла для хранения результата работы ls:

 

/home/larry/papers# Is > file-list

/home/larry/papers# sort -r file-list

notes/

masters-thesis

history-final

english-list

/home/larry/papers#

 

Выход из положения дает трубопровод (pipeline) (прим. переводчика: в нашей литературе принят термин "конвейер", так далее и будем переводить "pipeline"). Конвейер это еще одно замечательное свойство shell, которое позволяет связывать последовательность команд в конвейер, где stdout первой команды посылается прямо на stdin второй команды и так далее. Здесь мы хотим послать stdout команды ls на stdin команды sort. Символ ``|'' олицетворяет конвейер:

 

/home/larry/papers# Is sort

notes/

masters-thesis

history-final

english-list

/home/larry/papers#

 

Эта команда намного короче и, очевидно, проще набирается. Другой полезный пример. Команда:

 

/home/larry/papers# Is /usr/bin

 

выдает на дисплей длинный список имен файлов, большинство из которых слишком быстро промелькнет на экране, чтобы вы успели прочитать их. Давайте подключим к просмотру перечня имен файлов каталога /usr/bin команду more:

 

/home/larry/papers# Is /usr/bin|more

 

Теперь вы можете постранично листать список файлов в свое удовольствие.

Но чудеса на этом не кончаются! Мы можем связать в конвейер более, чем две команды. Команда head представляет из себя фильтр, который отображает первые строки входного потока (здесь, пришедшего по конвейеру). Если мы хотим отобразить последнее имя текущего каталога, упорядоченного по алфавиту, мы можем написать:

 

/home/larry/papers# Is|sort -r head -1

notes/

 

/home/larry/papers#

 

где head -1 просто выдает первую строку получаемого входного потока (в данном случае это отсортированный в обратном порядке перечень имен файлов текущего каталога, выданных командой ls).

Перенаправление вывода с добавлением.

Использование ``>'' для перенаправления выхода смертельно для файла, в который происходит перенаправление (если было, что уничтожать), другими словами:

 

/home/larry/papers# Is>file-list

 

уничтожает прежнее содержимое файла file-list. Если вместо этого использовать символ перенаправления ``>>'', выход будет добавлен к содержимому названного файла (вместо того, чтобы быть записанным на место старого):

 

/home/larry/papers# Is>>file-list

 

добавит выходную информацию команды ls в файл file-list.

Права доступа.

 

Концепция прав доступа.

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

Linux позволяет также совместно использовать файлы нескольким пользователям и группам пользователей. Если Larry так пожелает, он может закрыть доступ к своим файлам так, что никто другой не сможет к ним подступиться. Однако в большинстве систем по умолчанию другим пользователям разрешается читать ваши файлы, но запрещается изменять или удалять.

Как объяснялось выше, каждый файл имеет конкретного владельца. Но, кроме того файлами, также владеют конкретные группы пользователей, которые определяются при регистрации пользователей в системе. Каждый пользователь становится членом как минимум одной группы пользователей. Системный администратор может даровать пользователю доступ более, чем к одной группе.

Группы обычно определяются типами пользователей данной машины. Например, в университетском Linux пользователи могут быть разбиты на группы student, >staff, faculty, guest. Есть также несколько системно-зависимых групп (вроде bin и admin), которые используются самой системой для управления доступом к ресурсам. Очень редко обычный пользователь принадлежит к этим группам.

Права доступа подразделяются на три типа: чтение (read), запись (write) и выполнение (execute). Эти типы прав доступа могут быть предоставлены трем классам пользователей: владельцу файла, группе, в которую входит владелец, и всем прочим пользователям.

Разрешение на чтение позволяет пользователю читать содержимое файлов, а в случае каталогов - просматривать перечень имен файлов в каталоге (используя, например, ls). Разрешение на запись позволяет пользователю писать в файл и изменять его. Для каталогов это дает право создавать в каталоге новые файлы и каталоги, или удалять файлы в этом каталоге. Наконец, разрешение на выполнение позволяет пользователю выполнять файлы (как бинарные программы, так и командные файлы). Разрешение на выполнение применительно к каталогам означает возможность выполнять команды вроде cd.

Интерпретация прав доступа.

Давайте рассмотрим пример, демонстрирующий работу с правами доступа. Используя команду ls с опцией -l можно получить на экране перечень файлов данного каталога в "длинном" формате, включающем информацию о правах доступа:

 

/home/larry/foo# Is -1 stuff

-rw-r-r- 1 larry users 505 Mar 13 J.9'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 Все пользователи имеют право на чтение, запись и выполнение.

 

Зависимости.

Важно заметить, что права доступа, которые имеет файл зависят также от прав доступа к каталогу, в котором этот файл находится. Например, даже если файл имеет -rwxrwxrwx, другие пользователи не смогут до него добраться, если у них не будет прав на чтение и выполнение каталога, в котором находится файл. Например, если Larry захочет ограничить доступ ко всем своим файлам, он может просто изменить права доступа своего домашнего каталога /home/larry на drwx------. Таким образом, никто другой не будет иметь доступ в его каталог, а следовательно посторонним будут недоступны и все файлы. Так что Larry может не заботиться об индивидуальной защите своих файлов.

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

Обычно пользователи Linux весьма открыты всеми своими файлами. Обычно файлам устанавливается защита -rw-r--r--, которая позволяет другим пользователям читать файлы, но никоим образом их не менять. Каталогам обычно устанавливаются права доступа drwxr-xr-x, что позволяет другим пользователям ходить с правами экскурсантов по вашим каталогам. Но ничего в них не трогать и не записывать.

Но многие пользователи хотят держать других пользователей подальше от своих файлов. Установив права доступа файла, -rw------- вы никому не покажете этот файл и не дадите записать в него. Также хорошо закрывает от всех файлы защита соответствующего каталога drwx------ .

Изменение прав доступа.

Команда chmod используется для установки (изменения) прав доступа файла. Только владелец файла может менять права доступа к нему.

Синтаксис команды имеет вид:

 

chmod {a, u, g, o}{+/-}{r, w, x} filenames

 

Кратко, вы выбираете из all (все), user (пользователь), group (группа) и other (другие). Далее указываете, либо вы добавляете права (+), либо лишаете прав (-). И наконец, вы указываете один или несколько режимов: read, write или execute. Несколько примеров допустимых команд:

 

chmod a+r stuff Предоставить всем право на чтение.

chmod +r stuff То же самое (a принимается по умолчанию).

climod og-x stuff Запретить всем, кроме владельца, выполнять файл.

climod u+rwx stuff Предоставить владельцу полный контроль (чтение, запись

и выполнение) над файлом.

climod o-rwx stuff Запретить какой-либо доступ к файлу всем пользователям,

кроме его владельца и членов его группы.

 

 

Управление связями.

 

Связи позволяют давать одному физическому файлу много имен. Системой файлы распознаются по индексам файлов (inode), которые являются уникальными идентификаторами в рамках системы. Команда ls -i выдаст вам индексы файлов. На самом деле каталог это перечень индексов файлов с соответствующими этим индексам номерами. Каждое имя файла в каталоге привязано к конкретному индексу.

Жесткие связи.

Команда ln используется для создания множества связей для одного файла. Например, скажем, что у вас есть файл foo. Используя ls -i можно посмотреть индекс этого файла:

 

/home/larry# ls -i foo

22192 foo

 

/home/larry#

 

Здесь файл foo имеет в файловой системе индекс 22192. Мы можем создать новую связь для этого файла под именем bar:

 

/home/larry# In foo bar

 

С помощью ls -i можно убедиться, что оба файла имеют один и тот же индекс:

 

/home/larry# Is -i foo bar

22192 bar 22192 foo

 

/home/larry#

 

Теперь, обращаясь к foo или bar мы фактически обратимся к одном у тому же файлу. Поэтому, если мы меняем что-то в файле foo, эти же самые изменения произойдут в файле bar.

Эти связи известны, как жесткие связи (hard links), поскольку они реализуются прямой ссылкой на индекс файла. Обратите внимание, что в рамках одной файловой системы вы можете организовать только жесткие связи; символические связи (смотрите ниже) не имеют этого ограничения.

Когда вы удаляете файл командой rm, на самом деле вы удаляете только одну ссылку на файл. Если вы введете команду:

 

/home/larry# rm foo

 

удаляется только связь, имеющая имя foo; bar будет как и прежде существовать. Файл только тогда действительно удаляется, когда на него больше нет связей. Обычно файлы имеют только одну связь, так что команда rm действительно приведет к удалению файла. Однако, если файл имеет много ссылок, применение rm приведет только к удалению одной связи; для того, чтобы удалить файл, вы должны удалить все связи на этот файл.

Команда ls -l покажет число ссылок на файл (кроме прочей информации):

 

/home/larry# Is -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

 

/home/larry#

 

Вторая колонка с цифрой ``2'' показывает число связей файла.

На самом деле оказывается, что каталоги представляют из себя справочник типа "имена-индексы". Кроме прочего, каждый каталог имеет минимум две жесткие ссылки: ``.'' (ссылка, указывающая на самого себя) и ``..'' (ссылка, указывающая на родительский каталог). В корневом каталоге (/) ссылка ``..'' указывает на сам же каталог /.

Символические связи.

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

Команда ln -s создаст символическую ссылку на указанный файл. Например, если мы воспользуемся командой:

 

/home/larry# In -s foo bar

 

мы создадим символьную ссылку bar, указывающую на файл foo. Если теперь используем команду ls -i, то увидим, что два файла имеют различные индексы:

 

/home/larry# Ls -i foo bar

22195 bar 22192 foo

 

/home/larry#

 

Однако, используя ls -l, мы видим, что файл bar имеет символический указатель на foo:

 

/home/larry# Is -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

 

/home/larry#

 

При символической ссылке не используются биты прав доступа (они всегда отображаются, как rwxrwxrwx). Вместо этого, права доступа к файлу, полученному символической ссылкой, определяются правами доступа к файлу, на который он ссылается (в нашем примере определяется правами файла foo).

Функционально, жесткие ссылки и символические ссылки похожи, но есть некоторые различия. Например, вы можете создать символическую ссылку на файл, который не существует; так нельзя сделать применительно к жесткой ссылке. Символические ссылки обрабатываются ядром иным образом, чем жесткие. Это скорее техническое отличие, но иногда важное. Символические ссылки полезны, поскольку они позволяют идентифицировать файл, на который они указывают; для жестких ссылок нет простого способа определить, какие файлы привязаны к одному и тому же индексу (inode).

Ссылки используются во многих местах системы Linux. Символические ссылки особенно важны для образов разделяемых библиотек в /lib. См. дополнительную информацию.

Управление работами.

 

 

Задачи и процессы.

 

Управление работами (job control) это возможность, которую предоставляют многие оболочки, включая (Bash и Tcsh). Управление работами позволяет управлять множеством команд или работ одновременно. Прежде, чем вы закопаетесь глубже, следует поговорить о процессах.

Каждый раз, когда вы выполняете программу, вы начинаете то, что известно, как процесс. Процесс это название для выполняемой программы. Команда 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.12.2 Выполнение работ на переднем плане и в фоне.

Работы могут выполняться как на переднем плане, так и в фоне. На переднем плане в каждый момент может быть только одна работа. Работа переднего плана, это работа, с которой вы взаимодействуете, она получает информацию с клавиатуры и посылает результаты на ваш экран. (Кроме, разумеется, случаев, когда вы сами перенаправляете ввод или вывод, как описывалось выше). С другой стороны, фоновые работы не получают информации с терминала, в общем случае они тихо выполняются, не испытывая потребности в общении с пользователем.

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

Работы могут быть также отложены. Отложенная работа, это работа, которая в данный момент не выполняется и временно остановлена. После того, как вы остановили работу, в дальнейшем вы можете ее продолжить как на переднем плане, так и в фоне. Возобновление приостановленной работы не изменит ее состояния: при возобновлении она начнется с того места, на котором была приостановлена.

Имейте в виду, что приостановка работы, это не прерывание работы. Когда вы прерываете идущий процесс (нажимая клавиши прерывания, обычно это ctrl-C), то убиваете процесс насовсем. Клавиши прерывания можно переустанавливать командой stty. По умолчанию прерывание находится на ctrl-C, но мы не можем это гарантировать для всех систем. Если работа убита, то уж убита, и нет другого способа возобновить ее, как вновь запустить сначала, используя прежнюю команду. Заметим также, что некоторые программы могут перехватывать прерывания, тогда нажатие ctrl-C не приведет к немедленному прекращению работы. Это позволит программе выполнить необходимые операции аккуратного завершения. Некоторые программы вообще не позволят вам их прервать.






ТОП 5 статей:
Экономическая сущность инвестиций - Экономическая сущность инвестиций – долгосрочные вложения экономических ресурсов сроком более 1 года для получения прибыли путем...
Тема: Федеральный закон от 26.07.2006 N 135-ФЗ - На основании изучения ФЗ № 135, дайте максимально короткое определение следующих понятий с указанием статей и пунктов закона...
Сущность, функции и виды управления в телекоммуникациях - Цели достигаются с помощью различных принципов, функций и методов социально-экономического менеджмента...
Схема построения базисных индексов - Индекс (лат. INDEX – указатель, показатель) - относительная величина, показывающая, во сколько раз уровень изучаемого явления...
Тема 11. Международное космическое право - Правовой режим космического пространства и небесных тел. Принципы деятельности государств по исследованию...



©2015- 2024 pdnr.ru Все права принадлежат авторам размещенных материалов.