8.3. Bourne Again Shell (bash)

8.3.1. Переменные окружения

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

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

Запустив set без опций, вы увидите все определённые на данный момент переменные окружения вместе с их значениями. Как и большинство встроенных в bash команд set может выполнять много других вещей (с помощью параметров); однако вместо их рассмотрения мы сошлёмся на страницу руководства bash(1). В Прим. 8-1 показана часть вывода команды set, выполненной на компьютере автора. Обратите внимание в этом примере на переменную PATH, которую мы обсуждали ранее. Программы изо всех этих каталогов можно запускать, набирая просто их названия, не указывая полный путь к ним.

Пример 8-1. Вывод списка переменных окружения с помощью set

% set
PATH=/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin
PIPESTATUS=([0]="0")
PPID=4978
PS1='\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/home/logan
QTDIR=/usr/local/lib/qt
REMOTEHOST=ninja.tdn
SHELL=/bin/bash
% unset ПЕРЕМЕННАЯ

Команда unset удаляет любые указанные вами переменные, уничтожая и саму переменную, и её значение. bash вообще забудет о том, что такая переменная существовала. (Не беспокойтесь. Если вы вы что-то и определили в этом сеансе шелла, это скорее всего будет переопределено в любом другом сеансе.)

% export ПЕРЕМЕННАЯ=значение

Команда export действительно очень удобна. С её помощью вы присваиваете переменной окружения ПЕРЕМЕННАЯ определённое “значение”. Если ПЕРЕМЕННАЯ не существует, она будет немедленно создана. Если ПЕРЕМЕННАЯ уже имеет какое-то значение, оно будет потеряно. Это нехорошо, если вы, например, хотите просто добавить каталог в свою переменную PATH. В этом случае вам надо выполнить что-то вроде этого:

% export PATH=$PATH:/типа/новый/каталог

Обратите внимание на использование $PATH: если вам нужно, чтобы bash интерпретировал переменную (т.е. использовал её значение), поставьте перед именем переменной знак $. Например, команда echo $PATH выведет на экран значение переменной PATH; в моём случае это выглядело так:

% echo $PATH
/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin

8.3.2. Завершение ввода табуляцией

(Здесь снова идёт какой-то вступительный текст.)

  1. В интерфейсе командной строки выполняется много ввода с клавиатуры.

  2. Ввод с клавиатуры - это работа.

  3. Никто не любит работать.

Из пунктов 3 и 2 следует, что (4) никто не любит осуществлять ввод с клавиатуры. К счастью bash избавляет нас нас от (5) пункта (никому не нравится интерфейс командной строки).

Вы спросите: “Каким образом bash предоставляет эту прекрасную возможность?” В дополнение к расширениям шаблонов подстановки, рассмотренным нами выше, bash обладает возможностью завершения ввода табуляцией (tab completion).

Завершение работает примерно так: вы набираете имя файла. Он может находиться в вашей переменной PATH, или вы можете набирать полный путь к нему. Всё, что вам нужно сделать - набрать достаточно полное имя файла, чтобы уникально идентифицировать его. Затем нажмите клавишу Tab. bash выяснит, что вам нужно и завершит ввод имени за вас!

Рассмотрим пример. К каталоге /usr/src находятся два подкаталога: /usr/src/linux и /usr/src/sendmail. Нам нужно увидеть, что находится в /usr/src/linux. Мы набираем только ls /usr/src/l, жмём TAB, и bash даёт нам полный путь ls /usr/src/linux.

Теперь представим, что существуют два каталога: /usr/src/linux и /usr/src/linux-old. Если мы наберём /usr/src/l и нажмём TAB, bash заполнит за нас столько, сколько сможет, и мы получим /usr/src/linux. На этом можно остановиться или нажать ещё раз TAB, при этом bash выведет список каталогов, которые соответствуют тому, что мы набрали ранее.

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