Назад Вернуться к оглавлению Дальше

UNIX и Linux. Книга ответов.
Заказать можно здесь

5. Интерфейс командной строки (оболочка Bash и некоторые полезные утилиты)

5.1. Что такое оболочка
5.2. Специальные символы
5.3. Выполнение команд
5.4. Стандартный ввод/вывод
5.5. Перенаправление вывода, каналы и фильтры
5.6. Параметры и переменные. Окружение оболочки.
5.7. Раскрытие выражений (expansion)
5.8. Shell как язык программирования
5.9. Скрипты
5.10. Некоторые употребительные команды
5.11. Работа с архиваторами

В этом разделе мы рассмотрим работу с системой Linux в текстовом режиме, то есть с консоли или терминала. Начинающему пользователю может казаться, что он никогда не будет работать в этом режиме, поскольку существует графический режим. Однако это мнение глубоко ошибочно, ибо многие действия оказывается быстрее и удобнее выполнять именно в текстовом режиме. Даже находясь в графическом режиме, Вы часто будете открывать окно эмулятора терминала и выполнять необходимые действия в этом окне. Ведь текстовый режим ОС Linux - это совсем не то, что текстовый режим однозадачной MS-DOS. Поскольку Linux - это многозадачная ОС, уже в текстовом режиме обеспечивается возможность работы в нескольких окнах (о переключении терминалов мы рассказали в разделе 3.3). А для редактирования простого текста или html-файла вовсе не обязательно запускать достаточно тяжеловесную и медленную (особенно на "слабых" компьютерах) графическую оболочку. В этом разделе мы попытаемся рассказать, как выполнять некоторые работы в текстовом режиме.

5.1. Что такое оболочка?

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

Сразу надо сказать, что в принципе любая программа в Линукс может быть запущена как через оболочку (если запущен X-сервер), так и через графический интерфейс пользователя (GUI). Запуск программ из оболочки эквивалентен двойному щелчку мышкой по иконке программы в GUI. Передача аргументов программе аналогична тому, что мы "бросаем" что-то на иконку программы. Но, с другой стороны, некоторые программы не приспособлены для запуска через GUI, так что можно сказать, что существуют программы, предназначенные для исполнения только из командной строки (через оболочку).

В настоящем разделе мы рассмотрим только текстовый режим, то есть оболочку shell.

Собственно говоря, такое название не выдерживает никакой критики. На мой взгляд правильнее было бы называть эту программу командным процессором, как называют command.com в MS DOS, или интерпретатором команд. Но так уж повелось во всех UNIX-системах, что интерпретатор команд для текстового режима называют оболочкой.

Когда-то (в первых UNIX-системах) это была программа с именем sh, которое было сокращением от shell. Потом были разработаны несколько ее улучшенных вариантов, в частности, Bourne shell - расширенная версия sh, написанная Стивом Борном (Steve Bourne). В рамках проекта GNU была создана оболочка bash, название которой расшифровывается как Bourne-again shell, то есть "снова оболочка Борна". Правда, по-английски в этом названии просматривается еще и игра слов, связанная с тем, что Bourne звучит как borne (рождаться, рожденный), и получается "рожденная заново shell". Оболочка bash была написана Брайеном Фоксом (Brian Fox - основной разработчик) и Четом Рэми (Chet Ramey).

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

Прежде чем читать дальше этот раздел, вернитесь ненадолго к разделу 3.4 и просмотрите снова основные комбинации клавиш, которые используются для для управления вводом, когда Вы находитесь в оболочке. Запомните для начала хотя бы то, как пользоваться клавишами [Ctrl-c], [Ctrl-d], [Tab] и клавишами со стрелками.

5.2. Специальные символы

bash использует несколько символов из числа 256 символов набора ASCII в специальных целях, либо для обозначения некоторых операций, либо для преобразования выражений. В число таких символов входят символы

