Использование UNIX: Часть 10. Настройка командной оболочки

Сохранение настроек для их восстановления при следующем запуске командной оболочки

Можно настроить командную оболочку (shell) UNIX® так, чтобы сэкономить свое время, силы и адаптировать ее под свой стиль работы. Файлы автозагрузки командной оболочки сохранят настройки и восстановят окружение старой сессии оболочки заново даже на другом компьютере.

Мартин Стрейчер, главный редактор, Linux Magazine

Мартин Стрейчер (Martin Streicher) -- главный редактор журнала Linux Magazine. Он имеет степень магистра компьютерных наук Университета Пардью (Purdue University) и с 1982 занимается программированием на языках Pascal, C, Perl, Java и (с недавнего времени) Ruby в UNIX-подобных операционных системах.



18.03.2008

Если работать с какой-то программой достаточно долго, то можно узнать все о том, для чего она предназначена. Более того, программист станет использовать ее, как виртуоз - свой музыкальный инструмент.

Я надеюсь, что мастерство читателя этого цикла статей уже приближается к уровню гуру UNIX®: он обращается к всеведущему оракулу man за дополнительными знаниями, ему известны магические комбинации команд, которые осуществляют поистине алхимические преобразования данных. Работа в командной строке легка и командная оболочка удобна и знакома ему.

Следующий уровень мастерства - это виртуозно использовать командную оболочку.

Великий и могучий shell

Мы уже изучили много способов настройки окружения оболочки:

  • Можно выбрать ту командную оболочку UNIX, которая больше нравится. Bourne shell (bash) обладает мощью; другие, такие как Z shell, предлагают новинки и удобные улучшения, которые некоторые пользователи сочтут крайне полезными.

    Чтобы узнать, какие командные оболочки установлены на компьютере, надо запустить команду cat /etc/shells. Чтобы изменить текущую командную оболочку на любую из списка, следует вызвать команду chsh. Вот пример изменения командной оболочки на /bin/zsh - Z shell. (Пользователь вводил текст, выделенный полужирным шрифтом.)

    $ cat /etc/shells
    /bin/bash
    /bin/csh
    /bin/ksh
    /bin/sh
    /bin/tcsh
    /bin/zsh
    $ chsh -s /bin/zsh
  • Можно создать короткие псевдонимы для часто используемых длинных команд.
  • Переменные окружения, такие как PATH (содержащая пути, по которым ищутся программы) и TZ (которая определяет часовой пояс) сохраняют настройки и влияют на все запускаемые процессы.

    Переменная PATH особенно полезна. Например, если необходимо запустить локальную версию Perl, можно изменить значение PATH так, чтобы запускалась Perl из /usr/local/bin/perl вместо обычно находящейся в /usr/bin/perl стандартной версии Perl.

    Приложения UNIX также часто используют переменные окружения для настройки. Например, если терминал (или эмулятор терминала) имеет такую возможность, можно сделать так, чтобы команда ls (выводящая содержимое каталога) обозначала различными цветами файлы разных типов, используя для этого переменные окружения CLICOLOR и LSCOLORS.

  • Можно повторно запустить команды из ведущейся командной оболочкой истории команд. История команд сохраняет набранные ранее вызовы, позволяя повторно запустить предыдущие команды. Многие командные оболочки также позволяют модифицировать эти предыдущие команды, создавая на их основе новые. Например, командная оболочка Bash использует символ "крышка" (^), чтобы выполнить замену в команде:
    $ ls -l heroes.txt
    -rw-r--r--   1 strike  strike  174 Mar  1 11:25 heroes.txt
    $ ^heroes^villains
    ls -l villians.txt 
    villians.txt

    Здесь команда ^heroes^villians заменяет слово heroes на villians в непосредственно предшествующей команде (по умолчанию, если номер команды не задан) и в результате запускается команда ls -l villians.txt. Из документации командной оболочки можно узнать подробнее о синтаксисе изменения команд.

  • Можно написать сценарии командной оболочки для выполнения сложных операций, если существующие утилиты UNIX и встроенные команды оболочки не справляются с задачами, которые приходится выполнять регулярно.

Как будет показано в следующих статьях из серии "Использование UNIX", можно также загрузить и скомпилировать невероятное количество дополнительных UNIX-утилит, обычно распространяемых в открытых исходных кодах. Используя Google и Yahoo! в течение нескольких минут, как правило, можно найти и скачать готовое подходящее решение для задачи.

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

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

