Приемы профессиональной работы в UNIX

         

ПОСТРОЧНЫЙ РАЗБОР ПРИМЕРА ФАЙЛА НАСТРОЙКИ


Строки 3-8 делают хитрую установку главной подсказки - переменной PS1. В строке 3 инициализируется переменная, которая выбирает подсказку. Значение ushort жестко закодировано в файле, но вы всегда можете запросить его или установить его в зависимости от файла.

Первой альтернативой является ufull, используемая для установки подсказки в виде полного имени узла uucp в локальной системе. Вы выбираете такую подсказку, если используете несколько машин и для доступа к одной машине применяете другую. Отличительная подсказка напоминает вам, какой машиной вы пользуетесь. Отметим, что подсказка имеет одинаковое число символов и для короткой строки, и для длинной. Если же вам нужно имя узла uucp, но не нужна длинная строка для подсказки, вы можете выбрать ushort, что дает первые три символа имени узла. Как показано в строке 6, имя получается применением команды uuname для получения локального имени узла (опция -l). Затем это имя пропускается через команду cut, которая вырезает символы с первого по третий. Результат присваивается переменной подсказки.

Последняя альтернатива для тех из вас, кто имеет графические символы. Назначение в строке 7 есть греческий символ. Его можно получить применением специальных управляющих последовательностей, которые указывают терминалам отображение специальных символов. Символы ^[ являются визуальным представлением управляющего символа в программе vi. Вы можете получить этот символ в программе vi, набрав control-v, а затем ESC. Последовательность ESC[12m означает, что следующий символ будет напечатан как графический. Символ j является вашей подсказкой и превращается в графический символ, который выдается на ваш экран. Используя различные символы алфавита, вы можете иметь в виде вашей подсказки почти любой графический символ. ESC[10m возвращает ваш терминал в режим обычного текста, так что все символы, печатаемые после того, как вы набрали ESC[10m, являются нормальными.

Если вы хотите сохранить вашу пользовательскую подсказку для всех подчиненных интерпретаторов shell, экспортируйте ее. Иначе вы получите $ для всех интерпретаторов shell нижнего уровня.


Строка 10 присваивает переменной LOGNAME выход команды logname(1). Команда logname - это обычная команда системы UNIX, которая печатает ваше регистрационное имя из файла /etc/passwd. Обычно эта переменная установлена для вас системой, но данный пример показывает, как вы можете установить ее вручную.

Строка 11 инициализирует переменную HOME. Она тоже устанавливается для вас системой, но мы хотим показать, как делать эти вещи осознанно, а не по умолчанию. Сначала мы ищем в файле паролей запись, соответствующую переменной LOGNAME. Мы ищем от начала строки имя, которое завершается символом :, чтобы убедиться, что найдено только корректное соответствие имени пользователя. Затем вся запись посылается команде cut, которая вырезает шестое поле - регистрационный каталог. Преимущество такой стратегии в том, что регистрационный каталог автоматически меняется, если меняется запись в файле /etc/passwd.

Строка 12 инициализирует переменную MAIL. Определяя MAIL, вы указываете, что вы должны быть уведомлены о посылке вам новой почты, если вы находитесь в режиме on line. Строка 13 экспортирует эти переменные, так что они доступны нам в порожденных интерпретаторах shell.

Строки 15-24 определяют все каталоги первого уровня в нашем регистрационном каталоге. Большинство имен состоят из двух букв, некоторые из трех. Теперь мы можем применять команды такого вида:

$ cd $HD $ ls -R $HSR $ cu -ltty00 dir | tee $HBB/board/session$$

Строка 25 присваивает переменной HDIRS все имена каталоговых переменных, что облегчает подключение всех каталогов без повторного ввода их имен. Мы можем просмотреть все каталоги и напечатать размер используемого дискового пространства:

$ for DIR in $HDIRS > do > echo "disk usage for $DIR: `du -s $DIR`" > done

Строка 26 экспортирует переменные так, чтобы мы могли всегда их использовать. Отметим, что мы экспортировали $HDIRS и HDIRS. Перед тем, как выполнить экспортирование, $HDIRS было распространено на все различные имена переменных. Следовательно, фактически мы экспортировали все имена плюс саму переменную HDIRS.



Строка 28 инициализирует P так, чтобы это был ваш каталог в PUBDIR, то есть /usr/spool/uucppublic. Теперь у нас есть простой способ ссылаться на наши файлы при работе с командой uucp.

Строка 30 устанавливает CDPATH. Это путь, который проверяется, когда вы выполняете команду cd. Сначала проверяется текущий каталог (.) на предмет того, есть ли в нем имя каталога, в который вы хотите попасть. Затем проверяется .. (родительский каталог). После этого просматривается ваш регистрационный каталог. Последним назначением CDPATH является $HDIRS, что подключает имена всех подкаталогов. Цель этих имен - позволить команде cd искать в соответствующем каталоге введенное вами имя.



Например, если бы вы были в /etc и набрали "cd doc", вы бы попали в $HOME/doc, поскольку CDPATH содержало в себе $HOME. Аналогично, если бы вы имели подкаталог $HOME/doc/status и ввели "cd status" откуда-либо из другого места в системе, вы бы пришли в $HOME/doc/status, так как корень $HOME/doc был в CDPATH.

Порядок поиска в каталогах такой же, как объявлено в переменной CDPATH. Если вы вводите имя каталога, которое встречается более чем в одном месте, вы попадаете в первый каталог, обнаруженный при последовательном поиске. Например, если бы вы сказали "cd sys", то попали бы в $HOME/sys прежде, чем в $HOME/ src/sys.

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

Таблица 1-1 Три способа использования команды cd

Абсолютный CDPATH переменной Относительно
cd /usr/russ cd cd $HOME
cd /usr/russ/src/asm cd asm cd $HSR/asm
cd /usr/russ/doc/paper/conf cd paper/conf cd $HD/paper/conf
cd /usr/russ/tmp cd tmp cd $HT
Строка 31 инициализирует переменную PATH. PATH работает таким же образом, как CDPATH. Она ищет программы, которые нужно запустить, в каждом каталоге, указанном в переменной PATH. Если имя не найдено ни в одном из этих каталогов, печатается сообщение ": not found" ("<имя-файла>: не найдено").



Поскольку мы можем установить наш PATH как угодно, можно указать все таинственные места в системе, в которых расположены исполняемые модули. Когда мы хотим их выполнить, мы не обязаны их искать и набирать полное маршрутное имя. Чтобы дополнить PATH, введите, например, следующее:

PATH=$PATH:/usr/lib/uucp

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

Строка 32 инициализирует переменную SHELL. Эту переменную могут использовать не более чем одна или две утилиты. Обычно она устанавливается системой, когда вы регистрируетесь. Строка 33 экспортирует переменные CDPATH, PATH и SHELL.

Строки 35-39 - это хитрый способ установки определений терминалов. Строка 35 начинается со спрятанной команды tty, заключенной в знаки ударения (`...`). Выходом команды tty является "/dev/tty00". Затем мы берем основное имя этой строки, т.е. "tty00". Далее мы используем структуру переключателя по этому значению, чтобы увидеть, что мы хотим сделать для каждого конкретного терминала. Команды tset, показанные здесь, относятся к среде XENIX и могут быть неприемлемыми в вашей среде.

Строка 41 делает эхо-отображение значения TERM на экран, чтобы сообщить вам тип вашего терминала, если он вам нужен. Это значение доступно, если описанная ранее команда tset устанавливает для вас TERM как часть своей обычной работы.

В строке 42 устанавливается переменная TERMCAP, указывающая на /etc/termcap. Это обычный способ установки переменной TERMCAP. Другой способ - присвоить TERMCAP текущую закодированную строку, которая находится в файле описания терминала. Если TERMCAP установлен на закодированную строку, то утилите vi нет необходимости обращаться к файловому вводу-выводу, чтобы получить характеристики вашего терминала. Строка 43 экспортирует эти значения так, чтобы они были доступны на любом уровне интерпретатора shell.

Строка 45 устанавливает частотную переменную. Это переменная из XENIX и, возможно, имеется в System V. Она используется для установки информации о времени.



Строка 46 устанавливает информацию о зоне времени, как это требуется в библиотечном вызове ctime(3). Имея переменную TZ, вы можете перекрыть подразумеваемую зону времени при доступе ко времени из программы на языке Си. Строка 47 экспортирует эти переменные.

Строка 49 устанавливает ваше значение маски пользователя (umask). Она управляет подразумеваемым разрешением доступа для всех файлов, которые вы создаете. Система вычитает значение umask из 777. Результат становится правом доступа к файлу, в данном случае 755. Когда вы создаете каталог с правом доступа 755, этот каталог показывается командой "ls -l" как rwxr-xr-x. Когда вы создаете некаталоговый файл с правом доступа 755, этот файл показывается как rw-r--r--, что эквивалентно 644. Некаталоговые файлы не имеют бита x, поэтому их нельзя исполнить. Каталогам же нужен установленный бит x, чтобы они были доступны по команде cd.

Строки 51 и 52 сообщают вам о времени вашего сеанса работы в системе. Строка 51 сообщает вам текущее время вашего входа в систему, а строка 52 вызывает программу lastlog, которая печатает дату вашей последней регистрации в системе. Программа lastlog описана в главе 5.

Строки 54-58 инициализируют переменные, генерирующие цвета на цветном мониторе. Управляющие значения являются стандартными значениями кодов ANSI. Это работает в системе XENIX и может работать в вашей системе. Растровая графика не доступна, но имеется символьная графика и различные основные (foreground) и фоновые (background) цвета. Основные цвета кодируются числами, начиная с 30, а фоновые цвета - числами с 40.

Строки 60-66 - просто для забавы. Они представляют собой хитрый способ устанавливать каждый день на экране различные цвета. Строка 60 начинается с запуска команды date и передачи ее выхода по конвейеру команде cut. Вырезается первое поле, которое является днем недели. Затем мы создаем структуру переключателя по строке дня, выполняя различные действия для каждого дня. Благодаря эхо-отображению управляющих последовательностей, монитор реагирует немедленно.


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