Знакомство с Linux

Александр Соловьев
Оглавление

13.Установка среды

Shell обеспечивает различные механизмы настройки вашей рабочей среды. Мы уже упоминали ранее, что shell больше, чем команда интерпретации - это также мощный язык программирования. Но обсуждение программирования на shell увело бы нас далеко в сторону, а мы бы хотели познакомить вас с некоторыми способами упрощения вашей работы в UNIX за счет использования некоторых дополнительных полезных свойств shell.

Как мы упоминали ранее, различные оболочки используют различный синтаксис для написания своих программ. Например, Tcsh использует синтаксис, похожий на язык Си, в то время как shell Баурна имеет другой синтаксис. В этом разделе мы не будем заниматься их различиями, а рассмотрим примеры, используя синтаксис shell Баурна (прим. переводчикf: как все обычно и делают).

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.

В начало страницы

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 есть подробное описание синтаксиса, используемого при установке подсказки.

В начало страницы

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 не будет его просматривать в поиске команд, это касается и текущего каталога.

В начало страницы

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.


<<< Оглавление Страница: 13   >>>