Сценарии автозагрузки не похожи на INI-файлы Microsoft® Windows®. Как это должно быть понятно из имени, сценарии автозагрузки командной оболочки - это полноценные сценарии оболочки, такие маленькие программы, которые выполняют какую-то работу. Эти сценарии запускаются, когда запускается или завершается командная оболочка, и производят соответствующую настройку окружения.

Запусти меня!

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

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

Обычно самыми первыми исполняются системные сценарии, такие как /etc/profile, и системный администратор может управлять ими. Системные сценарии автозагрузки предназначены для облегчения использования ресурсов, специфичных для конкретной системы. Например, если системный администратор предпочитает использовать более новую версию утилиты Secure Shell (SSH), так как в ней закрыта известная брешь безопасности, то он может установить инициализацию переменной PATH в /usr/local/bin:/bin:/usr/bin, установив таким образом в качестве приоритетного пути поиска исполняемых файлов каталог /usr/local/bin. (Если команда не найдена в /usr/local/bin, то командная оболочка продолжит искать ее в каталоге /usr/bin). Системные файлы автозагрузки также используются для установки имен принтеров и обеспечения пользователей разумными настройками командной оболочки.

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

Планирование для большого Bash

Число и имена сценариев автозагрузки различных командных оболочек также отличаются. Давайте рассмотрим последовательность загрузки сценариев в командной оболочке Bash, /bin/bash. Bash можно найти практически на всех системах UNIX и Linux®, обычно это стандартная командная оболочка новых установленных систем и новых пользователей. Это также вполне типичный представитель командных оболочек, который может служить хорошей площадкой для демонстрации работы. (При использовании другой командной оболочки из ее документации и страниц man можно узнать имена и последовательность загрузки сценариев.)

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

Первым Bash запускает системный сценарий /etc/profile, если он существует и доступен для чтения пользователем. После выполнения этого сценария, Bash ищет сценарии ~/.bash_profile, ~/.bash_login, ~/.profile и ~/.bashrc - именно в этом порядке, - где ~ - стандартный псевдоним пользовательского домашнего каталога (также доступный через переменную $HOME). При завершении работы Bash, командная оболочка ищет файл ~/.bash_logout.

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

В стародавние времена UNIX (немногим меньше двух десятилетий назад) пользователи обычно получали доступ к UNIX-машине через терминал. Они набирали свой пользовательский идентификатор и пароль в строке приглашения, и система порождала новый процесс командной оболочки для начала сессии пользователя. В этом окружении оболочка для входа в систему отличалась от остальных экземпляров командной оболочки (таких, например, как запускающие сценарии) по имени: имя процесса каждой командной оболочки, запущенной при входе в систему, предварялось дефисом, например, -bash. Это специальное имя - древнейший артефакт UNIX - говорит командной оболочке о необходимости выполнения специального конфигурирования для входа.

Что такое интерактивная оболочка, объяснить несколько проще: командная оболочка интерактивна, если она воспринимает входные данные (со стандартного устройства ввода) и выводит результат (на стандартное устройство вывода). Сейчас X-терминалы заменили текстовые, но соглашения и парадигмы режимов работы командных оболочек остались прежними. Обычно X-терминал запускает Bash под именем -bash, которое говорит о необходимости запустить загрузочную последовательность сценариев входа в систему.

В случае Bash интерактивная командная оболочка входа в систему запускает сценарий /etc/profile, если он существует. (Неинтерактивная оболочка также запускает /etc/profile, если Bash вызван командой bash -login.) Затем интерактивная оболочка ищет файл ~/.bash_profile и выполняет этот сценарий, если он существует и доступен для чтения пользователем. Иначе командная оболочка продолжает попытки выполнить ~/.bash_login. Если и этот файл не существует или недоступен для чтения, то Bash, наконец, пытается запустить файл ~/.profile. Bash запускает только один пользовательский сценарий автозагрузки: выполнение сценариев автозагрузки заканчивается непосредственно по окончании работы пользовательского сценария. Когда командная оболочка завершает работу, она запускает файл ~/.bash_logout.

Если Bash интерактивен, но не является запущенным для входа в систему, он пытается прочесть файл ~/.bashrc. Никакой другой сценарий не выполняется. Если Bash не интерактивен, он обращается к переменной BASH_ENV и выполняет указанный там файл.

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

. ~/.bashrc

в файл ~/.bash_profile. Когда командная оболочка получает команду . (точка), она выполняет сценарий с именем, указанным сразу же за этим оператором.