` ~ ! @ # $ % ^ & * ( ) _ - [ ] { } : ; ' " / \ > <
а также символ с кодом 0, символ возврата каретки (генерируемый клавишей [Enter] и пробел. В зависимости от ситуации эти специальные символы могут трактоваться либо в их специальном значении, либо в их буквальном значении, то есть как литералы. Но мы в основном будем предполагать, что все эти символы зарезервированы и не должны использоваться как литералы. Это касается в первую очередь использования их в именах файлов и каталогов, о чем мы уже говорили в предыдущей главе. Однако символы "_", "-" и "." часто используются в именах файлов, так что именно этот пример показывает, что специальное значение эти символы имеют не всегда (в именах файлов только символы точки "." и слэша "/" имеют специальное значение).

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

Символ "\" можно назвать "символом отмены специального значения" для любого из специальных символов, который стоит сразу вслед за "\". Например, если мы хотим использовать символ пробела в имени файла, мы должны вместо простого пробела поставить "\ ". Например, возможна следующая команда:

	cp two_words two\ words
Символы ' и " могут быть названы "символами цитирования". Любой из этих символов всегда используется в паре с его копией для взятия в кавычки какого-то выражения (совсем как в обычном письменном тексте). Если какой-то текст взят в одинарные кавычки, то все символы внутри этих кавычек воспринимаются как литералы, никаким из них не придается специального значения. Если вернуться к тому же примеру с пробелами в имени файла, то можно сказать, что для того, чтобы дать файлу имя "two words" надо взять имя в кавычки:
	cp two_words 'two words'

Различие в использовании символов ' и " состоит в том, что внутри одинарных кавычек теряют специальное значение все символы, а внутри двойных кавычек - все специальные символы, кроме $, ' и \.

5.3. Выполнение команд

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

Оператор ;

Хотя чаще всего пользователь задает команды в командной строке по одной, оболочка предоставляет возможность задать в одной строке несколько команд, которые будут выполнены последовательно, одна за другой. Для этого используется специальный символ-оператор ; (если не поставить этот разделитель команд, то последующая команда может быть воспринята как аргумент предыдущей). Таким образом, если написать в командной строке что-то вроде:

    [kos] $ command1 ; command2
то вначале оболочка запустит на выполнение команду command1, дождется, пока ее выполнение завершится, после чего запустит command2, дождется ее завершения, после чего снова выведет приглашение командной строки, ожидая следующих действий пользователя.

Оператор &

Оператор & используется для того, чтобы организовать исполнение команд в фоновом режиме. Если поставить значок & после команды, то оболочка вернет управление пользователю сразу после запуска команды, не дожидаясь, пока выполнение команды завершится. Например, если задать в командной строке "command1 & command2 &", то оболочка запустит команду command1, сразу же затем команду command2, и затем немедленно вернет управление пользователю.

Операторы && и ||

Операторы && и || являются управляющими операторами. Если в командной строке стоит command1 && command2, то command2 выполняется в том, и только в том случае, если статус выхода из команды command1 равен нулю. Аналогично, если командная строка имеет вид command1 || command2, то команда command2 выполняется тогда, и только тогда, когда статус выхода из команды command1 отличен от нуля.

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

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

5.4. Стандартный ввод/вывод

Когда программа запускается на выполнение, в ее распоряжение предоставляются три потока или канала:

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

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

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

Работу со стандартными входным и выходным потоками лучше всего проиллюстровать на примере команды cat.

Команда cat

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

Обычно клавиатура настроена на построчный ввод, поэтому если Вы нажмете клавишу [Enter], последняя набранная строка передается команде cat, которая вновь выводит данные на монитор через стандартный вывод. Таким образом, каждая строка будет показана дважды: один раз при наборе и второй раз - командой cat.

Если нажать комбинацию клавиш [Ctrl-d], которая служит командой окончания процедуры ввода, Вы вновь вернетесь к подсказке в командной строке. Можно также использовать комбинацию клавиш [Ctrl-c], которая является в оболочке командой завершения работы запущенной программы.

Если команде cat в качестве аргумента задать имя файла, это будет означать, что содержимое файла будет направлено во входной поток, откуда его примет команда cat и выдаст в выходной поток. Но это только частный случай перенаправления ввода, очень полезного механизма оболочки, который, безусловно, заслуживает более подробного рассмотрения.

Команда echo

Еще одна команда, всегда работающая со стандартным выводом - это команда echo. Эта команда просто выдает на стандартный вывод то, что мы задали ей в качестве аргумента.

5.5. Перенаправление ввода/вывода, каналы и фильтры

Хотя обычно, как было сказано, ввод/вывод программы связаны со стандартными потоками, в оболочке существуют специальные средства для перенаправления ввода/вывода. Чаще всего используется перенаправление вывода команды в файл, для чего используются специальные символы " > " или " >> ". Вот соответствующий пример:
[kos]$ ls -l > /home/jim/dir.txt
По этой команде в файле /home/jim/dir.txt будет сохранен перечень файлов и подкаталогов того каталога, который был текущим на момент выполнения команды ls; при этом если указанного файла не существовало, то он будет создан; если он существовал, то будет перезаписан; если же Вы хотите, чтобы вывод команды был дописан в конец существующего файла, то надо вместо символа ">" использовать ">>". При этом наличие пробелов до или после символов > или >> несущественно и служит только для удобства пользователя.

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

[kos]$  wc -w < /home/jim/report.txt

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

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

cat > file
cat>file
>file cat
> file cat
Однако сам по себе (без какой-либо команды, для которой определены стандартные потоки) символ перенаправления не может использоваться, так что нельзя, например, введя в командной строке
[kos] $ file1 > file2
получить копию какого-то файла.

Но это не уменьшает значения данного механизма, ведь стандартные потоки определены для любой команды. При этом перенаправить можно не только стандартный ввод и вывод, но и другие каналы. Для этого надо указать перед символом перенаправления номер перенаправляемого канала. Стандартный ввод имеет номер 0, стандартный вывод - номер 1, стандартный поток сообщений об ошибках - номер 2. То есть полный формат команды перенаправления имеет вид (напомним, что пробелы возле > не обязательны):

N > M
где N и M - номера стандартных потоков (0,1,2) или имена файлов. Употребление символов < > >> без указания номера канала или имени файла возможно потому, что вместо отутствующего номера по умолчанию подставляется 1, то есть стандартный вывод. Так, оператор > без указания номера интерпретируется как 1>.

Кроме простого перенаправления стандартных потоков существует еще возможность не просто перенаправить тот или иной канал, а сделать в файле копию содержимого стандартного канала. Для этого служит специальный символ &, который ставится перед номером канала, на который перенаправляется поток:

N>&M
Такая команда означает, что выход канала с номером N направляется как на стандартный вывод, так и дублируется в канал с номером M. Например, для того, чтобы сообщения об ошибках дублировались на стандартный вывод надо дать команду 2>&1, в то время как 1>&2 перенаправляет stdout в stderr. Такая возможность особенно полезна при перенаправлении вывода в файл, так как мы тогда одновременно и видим сообщения на экране и сохраняем их в файле.

Оператор |

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

[kos]$ cat myfile | grep Linux | wc -l
Эта строка означает, что вывод команды cat, то есть текст из файла myfile, будет направлен на вход команды grep, которая выделит только строки, содержащие слово Linux. Вывод команды grep будет, в свою очередь, направлен на вход команды wc -l, которая подсчитает число таких строк.

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

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

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

Фильтры

Последний из приведенных выше примеров (с командой grep) можно использовать для иллюстрации еще одного важного понятия, а именно, программы-фильтра. Фильтры - это команды (или программы), которые воспринимают входной поток данных, производят над ним некоторые преобразования и выдают результат на стандартный вывод (откуда его можно перенаправить куда-то еще по желанию пользователя). К числу команд-фильтров относятся уже упоминавшиеся в предыдущих таблицах команды cat, head, tail, wc, sort, cpio, а также следующие команды:
 

more, less Организуют постраничный вывод входных данных
grep, fgrep, egrep Ищут во входном файле или данных со стандартного ввода строки, содержащие указанный шаблон, и выдают их на стандартный вывод
tr Заменяет во входном потоке все встречающиеся символы, перечисленные в заданном перечне, на соответствующие символы из второго заданного перечня
diff Находит различия в двух заданных файлах или каталогах 
cmp Выполняет по-символьное (по-байтное) сравнение двух файлов и выдает результат в стандартный вывод
comm Сравнивает два файла по строкам и выдает в один выходной файл все строки, которые совпадают, а во второй файл - строки, которые различаются.
pr Форматирует для печати текстовый файл или содержимое стандартного ввода
sed Строковый редактор, использующийся для выполнения некоторых преобразований над входным потоком данных (берется из файла или со стандартного ввода)

Особым фильтром является команда tee, которая "раздваивает" входной поток, с одной стороны направляя его на стандартный вывод, а с другой - в файл (имя которого Вы должны задать). Легко видеть, что по своему действию команда tee аналогична оператору перенаправления 1>&file.

Возможности фильтров можно существенно расширить за счет использования регулярных выражений, позволяющих организовать, например, поиск по различным, зачастую очень сложным, шаблонам.
О перенаправлении, регулярных выражениях, командах ОС и, в частности, фильтрах можно было бы говорить очень много. Но этот материал имеется в большинстве книг по UNIX, в том числе и в книгах, указанных в разделе "Источники и ссылки", например у Петерсена и Келли-Бутла. Поэтому ограничимся сказанным и перейдем к рассмотрению так называемой среды или окружения, создаваемого оболочкой. Это окружение представляет собой совокупность переменных с их значениями.

5.6. Параметры и переменные. Окружение оболочки.

Понятие параметра в оболочке bash подобно понятию переменной в обычных языках программирования. Именем (или идентификатором) параметра может быть слово, состоящее из алфавитных символов, цифр и знаков подчеркивания (только первый символ этого слова не может быть цифрой), число или один из следующих специальных символов:
*, @, #, ?, - (дефис), $, !, 0, _ (подчеркивание).

Говорят, что параметр задан или установлен (a parameter is set), если ему присвоено значение. Значением может быть и пустая строка.

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

Имена (идентификаторы) позиционных параметров состоят из одной или более цифр (только не из одиночного нуля). Значениями позиционных параметров являются аргументы, которые были заданы при запуске оболочки (первый аргумент является значением позиционного параметра 1, и так далее). Изменить значение позиционого параметра можно с помощью встроенной команды set. Значения этих параметров изменяются также на время выполнения оболочкой одной из функций (об этом будет рассказано ниже, в разделе Shell как язык программирования.

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

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

[kos]$ name=value
где "name" - имя переменной, а "value" - присваиваемое ей значение (может быть пустой строкой). Имя переменой может состоять только из цифр и букв и не может начинаться с цифры. Значение - любой текст. Если значение содержит специальные символы (смотри раздел 5.2), то его надо взять в кавычки. Присвоенное значение этих кавычек не содержит, естественно. Если переменная задана, то ее можно удалить, используя встроенную команду оболочки unset.

Набор всех установленных переменных оболочки с присвоенными им значениями называется окружением (envirenment) или средой оболочки. Вы можете просмотреть его с помощью команды set (может быть, следует организовать конвейер "set | less"). В выводе этой команды все переменные окружения перечисляются в алфавитном порядке.

Для того, чтобы воспользоваться значением переменной ("вызвать переменную по имени") нужно записать "$name". Например, чтобы просмотреть значение одной конкретной переменной, можно вместо команды set (в выводе которой нужную переменную еще искать и искать) можно воспользоваться командой

[kos]$ echo $name
(правда, в этом случае Вы должны знать имя интересующей Вас переменной).

Среди переменных, которые Вы увидите в выводе команды set, встречаются очень интересные переменные. Обратите, например, внимание на переменную RANDOM. Если Вы несколько раз подряд выполните команду

[kos]$ echo $RANDOM
Вы каждый раз будете получать новое значение. Дело в том, что эта переменная возвращает случайное целое из интервала 0 - 32768.

Приглашения оболочки

Одна из очень полезных переменных имеет имя PS1. Эта переменная задает вид приглашения, которое bash выводит, когда ожидает ввода очередной команды пользователем. По умолчанию этой переменной присвоено значение "$". Вообще-то в bash существует четыре приглашения, которые используются в разных ситуациях. Переменная PS1 задает вид строки приглашения, которая выдается тогда, когда оболочка ждет ввода команды. Вторичное приглашение, задаваемое переменной PS2, появляется тогда, когда оболочка ожидает от пользователя ввода еще каких-то данных, необходимых для продолжения работы запущенной команды или программы. По умолчанию переменная PS2 имеет значение >. Вы уже имели возможность видеть это приглашение, когда запускали команду cat с перенапрвлением вывода в файл. Приглашение, задаваемое переменной PS3, используется в команде select (о которой будет идти речь в разделе Shell как язык программирования). Приглашение, задаваемое переменной PS4, выводится перед каждой командой, в то время, когда bash отслеживает процесс выполнения. Значение по-умолчанию - "+".

Вид приглашений PS1 и PS2 можно изменить, если изменить значения соответствующих переменных. При этом можно использовать следующие специальные символы:

   \t     текущее время в формате HH:MM:SS (часы:минуты:секунды)
   \d     дата в формате "День_недели  Месяц  Число"
          (например, "Tue May 26")
   \n     (перевод строки) новая строка
   \s     имя оболочки
   \w     полное имя текущего рабочего каталога (начиная с корня)
   \W     имя текущего рабочего каталога (без указания пути)
   \u     имя пользователя, запустившего оболочку
   \h     имя компьютера (the hostname)
   \#     текущий номер команды
   \!     номер данной команды в истории команд
   \$     если эффективный UID есть 0, то #, иначе - $
   \nnn   символ, соответствующий восьмеричному номеру nnn
   \\     обратный слэш (a backslash)
   \[     начало последовательности не печатаемых символов
          (этот символ может быть использован для того, чтобы включить в текст
	  подсказки последовательность управляющих символов терминала)
   \]     конец последовательности не печатаемых символов
Текущий номер команды (порядковый номер выполняемой команды в рамках текущей сессии) может отличаться от номера данной команды в списке истории команд, поскольку последний включает в себя команды, которые были сохранены в файле истории команд.

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

Переменная PATH

Другая очень важная переменная имеет имя PATH. Она задает перечень путей к каталогам, в которых bash осуществляет поиск файлов (в частности, файлов с командами) в тех случаях, когда полный путь к файлу не задан в командной строке. Отдельные каталоги в этом перечне разделяются двоеточиями. По умолчанию переменная PATH включает каталоги /usr/local/bin, /bin, /usr/bin, /usr/X11R6/bin, /home/kos/bin, то есть имеет вид:

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/kos/bin.

Для того, чтобы добавить каталог в этот список, нужно выполнить следующую команду:

[root]# PATH=$PATH:new_path.

При осуществлении поиска оболочка просматривает каталоги именно в том порядке, как они перечислены в переменной PATH.

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

Переменная IFS

Эта переменная задает разделители полей (Internal Field Separator), которые используются при операции разделения слов при преобразованиях командной строки, выполняемых оболочкой перед тем, как запустить командную строку на исполнение. Значение этой переменой по умолчанию состоит из пробела, символа табуляции и символа новой строки: <space><tab><newline>.

export

Когда оболочка запускает на выполнение какую-то программу или команду, она передает им часть переменных окружения (вместе с их значениями). Для того, чтобы переменная окружения передавалась запускаемому из оболочки процессу, ее нужно задавать с помощью специальной команды export, то есть вместо
[kos]$ name=value
надо записать
[kos]$ export name=value
В таком случае все запускаемые из оболочки программы (в том числе вторичные экземпляры самой оболочки) будут иметь доступ к заданным таким образом переменным, то есть могут вызывать их значения по именам.


Назад Вернуться к оглавлению Дальше

В.А.Костромин
Последние изменения
в содержание файла внесены
5 февраля 2001 г.