|
9. Я - это я
Если бы бог считал, что нам необходим дар предвидения, то он
даровал бы его нам.
9.1 Настройка bash.
Одна из отличительных черт философии Unix'а - это то, что
системные проектировщики не пытались предусмотреть всех нужд, которые
появлялись у пользователя, вместо этого они постарались сделать ее
инструментарий легко подстраиваемым под конкретные нужды пользователя.
Это, в основном, делается благодаря файлам конфигурации. Они часто
известны, как init files (файлы инициализации), "rc-files" (файл
управления выполнением), а также "dot files", поскольку имена этих
файлов часто начинается с точки. Если вы помните, имена файлов,
начинающиеся с ".", не высвечиваются командой ls.
Наиболее важными конфигурационными файлами являются те, которые
использует shell. В LINUX'е shell'ом по умолчанию является bash, и это
тот самый shell, о котором будет идти речь. Перед тем, как мы перейдем
к тому, как настроить bash, нам следует знать, что нужно для
bash'овских файлов.
9.1.1 Запуск Shell
Существует несколько различных типов работы bash. Он может быть
запущен как login shell (оболочка, назначенная в момент регистрации
пользователя). Так происходит, когда вы первый раз входите в систему.
Login shell является, как правило, первым shell'ом, с которым вы
имеете дело.
Другой тип работы bash - это работа в качестве интерактивного
shell'а. Примером интерактивного shell'а может служить любая оболочка,
выдающая приглашение пользователю и ожидающая затем ввода. Следует
заметить, что Login shell также является интерактивным shell'ом.
Примером non-login интерактивного shell'а может служить shell,
запущенный внутри xterm. Вообще говоря, любой shell, создаваемый не
во-время регистрации, является non-login shell'ом.
- 105 -
И, наконец, существуют неинтерактивные shell'ы. Они используются
для выполнения командного файла (shell script), весьма похожего на
.bat-файлы в MS DOS. Такие скрипты функционируют как мини-программы.
Несмотря на то, что они, как правило, гораздо медленнее обычных
(откомпилированных) программ, писать их часто намного легче.
В зависимости от типа shell'а при его запуске используются
различные файлы:
-----------
Тип Shell'а Действие
Интерактивный login Читается и выполняется файл .bash_profile
Интерактивный Читается и выполняется файл .bashrc
Неинтерактивный Читается и выполняется shell script
-----------
9.1.2 Файлы инициализации
Поскольку большинство пользователи хотят иметь одно и тоже
окружение, то не имеет значения, какой именно тип shell'а они
используют, и независимо от того, является ли этот shell login
shell'ом, мы начинаем нашу конфигурацию с очень простой команды в
файле .bash_profile: "source ~/.bashrc". По команде "source" shell
интерпретирует ее аргумент как shell script. Для нас это означает, что
всякий раз, когда запускается .bash_profile, файл .bashrc также
запускается.
Теперь остается только добавить в наш .bashrc еще несколько
команд. Если вы хотите, чтобы какая-либо команда исполнялась только
тогда, когда вы входите в систему, то добавьте ее в ваш .bash_profile.
- 106 -
9.1.3 Синонимы (Aliasing)
Итак, что именно вы можете пожелать сделать? На мой взгляд, 90%
пользователям следует добавить в свой .bashrc такую строчку:
alias ll="ls -l"
Эта команда определяет shell'овские синоним, называемый ll,
который "расширяется" до обычной команды shell'а "ls -l", когда
пользователь вызывает его. Таким образом, предположив, что Bash
прочитал эту команду из файла .bashrc, вы можете просто набрать ll и
получить тот же результат, что и при вызове команды "ls -l". Когда вы
набираете ll и нажимаете [Return], bash перехватывает эту команду, для
того, чтобы попробовать отыскать определение синонима с таким именем.
Находя синоним, bash заменяет его на "ls -l" и передает на исполнение.
В системе не существует программы с именем ll, но shell автоматически
преобразует его в корректную программу.
Несколько незамысловатых синонимов приведены в таблице 9.1.3. Вы
можете добавить их в ваш собственный .bashrc. Довольно дюбопытен
первый синоним. Если его определить, то когда бы вы не набрали ls, то
к нему автоматически присоединяется флаг -F. (Синоним не расширяется
рекурсивно.) Это - обычный способ добавления опции, используемый при
каждом вызове программы.
Обратите внимание на комментарии, начинающиеся с символа #, в
таблице 9.1.3. Shell игнорирует следующую за # часть строки.
Вы, должно быть, заметили несколько странных особенностей.
Во-первых, я опустил кавычки для некоторых синонимов, например, для
pu. Кавычки не являются необходимыми, когда справа от знака равенства
стоит только одно слово. Тем не менее, ставить их можно и даже
желательно. Кавычки обязательно в случае, если вы намерены присвоить
синоним команде с опциями и/или аргументами:
alias ls="ls -F" # выдать символы в конце листинга
alias ll="ls -l" # специальный ls
alias la="ls -a"
- 107 -
alias ro="rm *~; rm .*~" # удаляет резервные копии, созданные Emacs'ом
alias rd="rmdir" # так меньше набирать!
alias md="mkdir"
alias pu=pushd # pushd, popd, and dirs не описываются в данном
alias po=popd # руководстве --- вы можете узнать о них
alias ds=dirs # с помощью bash manpage
# все, что ниже - просто сокращения
alias to="telnet cs.oberlin.edu"
alias ta="telnet altair.mcs.anl.gov"
alias tg="telnet wombat.gnu.ai.mit.edu"
alias tko="tpalk kold@cs.oberlin.edu"
alias tjo="talk jimb@cs.oberlin.edu"
alias mroe="more" # правка правописания!
alias moer="more"
alias email="emacs -f rmail" # мой mail reader
alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""
# один из способов вызова emacs'а
Таблица 9.1.3. Некоторые простейшие синонимы для bash.
У последний синонима сложные кавычки:
alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""
Как вы, должно быть, догадались, я хотел обойти двойные кавычки в
самих опциях, поэтому мне пришлось заключить их в кавычки с помощью
символа \, чтобы bash не посчитал, что они означают конец синонима.
В конце я присвоил синонимы двум часто возникающим опечаткам:
"mroe" и "moer" вместо команды more, которая имеется в виду. Синонимы
не оказывают влияния на аргументы, с которыми запускается программа.
Следующее хорошо работает:
/home/larry# mroe hurd.txt
- 108 -
На самом деле, умение как определить собственные синонимы
является, по меньшей мере, половина всей настройки shell'а, которую
вам придется делать. Поэкспериментируйте немного, посмотрите какие
длинные команды вам приходится часто набирать, и введите для них
синонимы. Вы убедитесь, что это делает работу в bash гораздо приятней.
9.1.4 Переменные окружения
Другая важная вещь, которую нужно сделать в .bashrc - это
установить переменные окружения. А что такое переменные окружения?
Давайте подойдем к этому с другой стороны: предположим, что вы читаете
документацию по программе fruggle и наталкиваетесь на следующее
предложение:
Fruggle обычно ищет свой конфигурационный файл .frugglerc в
личном каталоге пользователя. Однако, если переменная окружения
FRUGGLEPATH установлена в другое имя файла, то он будет искать там.
Каждая программа действует в окружении, которое определяется
shell'ом, который вызывает программу. (Теперь вы видите, насколько
важны shell'ы. Представьте, что вам пришлось бы каждый раз при вызове
программы вручную устанавливать все окружение!)
Можно сказать, что окружение существует "внутри" оболочки. У
программистов есть специальная процедура для обращения к окружению, и
программа fruggle этой процедурой пользуется. Она проверяет значение
переменной окружения FRUGGLEPATH. Если эта переменная оказывается
неопределенной, то она просто использует файл .frugglerc из ванего
личного каталога. А если она определена, fruggle воспользуется
значением данной переменной (которое должно быть именем файла,
используемого fruggle) вместо .frugglerc.
Здесь показано, как вы можете изменить ваше окружение в bash:
/home/larry# export PGPPATH=/home/larry/secrets/pgp
Вы можете считать, что команда export означает "пожалуйста,
экспортируйте эту переменную в окружение, где я буду вызывать
- 109 -
программы так, чтобы ее значение было для них видимым". В дальнейшем
вы увидете, что есть причины называть ее export.
Мало известная программа шифрования Фила Циммермана использует
специальную переменную pgp. По умолчанию pgp использует вашу личную
директорию в качестве места для поиска определенных файлов, которые ей
необходимы (содержащие ключи шифрования), а также, как места для
хранения временных файлов, которая она создает во время работы.
Присваивая переменной PGPPATH данное значение, я сказал ей, вместо
этого пользоваться директорией /home/larry/secrets/pgp. Мне пришлось
читать руководство по pgp, чтобы выяснить точное имя этой переменной и
что она делает, но это все-таки достаточно общепринято, писать имя
программы в заглавных буквах, предшествующих слову "PATH".
Также полезно иметь возможность обратиться к окружению:
/home/larry# echo $PGPPATH
/home/larry/.pgp
/home/larry#
Обратите внимание на "$"; вы ставите его перед переменной окружения для
того, чтобы извлечь значение переменной. Если бы вы напечатали его без $, то
echo просто бы переписало свои аргумент(ы):
/home/larry# echo PGPPATH
PGPPATH
/home/larry#
Символ $ служит для вычисления значений переменных окружения, но
он только в контексте shell'а, т.е. кокда его интерпретирует shell. А
когда shell его интерпретирует? Ну, скажем, когда вы набираете команды
в приглашении, или, когда bash читает команды из файла типа .bashrc,
тогда можно говорить, что он интерпретирует команды.
- 110 -
Имя переменной Что содержит Пример
HOME ваш личный каталог /home/larry
TERM тип вашего терминала xterm,vt100, or console
SHELL путь к вашему shell'у /bin/bash
USER ваше имя входа в систему larry
PATH список для поиска программ /bin:/usr/bin:/usr/local
/bin:/usr/bin/X11
Таблица 9.1.4: Некоторые важные переменные окружения.
Существует другая команда, которая очень полезна при обращении к
окружению: env. env просто печатает все переменные окружения.
Возможно, особенно когда вы используете X, что список этих переменных
вылезет за пределы экрана. Если это случится, просто составьте
конвейер команд env и more: env | more.
Некоторые из переменных окружения могут быть очень полезны, так
что я коснусь их здесь. Посмотрите на таблицу 9.1.4. Эти четыре
переменных определяются автоматически, когда вы входите в систему: вы
не устанавливаете их значения в ваших файлах .bashrc или .bash_login.
Давайте более внимательно рассмотрим переменную TERM. Чтобы
понять ее смысл, давайте вернемся назад к истории Unix'а: Данная
операционная система нуждается в определенных данных о вашей консоли
для того, чтобы предоставлять элементарные функции, такие как
отображение символа на экране, перемещение курсора на следующую строку
и т.п. Вначале производители компьютеров добавляли новые
характеристики терминалам так, что они проявлялись постоянно: это и
первое инверсное изображение, затем установка европейских символов и,
в конце концов, даже примитивные графические функции (помните, было
время, когда не было еще мышей и оконных систем). Однако, все эти
новые функции породили проблему программистам: как они могут узнать,
чем оснащен данный терминал, а чем нет? И как они могут добавить новые
возможности так, чтобы не сделать старые терминалы ни к чему
непригодными?
- 111 -
В системе Unix ответом на все эти вопросы является файл
/etc/termcap. /etc/termcap - это список всех терминалов, о которых
знает ваша система, и как они управляют курсором. Если системный
администратор завел новый терминал, все, что нужно будет сделать, это
добавить точку входа для этого терминала в файл /etc/termcap вместо
перестройки всего Unix'а. Иногда это даже проще. Кстати, терминал
Digital Equipment Corporation (DEC) vt100 стал неявным стандартом, и
многие новые терминалы были сконструированы таким образом, что они
могут эмулировать его, т.е. вести себя так, как-будто бы они и есть
vt100.
В Linux'е значением переменной TERM иногда является console
(консоль), которая является vt100-подобным терминалом с некоторыми
дополнительными возможностями.
Другая переменная, PATH, также важна для функционирования
shell'а. Вот пример:
/home/larry# env | grep ^PATH
PATH=/home/larry/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:
/usr/TeX/bin
/home/larry#
Ваша переменная PATH - это список разделенных между собой
каталогов, в которых shell'у следует искать программу, когда вы
набираете ее имя для запуска. Когда вы набираете ls и нажимаете
[Return], то, согласно примеру, сначала Bash будет искать ее в
каталоге /home/larry/bin, т.е. в директории, которую я создал для
хранения программ, которые я написал. Однако, я ведь не писал
программы ls (на самом деле, она могла быть написана еще до моего
рождения). Не обнаружив ее там, Bash продолжает поиск в директории,
следующей по списку, /bin, а там она уже есть! Файл /bin/ls
действительно существует и является исполняемым, таким образом, Bash
прекратит поиск программы ls и запустит ее. Возможно, что существовала
другая программа под именем ls, расположенная в каталоге /usr/bin, но
bash никогда бы не запустил ее, пока я не попросил бы этого, уточнив
ее полное имя:
- 112 -
/home/larry# usr/bin/ls
Переменная PATH нужна для того, чтобы у нас не было необходимости
набирать полные имена для всех команд. Когда вы набрали команду, Bash
ищет ее в директориях, проименованных в PATH по порядку и, если нашел,
запускает ее. Если нет, то получается грубая ошибка:
/home/larry# clubly
clubly: command not found (команда не найдена)
Заметьте, что моя переменная PATH не содержит текущую директорию,
".". Если бы она содержала ее, то она могла бы выглядеть следующим
образом:
/home/larry# echo $PATH
.:/home/larry/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/TeX/bin
/home/larry#
Это является споpным моментом в Unix'овских кругах (теперь и вы
их участник, хотите вы этого или нет). Проблема заключается в том, что
включение в вашу переменную PATH текущего каталога может быть дырой в
системе защиты. Предположим, что вы переходите (командой cd) в
директорию, где кто-то оставил "троянского коня", программу под именем
ls, и вы запускаете ls, что было бы естественно при входе в новую
директорию. Поскольку текущая директория, ".", идет первой а вашей
переменной PATH, то shell нашел бы именно эту версию программы ls и
запустил бы ее. Какие только пакости нельзя поместить в эту программу,
а вы буквально только что сами взяли и запустили ее. Типу, который
написал ее, даже не нужно предоствалять какие-либо привилегии для
этого, просто нужно выдать разрешение на директорию, где расположена
"ложная" ls. Это даже может быть его домашняя директория, если он
знает, что вы будете работать где-то около.
Вашей собственной системе очень не повезет, если с ней работают
люди, оставляющие такие ловушки для других. Возможно, что все
пользователи - ваши друзья или коллеги. Однако, в больших
многопользовательских системах (например, в университетских) легко
может оказаться несколько недружелюбных программистов, которых вы
- 113 -
никогда и не встречали. Так это или нет, хотите ли вы иметь такую
возможность, используя "." в вашей PATH, зависит от ситуации; я не
собираюсь быть догматичным, а просто хочу предупредить вас о возможном
риске. (Помните, что вы всегда можете запускать программы из текущей
директории, задав их более точно, например, "./foo".)
Многопользовательские системы вообще представляют собой сообщества,
где люди могут делать друг другу различные "подарки" всевозможными
способами.
То, как я на самом деле установил свою переменную PATH, включает
в себя многое из того, что вы уже узнали о переменных окружения. Вот,
что действительно содержится в моем файле .bashrc:
export PATH=${PATH}:.:${HOME}/bin/:bin:/usr/bin:/usr/local/bin:
/usr/bin/X11:/usr/TeX/bin
Здесь я использую тот факт, что переменная HOME установлена
ранее, чем Bash начнет читать мой .bashrc, и я могу использовать ее
значение при установке моей PATH. Фигурные скобки представляют собой
дальнейший уровень "закавычивания"; они выделяют то, что именно должен
вычислить "$", так что shell не придет в замешательство от текста,
который немедленно следует за ним ("/bin" в данном случае). Вот другой
пример того, как это действует:
/home/larry# echo ${HOME}foo
/home/larryfoo
/home/larry#
Без этих кавычек у меня ничего бы не получилось, поскольку не
существует переменной окружения с именем HOMEfoo.
/home/larry# echo $HOMEfoo
/home/larry#
Позвольте мне прояснить еще одно обстоятельство, связанное с
переменной PATH: значение "$PATH". С помощью этого в мою новую PATH
добавляется значение переменной PATH, которое было установлено ранее..
- 114 -
Но где могла быть установлена та, старая, переменная? Файл
/etc/profile служит, как бы, в качестве глобального .bash_profile,
который является общим для всех пользователей. Имея такой
централизованный файл, системному администратору становится гораздо
проще добавить новую директорию в переменную PATH каждого
пользователя, или что-нибудь подобное, без необходимости проделывать
это индивидуально каждому. Если включаете старое значение в вашу новую
переменную, вы никогда не потеряете те директории, которые система уже
установила для вас.
Вы также можете управлять видом вашего приглашения. Это делается
с помощью установки переменной окружения PS1. Лично я хочу, чтобы
приглашение показывало текущую рабочую директорию - вот, как я сделал
это в своем .bashrc:
export PS1='$PWD# '
Как вы заметили, на самом деле здесь используются две переменные.
Одна, та, которая устанавливается, это PS1, а другая, значение которой
используется, это PWD, которую можно расшифровать как "Print Working
Directory" или как "Path to Working Directory". Но взятие значения PWD
происходит внутри одинарных кавычек. Они служат для того, чтобы
вычислить выражение внутри них, которое само вычисляет значение
переменной PWD. Если бы мы просто выполнили команду export PS1=$PWD,
то приглашение все время высвечивало бы тот каталог, в котором
произошла установка PS1. Это все, конечно, немного запутано и не так
уж важно. Просто имейте в виду, что вам необходимо поставить '', если
вы хотите, чтобы текущая директория постоянно отображалась в вашем
приглашении.
Возможно, что вы предпочтете команду export PS1='$PWD>' или даже
имя вашей системы: export PS1=`hostname`'>'. Позвольте мне ниже
проанализировать последний пример.
В этом последнем примере используется новый тип закавычивания, с
помощью обратных одинарных кавычек ``. Это не служит для предохранения
чего-либо - на самом деле, вы увидите, что слово "hostname" так не
появится в приглашении, когда вы запустите это. В действительности
- 115 -
происходит то, что команда внутри этих обратных кавычек будет
вычислена, и результат ее работы будет выведен в то место, где должна
была бы стоять закавыченное имя команды.
Попробуйте выполнить команды echo `ls` или wc `ls`. По мере того,
как вы будете становиться более опытным пользователем shell'а, эта
техника будет становиться все более и более мощной.
Есть еще очень много вещей, подлежащих конфигурации в вашем
.bashrc, и здесь не хватит места, чтобы рассказать о них. Вы можете
почитать bash man page для получения дополнительной информации, или
просто пораспрашивать более опытных пользователей. Вот вам для
изучения законченный вариант .bashrc; он полностью стандартен, хотя
путей для поиска, установленных в переменной path немного больше
обычного.
# всякие мелочи:
ulimit -c unlimited
export history_control=ignoredups
export PS1='$PWD>'
umask 022
# пути, нужные приложениям:
export MANPATH=/usr/local/man:/usr/man
export INFOPATH=/usr/local/info
export PGPPATH=${HOME}/.pgp
# установка основной переменной PATH:
homepath=${HOME}:~/bin
stdpath=/bin:/usr/bin:/usr/local/bin:/usr/ucb/:/etc:/usr/etc:/usr/games
pubpath=/usr/public/bin:/usr/gnusoft/bin:/usr/local/contribs/bin
softpath=/usr/bin/X11:/usr/local/bin/X11:/usr/TeX/bin
export PATH=.:${homepath}:${stdpath}:${pubpath}:${softpath}
# фигуpные скобки не обязательны, так как двоеточие является
# pазделителем; тем не меннее, фигуpные скобки - это хоpоший тон,
# и они ничем не могут повpедить.
# синонимы
- 116 -
alias ls="ls -CF"
alias fg1="fg %1"
alias fg2="fg %2"
alias tba="talk sussman@tern.mcs.anl.gov"
alias tko="talk kold@cs.oberlin.edu"
alias tji="talk jimb@totoro.bio.indiana.edu"
alias mroe="more"
alias moer="more"
alias email="emacs -f vm"
alias pu=pushd
alias po=popd
alias b="~/.b"
alias ds=dirs
alias ro="rm *~; rm .*~"
alias rd="rmdir"
alias ll="ls -l"
alias la="ls -a"
alias rr="rm -r"
alias md="mkdir"
alias ed2="emacs -d floss:0 -fg \"grey95\" -bg \"grey50\""
function gco
{
gcc -o $1 $1.c -g
}
9.2 Файлы инициализации системы X Window System
Большинство людей предпочитают работать внутри графического
окружения, и для Unix'овских машин это обычно означает использование
системы X. Если вы привыкли к Macintosh или Microsoft Windows, то X
Window System может вам чем-то напомнить их, особенно способом
настройки.
В Macintosh или Microsoft Windows вы настраиваете окружение как
бы изнутри самого окружения: если вы хотите изменить фон, например, вы
делаете это, выбирая с помощью мыши новый цвет в накоторой специальной
графической программе. В системе X ее настройки "по умолчанию"
- 117 -
хранятся в текстовых файлах, которые вы редактируете непосредственно -
иначе говоря, вам следует набрать название цвета в файле для того,
чтобы установить цвет фона.
Никто не возражает, что этот метод не является таким же быстрым,
как в некоторых коммерческих оконных системах. Мне кажется, что
тенденция системы оставаться текстовой, даже в графическом окружении,
связана с тем, что X создавалась группой программистов, которая не
пыталась написать программное обеспечение для чайников. Эта тенденция
может измениться в дальнейших версиях X (по крайней мере, я так
надеюсь), но сейчас вам придется научиться иметь дело с большим числом
текстовых файлов. Это, по крайней мере, дает вам гибкий и прочный
контроль над вашей конфигурацией.
Здесь приведены наиболее важные файлы для конфигурирования X.
.xinitrc Скрипт, запускаемый X'ом в начале работы.
.twmrc Читается X window manager, twm.
.fvwmrc Читается X window manager, fvwm.
Все эти файлы, если они существуют, должны лежать в вашем личном
каталоге.
.xinitrc - это обычный скрипт shell'а, который запускается при
вызове X. Он может делать то же самое, что и любой другой скрипт
shell'а, но, конечно, наиболее разумно использовать его при запуске
различных X-программ и установке параметров window system. Последняя
команда, .xinitrc, это обычно название запускаемого window manager,
например, /usr/bin/X11/twm.
Какого рода вещи хотели бы вы поместить файл .xinitrc? Наверное
несколько обращений к программе xsetroot, необходимых для того, чтобы
ваше корневое (фоновое) окно и курсор мышь выглядели бы так, как вам
хочется. Обращения к xmodmap, которые сообщают серверу, как интерпре-
тировать сигналы от клавиатуры. Прочие программы, которые вы хотели бы
запускать каждый раз при запуске X (например, xclock).
- 118 -
"Cервер" означает основной X процесс на вашей машине, тот с кото-
рым все остальные X программы взаимодействуют, чтобы пользоваться
дисплеем. Эти остальные программы называются клиентами, а все целиком
называется системой "клиент-сервер".
Здесь приведена часть моего .xinitrc; ваш почти наверняка будет
выглядеть иначе, поэтому, это - все лишь пример:
# /bin/sh
# Первая строка сообщает операционной системе, каким shell'ом пользоваться
# при интерпретировании данного скрипта. Сам скрипт должен быть помечен
# как выполняемый; вы можете это сделать с помощью "chmod +x ~/.xinitrc".
# xmodmap - это программа, сообщающая серверу, как интерпретировать
# сигналы с вашей клавиатуры. Она определенно стоит того, чтобы
# ее изучить. Вы можете запустить "man xmodmap", "xmodmap -help"
# "xmodmap - grammer" и т.д. Я не гарантирую, что выражение внизу
# будет значить что-либо для вашей системе (я даже не гарантирую,
# что будет что-либо значить для моей)
xmodmap -e 'clear Lock'
xmodmap -e 'keycode 176 = Control_R'
xmodmap -e 'add control = Control_R'
xmodmap -e 'clear Mod2'
xmodmap -e 'add Mod1 = Alt_L Alt_R'
# xset - программа для установления некоторых прочих параметров для
# X сервера:
xset m 3 2 & # параметры мыши
xset s 600 5 & # параметры заставки
xset s noblank & # ditto
xset fp+ /home/larry/x/fonts # for cxterm
# для того, чтобы узнать больше, воспользуйтесь "xset -help".
# Приказывает X-серверу скомбинировать fish.cursor с fish.mask и
# использовать получившийся образец в качестве курсора мыши.
xsetroot -cursor /home/lab/larry/x/fish.cursor /home/lab/larry/x/fish.mask &
- 119 -
# Приятная палитра фона и цвет:
xsetroot -bitmap /home/lab/larry/x/pyramid.xbm -bg tan
# todo: xdrb here? What about .Xdefaults file?
# Вам следует воспользоваться "man xsetroot" или "xsetroot help" для
# получения большей информации о программе, представленной выше.
# Программа-клиент Jim'а Blandy появления часов с цветным циферблатом:
/usr/local/bin/circles &
# Возможно вы захотите появления часов на вашем экране все время?
/usr/bin/X11/xclock -digital &
# Позволяет программам-X-клиентам, работающим в
# occs.cs.oberlin.edu воспроизводить себя на дисплеях;
# то же самое для juju.mcs.anl.gov:
xhost occs.cs.obrlin.edu
xhost juju.mcs.anl.gov
# Вы можете приказать X-серверу, дать возможность клиентам
# на любом другом узле (узлом является удаленная машина)
# отображать свою работу здесь. Эта является дырой в системе
# безопасности -- эти клиенты могут быть запущены кем-то другим,
# и следить за нажатием клавиш, когда вы # печатаете ваш пароль
# или что-нибудь в этом роде. Однако, если вы все-таки # хотите
# это сделать, вы можете поставить "+" вместо всевозможных имен
# узлов, а не специальное имя узла, например:
# xhost +
# И, наконец, запускаем window manager:
/usr/bin/X11/twm
# Некоторые люди предпочитают другие window manager'ы. Я
# пользуюсь twm, но вместе с Linux часто распространяет также
# fvwm:
# /usr/bin/X11/fvwm
- 120 -
Заметим, что некоторые команды запускаются в фоновом режиме (т.е.
за ними следует "&"), а некоторые нет. Отличие состоит в том, что
некоторые программы запускаются вместе с X'ом и продолжают работу до
вашего выхода - они и помещаются в фоновый режим. Остальные однажды
выполняются и немедленно заканчивают работу, одна из таких xsetroot;
она только устанавливает корневое окно, или курсор, или что-нибудь
еще, а затем завершаются.
Как только запускается window manager, он начинает обрабатывать
свой собственный инициализационный файл, в котором содержится
информация о том, как установлено ваше меню, на какие позиции вынесены
окна, контроль над иконками и прочие не менее важные вещи. Если вы
пользуетесь twm, то инициализационным файлом является файл .twmrc
вашего личного каталога. Если вы, пользуетесь fvwm, то это,
соответственно, .fvwmrc и т.д. Я работаю только с этими двумя,
поскольку это window manager'ы, самые подходящие для Linux'а.
9.2.1 Конфирация twm
.twmrc - это не скрипт shell'а; он написан на языке, специально
сделанным для twm!^4, хотите, верьте, хотите - нет. (Самое неприятное
в файлах инициализации, это то, что, как правило, у каждого есть свой
идиосинкратичный командный язык. Это означает, что пользователи
начинают быстро обучаться командным языкам. Я полагаю, что это было бы
прекрасно, если бы первые Unix'овские программисты бы согласились на
некоторый стандартный формат файлов инициализации, так чтобы нам не
пришлось каждый раз изучать новый синтаксис, но, если быть честным,
трудно предсказать, какого рода информация понадобится программам.)
Больше всего люди любят забавляться в своем .twmrc с оконным стилем
(т.е., цвета и т.п.) и с изготовлением различных меню, поэтому, здесь
приведен пример .twmrc, который делает это.
- 121 -
# Установка цветов для различных частей окон. Это очень помогает
# "чуствовать" ваше окружение
Color
{
BorderColor "OrangeRed"
BorderTileForeground "Black"
BorderTileBackground "Black"
TitleForeground "black"
TitleBackground "gold"
MenuForeground "black"
MenuBackground "LightGrey"
MenuTitleForeground "LightGrey"
MenuTitleBackground "LightSlateGrey"
MenuShadowColor "black"
IconForeground "DimGray"
IconBackground "Gold"
IconBorderColor "OrangeRed"
IconManagerForeground "black"
IconManagerBackground "honeydew"
}
# Я надеюсь, что у вас не монохромная система, но если уж так ...
Monochrome
{
BorderColor "black"
BorderTileForeground "black"
BorderTileBackground "white"
TitleForeground "black"
TitleBackground "white"
}
# Я создал baifang.bmp с программой "bitmap". Здесь я приказываю twm
# использовать ее по умолчанию в заголовках окон
Pixmaps
{
TitleHighlight "/home/larry/x/beifang.bmp"
- 122 -
}
# Не беспокойтесь по поводу этой чепухи, она только для
# продвинутых пользователей.
BorderWidth 2
TitleFont "-adobe-new century schoolbook-bold-r-normal--14
-140-75-75-p-87-iso8859-1"
MenuFont "6x13"
IconFont "lucidasans-italic-14"
ResizeFont "fixed"
Zoom 50
RandomPlacement
# Эти программы не получают заголовок окна по умолчанию:
NoTitle
{
"stamp"
"xload"
"xclock"
"xlogo"
"xbiff"
"xeyes"
"oclock"
"xoid"
}
# AutoRaise означает, что окно выносится вперед, где бы его не
# открыл мышиный указатель. Меня это раздражает, поэтому я это
# выключил. Как вы можете заметить, я унаследовал свой .twmrc
# от людей, которым тоже не нравился AutoRaise.
AutoRaise
{
"nothing" # I don't like auto-raise # Me either # nor I
}
# Здесь определяются функции кнопки мыши. Обратите внимание на
# образец: если кнопка мыши нажата в корневом окне, если не нажата
- 123 -
# клавиша модификации, то всегда выводится меню. Прочее расположения
# курсора обычно используются для различных оконных манипуляций,
# клавиши модификации используются вместе с кнопка мимыши, чтобы
# добиться еще сложных манипуляций.
#
# Вы не обязаны следовать этому образцу в вашем .twmrc.
# Кнопка мыши = Клавиша : Контекст : Функция
# --------------------------------------------
Button1 = : root : f.menu "main"
Button1 = : title : f.raise
Button1 = : frame : f.raise
Button1 = : icon : f.iconify
Button1 = m : window : f.iconify
Button2 = : root : f.menu "stuff"
Button2 = : icon : f.move
Button2 = m : window : f.move
Button2 = : title : f.move
Button2 = : frame : f.move
Button2 = s : frame : f.zoom
Button2 = s : window : f.zoom
Button3 = : root : f.menu "x"
Button3 = : title : f.lower
Button3 = : frame : f.lower
Button3 = : icon : f.raiselower
# Вы можете написать ваши собственные функции; эта используется
# в меню "windowops" у конца этого файла:
Function "raise-n-focus"
{
f.raise
f.focus
}
# Итак, внизу приведены те меню, на которые делались ссылки
# в разделе о кнопках мыши. Заметьте, что многие из пунктов
- 124 -
# в этих меню называются подменю. Вы можете создать столько
# уровней меню, сколько захотите, но помните, что рекурсивные
# меню не действуют. Я это проверил.
menu "main"
{
"Vanilla" f.title
"Emacs" f.menu "emacs"
"Logins" f.menu "logins"
"Xlock" f.menu "xlock"
"Misc" f.menu "misc"
}
# Это позволяет мне вызвать Emacs на нескольких различных
# машинах. Чтобы узнать побольше о том, как это работает,
# посмотрите раздел о файлах .rhosts:
menu "emacs"
{
"Emacs" f.title
"here" !"/usr/bin/emacs &"
"" f.nop
"phylo" !"rsh phylo \"emacs -d floss:0\" &"
"geta" !"rsh geta \"emacs -d floss:0\" &"
"darwin" !"rsh darwin \"emacs -d floss:0\" &"
"ninja" !"rsh ninja \"emacs -d floss:0\" &"
"indy" !"rsh indy \"emacs -d floss:0\" &"
"oberlin" !"rsh cs.oberlin.edu \"emacs -d
floss.life.uiuc.edu:0\" &"
"gnu" !"rsh gate-1.gnu.ai.mit.edu \"emacs -d
floss.life.uiuc.edu:0\" &"
}
# Это позволяет мне вызвать xterm'ы на нескольких различных
# машинах. Чтобы узнать побольше о том, как это работает,
# посмотрите раздел о файлах .rhosts:
menu "logins"
{
"Logins" f.title
"here" !"/usr/bin/X11/xterm -ls -T `hostname` -n `hostname` &"
- 125 -
"phylo" !"rsh phylo \"xterm -ls -display floss:0 -T phylo\" &"
"geta" !"rsh geta \"xterm -ls -display floss:0 -T geta\" &"
"darwin" !"rsh darwin \"xterm -ls -display floss:0 -T darwin\" &"
"ninja" !"rsh ninja \"xterm -ls -display floss:0 -T ninja\" &"
"indy" !"rsh indy \"xterm -ls -display floss:0 -T indy\" &"
}
# Xlock'овский скринсейвер, вызываемый с различными опциями,
# (каждыя дает свою приятную картинку):
menu "xlock"
{
"Hop" !"xlock -mode hop &"
"Qix" !"xlock -mode qix &"
"Flame" !"xlock -mode flame &"
"Worm" !"xlock -mode worm &"
"Swarm" !"xlock -mode swarm &"
"Hop NL" !"xlock -mode hop -nolock &"
"Qix NL" !"xlock -mode qix -nolock &"
"Flame NL" !"xlock -mode flame -nolock &"
"Worm NL" !"xlock -mode worm -nolock &"
"Swarm NL" !"xlock -mode swarm -nolock &"
}
# Разнообразные программы, которые я запускаю от случая
# к случаю:
menu "misc"
{
"Xload" !"/usr/bin/X11/xload &"
"XV" !"/usr/bin/X11/xv &"
"Bitmap" !"/usr/bin/X11/bitmap &"
"Tetris" !"/usr/bin/X11/xtetris &"
"Hextris" !"/usr/bin/X11/xhextris &"
"XRoach" !"/usr/bin/X11/xroach &"
"Analog Clock" !"/usr/bin/X11/xclock -analog &"
"Digital Clock" !"/usr/bin/X11/xclock -digital &"
}
- 126 -
# Вот то, что я сопоставил средней кнопке мыши:
menu "stuff"
{
"Chores" f.title
"Sync" !"/bin/sync"
"Who" !"who | xmessage -file - -columns 80 -lines 24 &"
"Xhost +" !"/usr/bin/X11/xhost + &"
"Rootclear" !"/home/larry/bin/rootclear &"
}
# X функции, которые иногда бывают полезны:
menu "x"
{
"X Stuff" f.title
"Xhost +" !"xhost + &"
"Refresh" f.refresh
"Source .twmrc" f.twmrc
"(De)Iconify" f.iconify
"Move Window" f.move
"Resize Window" f.resize
"Destroy Window" f.destroy
"Window Ops" f.menu "windowops"
"" f.nop
"Kill twm" f.quit
}
# Вот подменю, упомянутое выше:
menu "windowops"
{
"Window Ops" f.title
"Show Icon Mgr" f.showiconmgr
"Hide Icon Mgr" f.hideiconmgr
"Refresh" f.refresh
"Refresh Window" f.winrefresh
"twm version" f.version
"Focus on Root" f.unfocus
"Source .twmrc" f.twmrc
"Cut File" f.cutfile
- 127 -
"(De)Iconify" f.iconify
"DeIconify" f.deiconify
"Move Window" f.move
"ForceMove Window" f.forcemove
"Resize Window" f.resize
"Raise Window" f.raise
"Lower Window" f.lower
"Raise or Lower" f.raiselower
"Focus on Window" f.focus
"Raise-n-Focus" f.function "raise-n-focus"
"Destroy Window" f.destroy
"Kill twm" f.quit
}
Поверьте мне, это не самый сложный .twmrc, который я когда-либо
видел. Достаточно вероятно, что некоторые полезные файлы-примеры
.twmrc работают в вашей системе X. Загляните в директорию
/usr/lib/X11/twm/ или /usr/X11/lib/X11/twm и просмотрите, что там
есть.
Ошибка, которая выявляется с помощью файла .twmrc, это
непоставленный символ "&" после команды о меню. Если вы заметили, что
X зависает, когда вы запускаете определенные команды, то, возможно,
это происходит именно по этой причине. Выйдите из X с помощью
[Ctrl][Alt][Backspace], отредактируйте ваш .twmrc и попробуйте снова.
9.2.2 Конфигурация fvwm
Если вы пользуетесь fvwm, то директория /usr/lib/X11/fvwm/ (или
/usr/X11/lib/X11/fvwm/) также содержат примеры конфигурационных
файлов.
- 128 -
9.3 Другие файлы инициализации.
Вот некоторые из них :
.emacs обрабатывается текстовым редактором Emacs при запуске
.netrc дает входные имена и пароли по умолчанию для FTP.
.rhosts делает возможной работу на удаленной машине
.forward для автоматического перенаправления данных в mail
9.3.1 Файл инициализации Emacs'а
Если вы используете Emacs в качестве своего основного текстового
редактора, то файл .emacs является достаточно важным. Мы с ним имели
дело в главе 8.
9.3.2 Умолчания в FTP
Файл .netrc позволяет определить некоторые умолчания в FTP до
запуска FTP. Здесь приведен небольшой пример .netrc:
machine floss.life.uiuc.edu login larry password fishSticks
machine darwin.life.uiuc.edu login larry password fishSticks
machine geta.life.uiuc.edu login larry password fishSticks
machine phylo.life.uiuc.edu login larry password fishSticks
machine ninja.life.uiuc.edu login larry password fishSticks
machine indy.life.uiuc.edu login larry password fishSticks
machine clone.mcs.anl.gov login fogel password doorm@
machine osprey.mcs.anl.gov login fogel password doorm@
machine tern.mcs.anl.gov login fogel password doorm@
machine altair.mcs.anl.gov login fogel password doorm@
machine dalek.mcs.anl.gov login fogel password doorm@
machine juju.mcs.anl.gov login fogel password doorm@
machine sunsite.unc.edu login anonymous password larry@cs.oberlin.edu
- 129 -
Каждая строка вашего .netrc специфицирует имя машины, входное
имя, используемое по умолчанию для данной машины и пароль. Это очень
удобно, если вам, скажем, часто приходится пользоваться FTP, и вы
устали от постоянного набирания в разных местах имени пользователя и
пароля. Программа FTP попытается произвести автоматический login,
используя найденную в вашем файле .netrc информацию, если вы
соединяетесь по FTP с одной из машин, содержащихся в данном файле.
Вы можете приказать FTP игнорировать ваш .netrc и не пытаться
совершить auto-login, вызывая его с опцией -n: "ftp -n".
Вы должны убедиться, что ваш файл .netrc можете прочесть только
вы. Используйте программу chmod для установки прав на чтение файла.
Если другие люди могут его прочесть, это означает, что они могут
узнать ваш пароль в различных узлах. FTP и прочие программы,
использующие файл .netrc, откажутся работать, если права на чтение
неподходящие. Для получении дополнительной информации о файле .netrc,
когда у вас будет возможность, наберите "man .netrc" или "man ftp".
9.3.3 Упрощение работы на удаленной машине
Если в вашем личном каталоге есть файл .rhosts, это позволит вам
запускать программы на вашей машине с удаленного узла. То есть, вы и
так могли бы войти в систему на машине cs.oberlin.edu, но с правильно
конфигурированным файлом .rhost, находящим на floss.life.uius.edu, вы
могли бы запустить программу на floss.life.uius.edu и получать
результаты на cs.oberlin.edu без login'а.
Файл .rhost выглядет так:
frobnozz.cs.knowledge.edu jsmith
aphrodite.classics.hahvaahd.edu wphilps
frobbo.hoola.com trixie
Формат файла очень прост: имя машины, за ним следует имя
пользователя. Предположим, что этот пример - это на самом деле мой
файл .rhost на floss.life.uius.edu. Это означает, что я могу запускать
программы на floss'е с результатом передающимся любой из перечисленных
- 130 -
машин так, как будто я вошел туда как соответствующий пользователь
данной машины.
Обычно для запуска удаленной программы используется программа
rsh. Она действует как "удаленный shell" - запускает shell на
удаленной машине и выполняет определенную команду, например:
frobbo$ whoami
trixie
frobbo$ rsh floss.life.uiuc.edu "ls ~"
foo.txt mbox url.ps snax.txt
frobbo$ rsh floss.life.uiuc.edu "more ~/snax.txt"
[snax.txt comes paging by here]
Пользователь trixie на floss.life.uius.edu, у которого был
вариант файла .rhosts, приведенный выше, позволяет trixie из
frobbo.hoola.com запускать программы как trixie c floss'а.
Нет необходимости иметь одинаковое имя пользователя на всех
машинах, чтобы .rhost правильно работал. Пользуйтесь опцией "-l" для
rsh, чтобы сообщить удаленной машине, каким именем пользователя вы
хотели бы пользоваться для login'а. Если это имя на удаленной машине
существует и имеет файл .rhost с вашими текущимими (т.е. локальными)
именами машины и пользователя, rsh будет работать.
frobbo$ whoami
trixie
frobbo$ rsh -l larry floss.life.uiuc.edu "ls ~"
[ Вставьте здесь листинг моей директории на floss'е ]
Это будет работать, у пользователя на floss.life.uiuc.edu есть
файл .rhost, который позволяет пользователю trixie из
frobbo.hoopla.com запускать команды на своей машине. Являются ли оба
этих пользователя одним и тем же лицом не имеет значения:
единственное, что важно, это имена пользователей, машин и содержимое
файла .rhost у пользователя larry на машине floss. Заметьте, что файл
.rhost у пользователя trixie на машине frobbo не играет роли,
поскольку, важно только содержимое файла на той удаленной машине
- 131 -
(floss).
Есть и другие комбинации, которые могут встретиться в файле
.rhost - например, вы можете опустить имя пользователя, которое
следует за именем удаленной машины, чтобы позволить пользователю с той
машины запускать программы также, как вы на локальной машине!
Разумеется, здесь вы рискуете безопасностью: кто-то может запустить
программу, которая будет удалять ваши файлы, просто пользуясь тем, что
он имеет доступ к определенной машине. Если вы собираетесь делать
подобные вещи, то вы должны быть уверены в том, что ваш файл .rhost
доступен только вам и больше никому.
9.3.4 Переадресация почтовых сообщений
Вы можете также создать файл .forward, который, строго говоря, не
является файлом инициализации. Если он содержит адрес электронной
почты, то все сообщения, предназначенные вам, будут переадресованы на
этот адрес. Это полезно, если вы имеете доступ к различным системам,
но хотите читать почту только в одном месте.
Существуют и другие файлы инициализации. Их точное число
варьируется от системы к системе и зависит от программного
обеспечения, установленного в вашей системе. Чтобы узнать побольше,
посмотрите файлы в вашем личном каталоге, имена которых начинаются с
".". Нет гарантии, что все эти файлы - файлы инициализации, но, скорей
всего, большинство из них являются таковыми.
9.4 Просмотр некоторых примеров
В качестве интересного и содержательного примера, я могу
рассказать вам, про запуск Linux-систем. Итак, если вы имеете доступ к
Internet, войдите telnet'ом в floss.life.uiuc.edu под именем "guest" с
паролем "explorer", и покопайтесь там. Большинство файлов с примерами,
приведенных здесь, можно найти в /home/kfogel, а также в других
каталогах. Вы можете копировать все, что вам удалось прочесть.
Пожалуйста, будьте осторожны: floss не имеет надежной системы защиты,
и вы, конечно, можете получить к ней доступ как администратор, если
хорошо постараетесь. Я предпочитаю доверять людям.
|
|