Равнение на shell

Лучший способ узнать последовательность загрузки сценариев в командной оболочке - это создать простой сценарий автозагрузки. Например, запускает ли утилита SSH удаленную командную оболочку входа в систему с именем farfaraway при запуске команды ssh farfaraway ls? Или, может быть, запускается простая интерактивная оболочка? Давайте выясним.

Листинги 1, 2, 3 и 4 демонстрируют примеры файлов /etc/profile, ~/.bash_profile, ~/.bashrc и ~/.bash_logout соответственно. (Если эти файлы существуют в системе, сделайте заранее их резервные копии перед тем как выполнять примеры. Потребуются привилегии суперпользователя на компьютере, чтобы изменить файл /etc/profile.) Используйте текстовый редактор, чтобы набрать файлы, представленные в примерах.

Листинг 1 дает пример сценария /etc/profile. Это первый запускаемый командной оболочкой файл (если он существует и доступен для чтения пользователем).

Листинг 1. Пример файла /etc/profile
echo "Executing /etc/profile."
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
export PATH

Сценарий, приведенный в листинге 1, выводит сообщение и устанавливает минимальное значение переменной PATH. Как уже говорилось выше, этот сценарий запускается, если оболочка является интерактивной командной оболочкой входа в систему. Например, если запустить новый X-терминал, то будет выведено такое сообщение::

Last login: Tue Apr 17 21:06:23 on ttyp1
Executing /etc/profile
(Interactive, login shell)
Executing /Users/strike/.bash_profile
(Interactive, login shell)
Including /Users/strike/.aliases
strike @ blackcat 1 $

Хорошо! Мы увидели предсказанную последовательность загрузки сценариев, когда запустили новую командную оболочку для входа в систему в X-терминале. Заметим, что написано в приглашении командной строки: там отображается имя пользователя, сокращенное имя компьютера и номер команды.

Если набрать команду logout или exit, то выведется следующее сообщение:

strike @ blackcat 31 $ logout
Executing /Users/strike/.bash_logout
(Interactive, login shell)

Как и было сказано раньше, интерактивная командная оболочка входа в систему запускает ~/.bash_logout.

Листинг 2 демонстрирует пример файла ~/.bash_profile. Этот файл - один из возможных способов настройки командной оболочки при загрузке.

Листинг 2. Пример файла ~/.bash_profile
echo "Executing $HOME/.bash_profile"
echo '(Interactive, login shell)'

PS1='\u @ \h \# \$ '
export PS1

PAGER=/usr/bin/less
export PAGER

. .aliases

Теперь посмотрим, что случается при запуске нового экземпляра командной оболочки из командной строки. Новая оболочка интерактивна, но она не является командной оболочкой входа в систему. Соответственно, ~/.bashrc - единственный файл, который должен быть запущен.

strike @ blackcat 1 $ bash
Executing /Users/strike/.bashrc
(Interactive shell)
blackcat:~ strike$

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

Чтобы проверить сценарий выхода из командной оболочки, наберем exit (невозможно выйти с помощью команды logout, так как это не оболочка входа в систему). Будет напечатано:

blackcat:~ strike$ exit
exit
Executing $HOME/.bash_logout
(Interactive, login shell)
strike @ blackcat 2 $

Когда интерактивная оболочка заканчивает свою работу, она выполняет сценарий ~/.bash_logout. Можно использовать эту особенность для удаления временных файлов, копирования важных файлов в качестве простейшего метода резервного копирования или даже для запуска утилиты rsync для копирования на другие компьютеры всех изменений, сделанных в самой последней сессии работы.

Листинг 3 демонстрирует пример сценария ~/.bashrc. Этот сценарий - файл инициализации для неинтерактивного варианта командной оболочки Bash.

Листинг 3. Пример ~/.bashrc
echo "Executing $HOME/.bashrc"
echo "(Interactive shell)"

PATH="/usr/local/bin:$PATH"
export PATH

Теперь другой эксперимент: какой режим будет у командной оболочки, при подключении через SSH? Давайте рассмотрим два варианта. (Можно просто использовать SSH для подключения к локальной машине, это работает так же, как если запускать SSH с удаленного компьютера.) Прежде всего, будем использовать SSH для входа в систему на удаленном компьютере:

strike @ blackcat 1 $ ssh blackcat
Last login: Tue Apr 17 21:17:35 2007
Executing /etc/profile
(Interactive, login shell)
Executing /Users/strike/.bash_profile
(Interactive, login shell)
Including /Users/strike/.aliases
strike @ blackcat 1 $

Как и предполагалось, запуск SSH для доступа к удаленному компьютеру инициирует запуск новой командной оболочки входа в систему. Теперь что произойдет, если запустить через SSH какую-нибудь команду? Вот ответ:

strike @ blackcat 3 $ ssh blackcat ls
Executing /Users/strike/.bashrc
(Interactive shell)
villians.txt
heroes.txt

Запуск команды удаленно через SSH инициирует запуск интерактивной оболочки, не являющейся командной оболочкой входа в систему. Почему интерактивной? Потому что стандартный ввод и стандартный вывод на удаленном компьютере связан с вашей клавиатурой и с вашим дисплеем, хотя и через SSH.

В листинге 4 дан пример файла ~/.bash_logout. Этот сценарий запускается, когда командная оболочка завершает работу.

Листинг 4: пример файла ~/.bash_logout
echo "Executing $HOME/.bash_logout"
echo "(Interactive, login shell)"

Советы по созданию файлов автозагрузки

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

  • Если необходимо использовать какие-то настройки (например, PATH) в каждом экземпляре командной оболочки (независимо от режима), производите эти настройки в ~/.bashrc и используйте source, чтобы запускать сценарии из ~/.bash_profile.
  • Если имеются учетные записи на нескольких компьютерах (и домашний каталог копируется через Network File System [NFS]), то используйте rsync, чтобы сохранять файлы автозагрузки используемой командной оболочки по сети на все компьютеры.
  • "Если настройки командной оболочки должны зависеть от компьютера, скажем, специальное значение PATH для системы, имеющей специализированные приложения, - сохраните эти настройки в отдельном файле и используйте команду source для загрузки этого файла. Если управление файлами выполняется с помощью rsync, исключите этот специализированный компьютер из списка копирования.

    Конечно, можно также создать глобальный сценарий и использовать проверку глобальной переменной HOSTNAME для выбора соответствующих настроек. (HOSTNAME устанавливается автоматически командной оболочкой и включает в себя полное имя компьютера). В качестве примера ниже представлен способ установки настроек в зависимости от имени компьютера:

    case $HOSTNAME in
      lab.area51.org)      
        PATH=/opt/rocketscience/bin:$PATH
        PS1='\u @ \h \# \$ '
        export $PS1;;
      
      alien.area51.org)
        PATH=/opt/alien/sw/bin:$PATH;;
        
      saucer*)
        PATH=/opt/saucer/bin:$PATH
        PAGER=less
        export $PAGER;;
        
      *) 
        PATH=/usr/local/bin:$PATH
    esac
           
    export $PATH

    В этом примере используется оператор switch для выбора значений переменной $HOSTNAME из четырех возможных значений: lab.area51.org, alien.area51.org, шаблона, которому удовлетворяет любое имя, начинающееся строкой saucer* (имя компьютера: скажем, saucer-mars будет удовлетворять этому шаблону, а имя sauce.tomato.org — нет) и все остальные имена. Здесь в случае командной оболочки Bash, звездочка (*) интерпретируется как оператор оболочки, а не оператор регулярного выражения. Когда выбор сделан в пользу одного из перечисленных вариантов, переменные окружения инициализируются соответственно выбранному варианту. В отличие от операторов switch в некоторых других языках программирования в Bash будут выполнены операторы только одного из вариантов, перечисленных в case.

Наконец, посмотрим файлы автозагрузки, созданные другими пользователями, чтобы обрести вдохновение и сохранить свои силы. (Некоторые пользователи не дают доступ к этим файлам и своим домашним каталогам, но кто же мешает сделать проверку?). Может, у Джо установлено прикольное и полезное приглашение командной строки? Узнай, как сделать такое же. Может, у Жаннет настроены дополнительные "горячие" клавиши или имеется хорошая коллекция переменных окружения, помогающих воспользоваться специальными особенностями каких-нибудь утилит? Узнайте у нее ее рецепты. Лучший источник идей и кода приходит от опытных практиков командной строки.

Настройка командной оболочки

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

На этом урок окончен.

Ресурсы

Научиться

Получить продукты и технологии

  • IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить прямо со страницы сообщества developerWorks.(EN)

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=AIX и UNIX
ArticleID=295598
ArticleTitle=Использование UNIX: Часть 10. Настройка командной оболочки
publish-date=03182008