Основные команды Bash. Команды bash в linux

В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.

Оболочка Bash: введение

Оболочка, или шелл (shell) - это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal , eterm , nxterm и т. п.

Навигация

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

pwd

Команда pwd , сокращение от print working directory , отображает текущее местоположение в структуре каталогов.

cd

Команда cd позволяет перейти в новый каталог.

mkdir

Команда mkdir создаёт новый каталог в текущем каталоге.

Основные команды

man

Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat:

$ man cat

cat

Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.

echo

Команда echo выводит свои аргументы по стандартному каналу вывода.

$ echo Hello World Hello World

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

head

Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:

$ head -50 test.txt

tail

Команда tail работает аналогично команде head , но читает строки с конца:

$ tail -50 test.txt

Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f:

$ tail -f test.txt

less

Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.

$ less test.txt $ ps aux | less

Подробнее о назначении символа | будет рассказано ниже в разделе команды history .

Обычные сочетания клавиш Описание
G Перемещает в конец файла
g Перемещает в начало файла
:50 Перемещает на 50 строку файла
q Выход из less
/searchterm Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки
/
?searchterm Поиск строки, совпадающей с ‘searchterm’, выше текущей строки
? Перемещает на следующий подходящий результат поиска
up Перемещает на одну строку выше
down Перемещает на одну строку ниже
pageup Перемещает на одну страницу выше
pagedown Перемещает на одну страницу ниже

true

Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.

false

Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.

$?

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

$ true $ echo $? 0 $ false $ echo $? 1

grep

Команда grep занимается поиском переданной строки в указанном файле:

$ cat users.txt user:student password:123 user:teacher password:321 $ grep "student` file1.txt user:student password:123

grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.

history

Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :

$ history | grep g++ 155 g++ file1.txt 159 g++ file2.txt

Здесь также используется символ | - это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой - таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history , но увидим вывод команды grep .

Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls , history , ps (описана ниже), перенаправляя их вывод в grep , sed или less , например.

export

Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student:

$ export name=student

ps

Команда ps выводит информацию о запущенных процессах.

$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash

Выводится четыре элемента:

  • ID процесса (PID),
  • тип терминала (TTY),
  • время работы процесса (TIME),
  • имя команды, запустившей процесс (CMD).

awk

Команда awk находит и заменяет текст в файлах по заданному шаблону: awk "pattern {action}" test.txt

wget

Команда wget скачивает файлы из Сети и помещает их в текущий каталог.

$ wget https://github.com/mikeizbicki/ucr-cs100

nc

ping

Команда ping тестирует сетевое подключение.

$ ping google.com PING google.com (74.125.224.34) 56(84) bytes of data. 64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 8ms rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms

Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.

git

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

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

Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.

Переменная HOME содержит путь к домашнему каталогу текущего пользователя.

Коннекторы

Коннекторы позволяют запускать несколько команд одновременно.

$ true && echo Hello Hello $ false || echo Hello Hello $ echo Hello ; ls Hello test.txt file1.txt file2.txt

Конвейеры

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

$ ls -l | head

Перенаправление ввода/вывода

Перенаправление вывода

Для стандартного перенаправления вывода используются символы > и >> .

Например, этот код передаст вывод ls в файл, а не на экран:

$ ls > files.txt $ cat files.txt file1.cpp sample.txt

Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> - она дописывает данные в конец файла.

Перенаправление ввода

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

$ cat files.txt c b $ sort < files.txt b c

Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:

$ sort < files.txt > files_sorted.txt

Продвинутое перенаправление

Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr .

$ g++ test.cpp $ ./a.out >& test.txt $ cat test.txt stdout stderr

Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .

Имя Дескриптор Описание
stdin 0 Стандартный поток ввода
stdout 1 Стандартный поток вывода
stderr 2 Стандартный поток вывода ошибок

Например, для перенаправления stderr в test.txt нужно сделать следующее:

$ g++ test.cpp $ ./a.out 2> test.txt stdout $ cat test.txt stderr

Права доступа

Команда ls -l выводит много информации о права доступа к каждому файлу:

chmod

Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:

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

$ chmod ug+rw test.txt $ ls -l test.txt -rw-rw---- 1 user group 1097374 January 26 2:48 test.txt

Кроме того, chmod можно использовать с восьмеричными числами, где 1 - это наличие прав, а 0 - отсутствие:

Rwx = 111 = 7 rw- = 110 = 6 r-x = 101 = 5 r-- = 100 = 4

Следующая команда сработает так же, как и предыдущая.

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

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

Таким образом, командный интерпретатор - это программа, имеющая свои собственные встроенные команды (built-in commands), свое собственное переменное окружение (environment), а также позволяющая выполнять внешние команды, которые присутствуют в системе.

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

Linux является Unix-подобной ОС. Первоначально ОС Linux была разработана Линусом Торвальдсом (Linus Torvalds) в Университете Хельсинки (Финляндия) на основе ОС Minix - маленькая UNIX-система, созданная Andry Tanenbaum. Раннее развитие Linux прежде всего было связано с проблемой переключения задач в защищенном режиме для 80386. И Линус "стал серьезно обдумывать маниакальную идею, как сделать Minix лучше себя самого".

Командная оболочка в UNIX-системах уже существовала, это была оболочка "Bourne shell"(shell Баурна или просто shell). Немного позднее в UNIX-системах разработали оболочку C shell, которая использует иной синтаксис, чем-то напоминающий синтаксис языка программирования Си.

Для Linux разработано много командных интерпретаторов. Основной, используемой по умолчанию является "Bash", разработанная на основе shell и называемая "Новый Shell Баурна" (Bourne Again Shell). Таким образом, Bash - это развитие прежнего shell с добавлением многих полезных возможностей, частично содержащихся в C shell. Поскольку Bash можно рассматривать как надмножество синтаксиса прежнего shell, любая программа, написанная на добром старом shell Баурна должна работать и в Bash.

Однако следует отметить, что ОС Linux не является UNIX-системой, так как ее код был полностью переписан, первоначально Линусом, в дальнейшем с помощью многих UNIX-программистов и энтузиастов из Internet, тех, кто имеет достаточно навыков и способностей развивать систему.

Ядро Linux не использует коды UNIX или какого-либо другого частного источника, и большинство программ Linux разработаны в рамках проекта GNU из Free Software Foundation в Cambridge, Massachusetts. Но в него внесли лепту также программисты всего мира.

Вот наиболее распространенные командные оболочи Linux:

  • Bourne shell - оболочка Борна, стандарт для многих UNIX-подобных систем;
  • bash - Bourne Again shell, «новая оболочка Борна» (используется по умолчанию в Linux);
  • csh - С shell, оболочка Си: синтаксис ее командного языка похож на синтаксис языка С;
  • tcsh - tiny С shell, минимальная оболочка Си;
  • pdksh - public domain Korn shell, общедоступная оболочка Корна;
  • sash - stand-alone shell, автономная оболочка, может быть использована в случае, когда программные библиотеки недоступны.

Список всех установленных в системе программ-оболочек находится в файле /etc/shells .

Начальная оболочка для каждого пользователя, запускаемая для него при регистрации в системе, указывается в файле /etc/passwd . Это может быть не обязательно bash. Администратор может вообще определенным пользователям запретить вход в систему, указав в качестве "оболочки", загружаемой после регистрации, /sbin/nologin. Или вообще указать специально разработанный скрипт, позволяющий просматривать тоги журналы (логи), например.

Для редактирования файла /etc/passwd в Linux существует специальная команда vipw , которая проверяет правильность редактирования (команда доступна только администратору).

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

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

Как я уже говорила, по умолчанию новому пользователю назначается оболочка bash. Это прекрасная оболочка, включающая много усовершенствований и лучших свойств других оболочек, и менять ее я не рекомендую. В дальнейшем, говоря «оболочка», я буду иметь в виду именно bash.

2. Разбор командной строки, избранные функции bash

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

  1. Раскрывает псевдонимы (alias) для быстрого вызова наиболее употребительных команд.
  2. Раскрывает метасимволы или группрвые симовлы (*, ?, [, ], ~, {, }) для поиска файлов по шаблонам имен.
  3. Подставляет переменные, которые может использовать командный процессор.
  4. Перенаправляет выходные данные одной команды в качестве входных данны для другой команды, используя конвейер (pipe).
  5. Выполняет объединение команд.
  6. Выполняет команду, если она - встроенная команда интерпретатора, или запускает процесс, если команда внешняя.
  7. Перенаправляет стандартный ввод/вывод.

Для выполнения трех последних функций необходимо использование специальных операторов. Разберем все перечисленные функции.

2.1. Псевдонимы

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

Например:

$ export HELLO="Hello from environment! " # пробел нужно экранировать кавычками

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

Окружение (environment)- это набор переменных, значения которых может менять поведение оболочки.

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

Таким образом, командный интерпретатор определяет переменные окружения, которые используются в текущем сеансе. Каждая новая введенная команда фактически запускается как дочерний процесс родительского процесса, в качестве которого, в данном случае выступает командный интерпретатор bash. Переменные окружения отличаются от обычных переменных тем, что они доступны как для родительских, так и для дочерних процессов. Автоматическое определение переменных окружение происходит после аутентификации пользователя в системе. Программа login, в случае успешного завершения процесса аутентификации, на основе файла /etc/passwd определяет какой командный интерпретатор будет использоваться в сеансе данного пользователя. После определения командного интерпретатора происходит настройка сеанса согласно конфигурационным файлам, представленным ниже.

Конфигурационный файл Описание
/etc/profile

Определяет переменные окружения для всех пользователей системы. Данный файл выполняется при первом входе в систему и содержит основные переменные окружения, такие как, переменная поиска расположения команд PATH, переменная имени хоста HOSTNAME, переменная, определяющая размер истории команд HISTSIZE. Кроме того данный файл генерирует дополнительные переменные окружения из конфигурационных файлов, находящихся в каталоге /etc/profile.d .

/etc/bashrc

Выполняется для всех пользователей, при каждом запуске командного интерпретатора bash. В данном файле определяется значение переменной PS1, а также дополнительные псевдопимы команд (alias). Псевдонимом называется сокращенное произвольно заданное название команды или последовательности команд, позволяющее выполнять сложные последовательности команд, не вводя их с клавиатуры, а вызывая их через обращение к соответствующему псевдониму. Переменные, определенные в данном файле могут«быть переназначены аналогичным пользовательским файлом -/.bashrc, который имеет более высокий приоритет.

-/.bashprofile

Используется как файл, содержащий индивидуальные настройки пользователя. Выполняется только один раз при входе пользователя в систему. Кроме того, данный файл осуществляет запуск файла -/.bashrc

~/.bashrc

Данный файл содержит переменные окружения и псевдонимы установленные пользователем. Он выполняется каждый раз при входе пользователя в систему или при открытии нового сеанса bash. Данный файл лучше всего подходит для определения пользовательских переменных и псевдонимов.

~/.bash_logout

Данный файл выполняется каждый раз при выходе из системы или завершении последнего сеанса интерпретатора bash. По умолчанию в данном файле содержится команда очистки экрана терминала.

/etc/inputrc

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

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

export AB=/usr/dog/contagious/ringbearer/grind

В данном примере временной переменной окружения AB присваивается путь к каталогу, расположенному достаточно "глубоко" в иерархии каталогов файловой системы. Команда export указывает на необходимость экспорта значения переменной АВ в оболочку, для того чтобы сделать его доступным для других оболочек, которые могут быть открыты в пределах текущего сеанса работы с системой. Теперь к указанному выше каталогу можно добраться посредством выполнения команды cd $AB

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

Для изменения конфигурационных файлов /etc/profile и /etc/bashrc необходимо быть суперпользователем root.

Обычные пользователи могут изменять конфигурационные файлы ~/.bash_profile, ~/.bashrc и ~/.bash_Iogout, находящихся в их домашних каталогах. В эти конфигурационные файлы можно включить установку своих переменных в окружение с помощью команды export и использовать их в любом сеансе.

Одной из наиболее часто изменяемых переменных окружения является переменная PATH. Можно также переопределить или дополнить переменную окружения PATH в конфигурационном файле ~/.bashrc.

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

Чтобы данные изменения применились в окружении текущей оболочки необходимо выполнить команду source .bashrc

Наиболее распространенные переменные окружения командной оболочки:

  • BASH - Содержит полный путь к команде bash (как правило, значение этой переменной равно /bin/bash).
  • BASH_VERSION - Номер версии bash.
  • DIRSTACK- Массив, содержащий текущее значение стека каталога.
  • EDITOR - текстовый редактор по умолчанию.
  • EUID - Числовой эффективный идентификатор текущего пользователя.
  • FUNCNAME - имя текущей функции в скрипте.
  • GROUPS - Массив, содержащий список групп, к которым принадлежит текущий пользователь.
  • HISTFILE - Местоположение файла истории команд. Как правило, история команд хранится в файле ~/.bash_history.
  • HISTFILESIZE - Число командных строк, которые могут храниться в файле истории. После достижения этого числа новые командные строки заносятся в историю за счет удаления наиболее ранних командных строк. По умолчанию размер списка недавно использовавшихся команд равен 1000 строк.
  • HOME - Домашний каталог пользователя.
  • HOSTNAME - Имя данного компьютера (узла).
  • HOSTTYPE - Тип компьютера.
  • LANG - Текущий используемый по умолчанию язык.
  • LC_CTYPE - внутренняя переменная, котороя определяет кодировку символов.
  • MAIL - Местоположения файла ящика электронной почты пользователя. Как правило, это файл, расположенный в каталоге /var/spool/mail, имя которого совпадает с регистрационным именем пользователя.
  • MAILCHECK - Интервал в минутах между проверками почты.
  • OLDPWD - Каталог, который являлся текущим до момента последнего изменения каталога.
  • OSTYPE - Текущая операционная система.
  • PATH - Разделенный символами двоеточия список каталогов, в которых производится поиск исполняемых файлов. Крайне важен порядок ледования имен каталогов. При выполнении команд перечисленные в этой переменной каталоги проверяются последовательно слева направо. Т.о., при выполнении команды foo, расположенной в каталогах /bin и /usr/bin, будет выполнена команда, расположенная в каталоге /bin. Для того чтобы в аналогичной ситуации была выполнена команда foo, расположенная в каталоге /usr/bin, следует либо указать полный путь к этой команде, либо изменить порядок следования имен каталогов в переменной окружения PATH. Текущий каталог поиска должен быть задан явно ("."), оболочка не производит поиск в текущем каталоге по умолчанию. Поиск запускаемых программ в текущем каталоге таит потенциальную опасность вследствие возможности непреднамеренного выполнения опасной программы, поэтому переменная PATH обычно инициализируется без "." Для того, чтобы добавить к переменной PATH путь к своим собственным командам или сценариям оболочки, их следует разместить в подкаталоге /bin домашнего каталога, который будет автоматически занесен в переменную PATH. Не все исполняемые команды расположены в каталогах, перечисленных в переменной окружения PATH. Некоторые команды встроены непосредственно в оболочку. Другие команды могут быть переопределены с помощью псевдонимов, позволяющих заменить команды с параметрами практически любой сложности (с точки зрения синтаксиса) одним простым именем. Помимо этого, существует возможность создания функций, хранящих в себе целую последовательность команд.
  • PPID - Идентификационный номер процесса, соответствующего команде, в результате выполнения которой была запущена текущая оболочка(например, процесс, породивший оболочку).
  • PS1, PS2, PS3, PS4 - Переменные, определяющие вид приглашения оболочки.

    Переменные PS1 и PS2 устанавливают первичное и вторичное приглашение командного интерпретатора.

    Вторичное приглашение (PS2) появляется, если вы нажали клавишу Enter, синтаксически не закончив ввод команды.

    Данная переменная содержит второстепенное приглашение, которое возникает при многострочном редактировании текста или незавершенном вводе команды. По умолчанию оно обозначается как >.

    PS3. Данная переменная содержит приглашение, присутствующее в операторе select, используемой для организации интерактивных консольных меню. По умолчанию приглашению PS3 в операторе select соответствует значение #?.

    PS4. Данная переменная используется в основном при отладке сценариев командного интерпретатора и по умолчанию содержит строковое значение «++».

    Например, запуск команды получения информации DNS:

    # nslookup >

  • PWD - Текущий рабочий каталог пользователя. Это значение изменяется каждый раз при переходе в другой каталог с помощью команды cd.
  • SECONDS - время работы скрипта(в сек.).
  • SHELL - Текущий интерпретатор команд.
  • SHELLOPTS - Список включенных параметров интерпретатора.
  • SHLVL - Число запусков новых копий интерпретатора команд.
  • UID - Числовой идентификатор текущего пользователя.
  • USER - Имя текущего пользователя.
  • $# - Общее количество параметров переданных скрипту.
  • $* - Все аргументы переданыне скрипту(выводятся в строку).
  • $@ - Тоже самое, что и предыдущий, но параметры выводятся в столбик.
  • $! - PID последнего запущенного в фоне процесса.
  • $$ - PID самого скрипта.

Чтобы просмотреть значения всех переменных текущего сеанса, как определенных вами, так и переменных окружения, введите команду set без параметров или env printenv .

Удалить переменную можно командой unset .

2.4. Подстановки и организация взаимодействия между командами

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

Подстановка результата вычисления арифметического выражения

Существуют две синтаксические формы подстановки результата вычисления арифметического выражения: $[выражение] и $((выражение)). Например,

echo "I am $ years old."

Подстановка команд

Подстановка команд позволяет использовать вывод одной команды в командной строке, содержащей другую команду. Можно использовать два альтернативных формата подстановки: $(команда) или `команда` (одинарные обратные кавычки). Например,

Раскрытие символа тильды

Символ тильды (~) позволяет быстро вводить названия каталогов.

~ Имя домашнего каталога пользователя ~/подкаталог Имя одного из подкаталогов в домашнем каталоге пользователя ~+ Имя текущего каталога ~- Имя предыдущего каталога

Раскрытие фигурных скобок

С помощью фигурных скобок можно вместо нескольких однотипных команд ввести одну. В скобках должен содержаться список, элементы которого должны быть разделены запятыми. Интерпретатор считывает элементы по одному и с каждым из них формирует отдельную команду, которую затем выполняет. Например, команда

mkdir expenses/{Jan,Feb,Mar} эквивалентна mkdir expenses/Jan mkdir expenses/Feb mkdir expenses/Mar

Каналы

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

cat /etc/passwd | sort | head -3

Последовательности и группы команд

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

команда1;команда2 Выполнить сначала команду 1, затем команду 2 (команда1;команда2) Запустить отдельную копию интерпретатора, в которой выполнить последовательно команды 1 и 2 { команда1;команда2 } Выполнить команды 1 и 2 последовательно в текущем интерпретаторе команда1 && команда2 Выполнить команду 2 только в случае успешного выполнения команды 1 команда1 || команда2 Выполнить команду 2 только в случае неуспешного выполнения команды 1

Результатом выполнения любой команды (т.е. результатом завершения соответствующего процесса) является код завершения. Успешное завершение имеет код 0, неуспешное 1. Значение кода завершения присваивается предопределенной переменной? (знак вопроса). Например, echo $?

Повторное выполнение команд

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

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

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

Синтаксис раскрытия истории: !n Выполнить команду с заданным номером!! Выполнить предыдущую команду!строка Выполнить самую последнюю из команд, начинающихся с заданной строки!?строка? Выполнить самую последнюю из команд, содержащих заданную строку

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

3. Встроенные команды bash

Список встроенных команд оболочки bash можно получить по команде help или найти на man-странице в секции SHELL BUILTIN COMMANDS.

Вот несколько полезных встроенных команд:

  • echo [аргументы] - Вывод аргументов на экран.
  • enable - Заставляет оболочку вместо встроенной команды выполнить исполняемый файл с таким же именем. Полезно, если у вас есть собственный сценарий по имени, например, echo.
  • eval [аргументы] - Конструирование команды на лету, из указанных аргументов, и отправка ее на выполнение.
  • let - Вычисление выражений.
  • - Прочитать и выполнить команды, содержащиеся в файле. Применяется для определения пользовательских переменных. и функций.
  • basename - Выделение локального имени.
  • expr - Вычисление выражения.
  • read - Ввод значения переменной.
  • shift - Сдвиг списка параметров.
  • test - Проверка условия.
Другие встроенные команды служат инструкциями командного языка bash.

В этом разделе описываются следующие темы:

  • Взаимодействие с командными интерпретаторами и командами
  • Команды и последовательности команд
  • Определение, использование и экспорт переменных окружения
  • История команд и средства редактирования
  • Запуск команд, находящихся в переменной окружения PATH так и вне нее
  • Использование подстановки команд
  • Применение команд рекурсивно к дереву каталогов
  • Использование man-страниц (помощи) для поиска информации о командах

Данный раздел дает описание некоторых основных возможностей командного интерпретатора bash. Особый акцент делается на возможностях, необходимых для сертификации. Командный интерпретатор это богатая среда, и мы приветствуем ее дальнейшее самостоятельное изучение. По командным интерпретаторам UNIX и Linux написано много книг и bash в частности.

Командный интерпретатор bash

Интерпретатор bash один из нескольких интерпретаторов, доступных в Linux. Также он называется B ourne-a gain sh ell, в честь Стивена Борна, создателя ранней версии интерпретатора (/bin/sh ).Bash по существу совместим с sh, но представляет много улучшений, как в функциональном плане, так и возможностям программирования. Он включает возможности интерпретаторов Korn (ksh) и C (csh), и разрабатывается как POSIX-совместимый интерпретатор.

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

Интерпретаторы содержат встроенные команды, такие как cd, break и exec. Другие команды являются внешними .

Интерпретаторы также используют три стандартных потока ввода/вывода:

  • stdin это стандартный поток ввода , который обеспечивает ввод для команд.
  • stdout это стандартный поток вывода , который обеспечивает отображение результатов выполнения команды в окне терминала.
  • stderr это стандартный поток ошибок , который отображает ошибки, возникающие при работе команд.

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

Если вы используете Linux систему без графического интерфейса или же вы открыли окно терминала в графическом режиме, то увидите приглашение для ввода команд как в Листинге 1.

Листинг 1. Примеры типичных пользовательских приглашений

$
ian@lyrebird:~>
$

Если вы зайдете как пользователь root (или суперпользователь), то ваше приглашение может выгладить, как показано в Листинге 2.

Листинг 2. Примеры приглашений для пользователя root или суперпользователя

#
lyrebird:~ #
#

Пользователь root имеет значительную власть, поэтому пользуйтесь им с осторожностью. Если у вас привилегии пользователя root, то большинство приглашений начинаются со знака решетки (#). Приглашение для обычного пользователя, как правило, начинается с другого символа, обычно это знак доллара ($). Ваше приглашение может отличаться от того, что написано в примерах данного руководства. Ваше приглашение может включать ваше пользовательское имя, имя машины, текущий каталог, дату или время, когда было напечатано приглашение, и так далее.

Некоторые соглашения этого руководства

Руководства developerWorks по экзаменам LPI 101 и 102 включают код примеров из реальных Linux систем, с использованием приглашений по умолчанию для этих систем. В нашем случае приглашение пользователя root начинается с #, так что вы можете отличить его от приглашений обычных пользователей, которые начинаются со знака $. Это соглашение совпадает с тем, которое используется в книгах по данному предмету. Внимательно смотрите приглашение командного интерпретатора в каждом примере.

Команды и последовательности

Вы находитесь в командном интерпретаторе, посмотрим, что вы можете теперь сделать. Основная функция командных интерпретаторов состоит в том, что он исполняет ваши команды, посредством которых вы взаимодействуете с Linux системой. В системах Linux (и UNIX) команды состоят из имени команды, опций и параметров. У некоторых команд нет ни опций, ни параметров, у других есть опции, но нет параметров, в то время как у третьих нет ни опций, ни параметров.

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

Команда Echo

Команда echo выводит на терминал список своих аргументов как показано в Листинге 3.

Листинг 3. Примеры команды echo

$ echo Слово
Слово
$ echo И предложение
И предложение
$ echo Куда подевались пробелы?
Куда подевались пробелы?
$ echo "А вот и пробелы." # и комментарий
А вот и пробелы.

В третьем примере Листинга 3 все промежутки между словами на выходе команды стали одного размера в один пробел. Чтобы этого избежать вам потребуется заключить строку в кавычки, используя или двойные кавычки (“) или одинарные (‘). Bash использует символы разделители, как пробелы, символы табуляции и символы новой строки для разбиения входной строки на токены, которые затем передаются вашей команде. Заключение строки в кавычки подавляет ее разделение и таким образом она является единым токеном. В приведенном выше примере каждый токен после имени команды является параметром, таким образом, у нас получается соответственно 1, 2, 4 и 1 параметр.

У команды echo есть несколько опций. Обычно echo добавляет после своего вывода символ новой строки. Используйте опцию -n чтобы она не добавляла символ новой строки. Используйте опцию -e, чтобы команда интерпретировала escape-последовательности.

Escape-последовательности и перенос строки

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

Чтобы последовательности, описанные выше, правильно обрабатывались командой echo или одной из многих других команд, которые используют похожие escape символы управления, вы должны заключить escape последовательности в кавычки или же включить их в строку, заключенную в кавычки, либо использовать еще один обратный слеш для верной интерпретации символов. Листинг 4 содержит примеры различных вариантов использования \.

Листинг 4. Примеры использования echo

$ echo -n Нет новой строки
Нет новой строки$ echo -e "Нет новой строки\c"
Нет новой строки$ echo "Строка в которой нажали
> клавишу Enter"
Строка в которой нажали
клавишу Enter
$ echo -e "Строка с escape символом\nновой строки"
Строка с escape символом
новой строки
$ echo "Строка с escape символом\nновой строки, но без опции -e"
Строка с escape символом\nновой строки, но без опции -e
$ echo -e Метасимволы с двойным\\n\\tобратным слешем
Метасимволы с двойным
обратным слешем
$ echo Обратный слеш \
> за которым следует Enter \
> служит как запрос на продолжение строки.
Обратный слеш за которым следует Enter служит как запрос на продолжение строки.

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

Метасимволы Bash и операторы управления

Bash включает несколько символов, которые, будучи не заключенными в кавычки, также служат для разделения входной строки на слова. Кроме пробела такими символами являются ‘|’, ‘&’, ‘;’, ‘(‘, ‘)’, ‘<’, и ‘>’. Некоторые из этих символов мы обсудим более подробно в других разделах этого руководства. А сейчас заметим, что если вы хотите включить метасимвол как часть вашего текста, то он должен быть заключен в кавычки или же ему должен предшествовать обратный слеш (\) как в Листинге 4.

Новая строка и соответствующие метасимволы или пары метасимволов также служат как операторы управления. Такими символами являются ‘||’, ‘&&’, ‘&’, ‘;’, ‘;;’, ‘|” ‘(‘, и ‘)’. Некоторые из этих операторов управления позволяют вам создавать последовательности или списки команд.

Простейшая последовательность команд состоит из двух команд, разделенных точкой с запятой (;). Каждая следующая команда исполняется после предыдущей. В любой среде программирования команды возвращают код, свидетельствующий о нормальном или неудачном завершении программы; команды Linux обычно возвращают 0 в случае успешного завершения и ненулевое значение в случае неуспеха. Вы можете осуществлять обработку по условию, используя управляющие операторы && и ||. Если вы разделите две команды управляющим оператором &&, то вторая команда будет выполняться только в том случае, если первая возвратила на выходе ноль. Если вы разделили команды с помощью ||, то вторая команда будет исполняться, только если первая возвратила ненулевое значение. Листинг 5 содержит некоторые последовательности команд с использованием команды echo. Эти примеры не очень интересны, так как echo возвращает 0, но мы рассмотрим больше примеров, когда научимся использовать большее число команд.

Листинг 5. Последовательности команд

$ echo line 1;echo line 2; echo line 3
line 1
line 2
line 3
$ echo line 1&&echo line 2&&echo line 3
line 1
line 2
line 3
$ echo line 1||echo line 2; echo line 3
line 1
line 3

Вы можете выйти из командного интерпретатора с помощью команды exit. Дополнительно в качестве параметра вы можете задать код выхода. Если вы работаете с командным интерпретатором в терминальном окне в графическом режиме, то в этом случае оно просто закроется. Аналогично, если вы подсоединены к удаленной системе с помощью ssh или telnet (например), то соединение завершится. В интерпретаторе bash вы также можете нажать клавишу Ctrl и d для выхода.

Давайте рассмотрим еще один оператор управления. Если вы заключите команду или список команд в круглые скобки, то команда или последовательность команд будет выполняться в своей копии командного интерпретатора, таким образом, команда exit выходит из копии командного интерпретатора, а не из того интерпретатора, в котором вы работаете в данный момент. Листинг 6 содержит простые примеры совместно с использованием && и ||.

Листинг 6. Командные интерпретаторы и последовательности команд

$ (echo В копии интерпретатора; exit 0) && echo OK || echo Bad exit
В копии интерпретатора
OK
$ (echo В копии интерпретатора; exit 4) && echo OK || echo Bad exit
В копии интерпретатора
Bad exit

Оставайтесь с нами и узнайте о других командах в этом руководстве.

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

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

Как у переменных окружения, так и у переменных оболочки есть имя. Ссылаться на значение переменной можно, поставив перед именем переменной знак ‘$’. Некоторые наиболее общие переменные среды bash приведены в Таблице 4.

  • USER Имя зашедшего в систему пользователя
  • UID Цифровой идентификатор зашедшего в систему пользователя
  • HOME Домашний каталог пользователя
  • PWD Текущий рабочий каталог
  • SHELL Имя командного интерпретатора
  • $ Идентификатор процесса (или PID) bash (или другого) процесса
  • PPID Идентификатор процесса, который породил данный процесс (то есть идентификатор родительского процесса)
  • ? Код выхода последней команды

На Листинге 7 можно видеть некоторые переменные bash.

Листинг 7. Переменные среды и shell

$ echo $USER $UID
ian 500
$ echo $SHELL $HOME $PWD
/bin/bash /home/ian /home/ian
$ (exit 0);echo $?;(exit 4);echo $?
0
4
$ echo $$ $PPID
30576 30575

Вы можете создать или установить переменную оболочки, набрав сразу за именем переменной знак равно (=). Переменные чувствительны к регистру, таким образом, var1 и VAR1 — это две разные переменные. По соглашению переменные, особенно экспортируемые переменные, пишутся в верхнем регистре, но это не обязательное требование. Формально, $$ и $? являются параметрами оболочки, а не переменными. Вы можете на них ссылаться, но не присваивать значения.

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

Чтобы проиллюстрировать присваивание и экспорт, создадим еще один bash из текущего bash интерпретатора, а затем запустим интерпретатор Korn из (ksh) созданного bash. Мы будем использовать команду ps для отображения информации о работающих процессах. Более подробно о команде ps мы узнаем, когда изучим понятие статус процесса далее в этом руководстве.

Не используете bash?

Интерпретатор bash принят по умолчанию во многих дистрибутивах Linux. Если вы работаете не с bash, то можете рассмотреть следующие способы, чтобы попрактиковаться в работе с bash.

  • Используйте команду
    chsh -s /bin/bash
    чтобы изменить интерпретатор по умолчанию. Изменения вступят в силу во время вашего следующего захода в систему.
  • Команда
    su – $USER -s /bin/bash
    создаст другой процесс, который будет являться дочерним по отношению к вашему текущему интерпретатору. Новый процесс запустит процесс входа в систему с командным интерпретатором bash.
  • Создайте пользователя с командным интерпретатором bash для того, чтобы приготовиться к сдаче экзамена LPI.

Листинг 8. Переменные среды и shell

$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
30576 30575 -bash
$ bash

PID PPID CMD
16353 30576 bash
$ VAR1=var1
$ VAR2=var2
$ export VAR2
$ export VAR3=var3
$VAR2 $VAR3
var1 var2 var3
$ echo $VAR1 $VAR2 $VAR3 $SHELL
var1 var2 var3 /bin/bash
$ ksh
$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
16448 16353 ksh
$ export VAR4=var4
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var2 var3 var4 /bin/bash
$ exit
$ $ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
var1 var2 var3 /bin/bash
$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
16353 30576 bash
$ exit
$ ps -p $$ -o "pid ppid cmd"
PID PPID CMD
30576 30575 -bash
$ echo $VAR1 $VAR2 $VAR3 $VAR4 $SHELL
/bin/bash

Примечание:

  1. В начале этой последовательности у интерпретатора bash был PID 30576 .
  2. У второго интерпретатора bash PID 16353, а его родительский PID 30576, то есть изначальный bash.
  3. Мы создали переменные VAR1, VAR2, и VAR3 во втором экземпляре bash, но экспортировали только VAR2 и VAR3.
  4. В интерпретаторе Korn, мы создали VAR4. Команда echo отображает значения только переменных VAR2, VAR3 и VAR4, и подтвердила, что VAR1 не была экспортирована. Вы не были удивлены, когда значение переменной SHELL не изменилось, хотя изменилось приглашение ввода? Вы не можете всегда полагаться на SHELL, чтобы определить в каком интерпретаторе идет работа, но команда ps позволит точно определить, что к чему. Заметим, что ps ставит дефис (-) перед первым экземпляром bash, чтобы дать нам понять, что это исходный командный интерпретатор .
  5. Во втором экземпляре bash мы можем просмотреть VAR1, VAR2 и VAR3.
  6. Наконец, когда мы возвращаемся в исходный интерпретатор, ни одна переменная в нем не существует.

Ранее мы обсуждали возможность использования кавычек как одинарных, так и двойных. Между ними есть существенная разница. Интерпретатор осуществляет подстановку shell переменных, находящиеся между двойными кавычками ($), но не осуществляет подстановку, если используются одинарные (‘). В предыдущем примере, мы создали новый экземпляр интерпретатора из другого и получили новый идентификатор процесса. Используя опцию -c вы можете передать команду в другой интерпретатор, который исполнит команду и произведет возврат. Если вы передаете строку в качестве команды в одинарных кавычках, то второй экземпляр интерпретатора их снимет и обработает строку. При использовании двойных кавычек подстановка переменных происходит до того как осуществится передача строки, поэтому результаты могут отличаться от того, что вы хотели ожидать. Интерпретатор и команда породят процесс, у которого будет свой PID. Листинг 9 иллюстрирует эти концепции. PID изначального интерпретатора bash выделен другим шрифтом.

Листинг 9. Кавычки и shell переменные

$ echo "$SHELL" "$SHELL" "$$" "$$"
/bin/bash $SHELL 19244 $$
$ bash -c "echo Expand in parent $$ $PPID"
Expand in parent 19244 19243
$ bash -c "echo Expand in child $$ $PPID"
Expand in child 19297 19244

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

Листинг 10. Использование фигурных скобок с именами переменных

$ echo "-$HOME/abc-"
-/home/ian/abc-
$ echo "-$HOME_abc-"
--
$ echo "-${HOME}_abc-"
-/home/ian_abc-

Команда env

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

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

Листинг 11. Команда env

$ env
HOSTNAME=echidna
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=9.27.89.137 4339 22
SSH_TTY=/dev/pts/2
USER=ian
...
_=/bin/env
OLDPWD=/usr/src
$ env -i bash -c "echo $SHELL; env"
/bin/bash
PWD=/home/ian
SHLVL=1
_=/bin/env
$ env -i ksh -c "echo $SHELL; env"
_=/bin/env
PATH=/bin:/usr/bin
$ env -i tcsh -c "echo $SHELL; env"
SHELL: Undefined variable.

Заметим, что bash установил переменную SHELL, но не экспортировал ее в среду, не смотря на то, что bash создал в среде три других переменных. В примере с ksh у нас содержится две переменных окружения, но наша попытка выдать на экран значение переменной SHELL приводит к появлению пустой строки. Наконец, tcsh не создал никаких переменных среды и выдал ошибку, когда мы попытались получить значение переменной SHELL.

Установка и обнуление переменных

Листинг 11 показал, как ведут себя интерпретаторы при обработке переменных и сред. Хотя это руководство уделяет внимание bash, следует знать, что не все интерпретаторы ведут себя одинаково. Более того, интерпретаторы ведут себя по-разному в зависимости от того, являются ли они исходными командными интерпретаторамиили нет. Сейчас мы просто скажем, что исходный командный интерпретатор это интерпретатор, который вы получаете при входе в систему; вы можете запустить другие командные интерпретаторы так, что они будут вести себя как исходные если пожелаете. Три интерпретатора в примере выше, запущенные с помощью команды env -i не являются исходными интерпретаторами. Попытайтесь передать опцию -l, чтобы увидеть разницу при запуске исходного командного интерпретатора.

Давайте рассмотрим нашу попытку отобразить значение переменной SHELL в этих командных интерпретаторах:

  • Когда bash запустился, он установил переменную SHELL, но не экспортировал ее автоматически в среду.
  • Когда запустился ksh, он не установил переменную SHELL. Однако ссылка на неопределенную переменную среды эквивалентно ссылке на пустое значение.
  • Когда запустился tcsh, то он не установил значение переменной SHELL. В этом случае поведение по умолчанию отлично от ksh (и bash) и в результате сгенерировалась ошибка, когда мы попытались получить доступ к переменной.

Вы можете использовать команду unset для обнуления переменной и удаления ее из списка shell переменных. Если переменная была экспортирована в среду, то она также будет удалена и из среды. Вы можете использовать команду set для управления поведением работы bash (или других интерпретаторов). Set является встроенной командой в интерпретаторе, поэтому опции зависят от конкретного интерпретатора. В bash опция -u сообщает bash, чтобы он не генерировал ошибку при ссылке на неопределенные переменные, а работал с ними как с пустыми значениями. Вы можете добавить различные опции к set с помощью – и отключить их с помощью +. Вы можете отобразить текущий список опций set с помощью echo $-.

Листнг 12. Unset и set

$ echo $-
himBH
$ echo $VAR1
$ set -u;echo $-
himuBH
$ echo $VAR1
bash: VAR1: unbound variable
$ VAR1=v1
$ VAR1=v1;echo $VAR1
v1
$ unset VAR1;echo $VAR1
bash: VAR1: unbound variable
$ set +u;echo $VAR1;echo $-
himBH

Вы можете использовать команду set без каких-либо опций, которая отобразит все ваши shell переменные и их значения (если есть). Есть также другая команда, declare, с помощью которой вы можете создавать, экспортировать и отображать значения shell переменных. О других опциях команд set и declare вы можете узнать из man-страниц. Мы рассмотрим man-страницы далее в этом разделе.

Команда exec

Последняя команда, которую мы рассмотрим в этом разделе это exec. Вы можете использовать команду exec, чтобы запустить другую команду, которая заместит текущий интерпретатор. В Листинге 13 порождается экземпляр bash, а затем используется exec, чтобы заместить его на интерпретатор Korn. После выхода из интерпретатора Korn, вы оказываетесь в исходном интерпретаторе bash (в этом примере PID 22985).

Листинг 13. Использование exec

$ echo $$
22985
$ bash
$ echo $$
25063
$ exec ksh
$ echo $$
25063
$ exit
$ echo $$
22985

История команд

сли вы набирали команды, по мере того как читали руководство, то могли заметить, что часто используются почти одни и те же команды. Хорошая новость состоит в том, что bash может хранить историю ваших команд. По умолчанию история включена. Вы можете отключить ее с помощью команды set +o history и включить с помощью команды set -o history. Переменная среды HISTSIZE сообщает bash о том, сколько надо хранить строк. Набор других свойств определяет поведение и работу истории. Подробности смотрите в man-страницах bash.

Если вы набирали команды, по мере того как читали руководство, то могли заметить, что часто используются почти одни и те же команды. Хорошая новость состоит в том, что bash может хранить историю ваших команд. По умолчанию история включена. Вы можете отключить ее с помощью команды set +o history и включить с помощью команды set -o history. Переменная среды HISTSIZE сообщает bash о том, сколько надо хранить строк. Набор других свойств определяет поведение и работу истории. Подробности смотрите в man-страницах bash.

Вот некоторые команды, которые вы можете использовать для работы с историей:

history
Отображает всю историю
historyN
Отображает последние N строк вашей истории
history -dN
Удаляет строку N из вашей истории; это можно использовать, если, например, вы хотите удалить строку, содержащую пароль
!!
Ваша последняя введенная команда
!N
Nая команда истории
!-N
Команда, отстоящая на N шагов от текущей в истории (!-1 эквивалентно!!)
!#
Текущая команда, которую вы набираете
!string
Самая недавняя команда, которая начинается со строки string
!?string?
Самая последняя команда, содержащая строку string

Вы можете использовать двоеточие (:), за которым следует определенное значение, чтобы получить доступ или изменить команду в истории. Листинг 14 показывает некоторые возможности истории.

Листинг 14. Управление историей

$ echo $$
22985
$ env -i bash -c "echo $$"
1542
$ !!
env -i bash -c "echo $$"
1555
$ !ec
echo $$
22985
$ !en:s/$$/$PPID/
env -i bash -c "echo $PPID"
22985
$ history 6
1097 echo $$
1098 env -i bash -c "echo $$"
1099 env -i bash -c "echo $$"
1100 echo $$
1101 env -i bash -c "echo $PPID"
1102 history 6
$ history -d1100

Команды в Листинге 14 делают следующее:

1. Вывод PID текущего интерпретатора
2. Запуск команды echo в новом экземпляре интерпретатора и вывод его PID
3. Запустить последнюю команду
4. Перезапустить команду, начинающуюся с ‘ec’; произойдет запуск первой команды в этом примере
5. Запустить последнюю команду, начинающуюся с ‘en’, но заменить ‘$PPID’ на ‘$$’, поэтому на самом деле отобразится родительский PID
6. Отобразить последние 6 команд истории
7. Удалить команду под номером 1100, последняя команда echo

Вы можете редактировать истории в интерактивном режиме. Интерпретатор bash использует библиотеку readline для управления редактированием команд и истории. По умолчанию, клавиши и комбинации клавиш, которые используются для перемещения по истории или редактированию строк соответствуют тем, что используются в редакторе GNU Emacs. В Emacs комбинации клавиш обычно обозначаются как C-x или M-x, где x это обычная клавиша, а C и M это Control и Meta клавиши соответственно. На типичном PC клавишаCtrlсоответствует клавише Emacs Control, а клавиша Alt соответствует клавише Meta. Дополнительные функции, а также возможности настройки опций с помощью файла инициализации readline (обычно это inputrc в вашем домашнем каталоге) можно найти в man-страницах.

Если вы предпочитаете управлять историей в режиме vi, то используйте команду set -o vi, чтобы переключиться в режим vi. Можете переключиться обратно в режим emacs с помощью команды set -o emacs. Когда вы извлекаете команду в режиме vi, то находитесь изначально в режиме вставки vi.

Пути

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

Где интерпретатор ищет команды?

Внешние команды представляют собой файлы в файловой системе. Дальше раздел Простое управление файлами этого руководства и руководства для Темы 104 раскрывают необходимые подробности. В системах Linux и UNIX все файлы являются частью огромного дерева, конем которого является /. В рассматриваемых выше примерах нашим текущим каталогом был домашний каталог пользователя. У обычных пользователей домашние каталоги находятся в /home каталоге, то есть /home/ian, в моем случае. Домашний каталог root находится в /root. После того как вы набрали команду, bash ищет ее в списке каталогов поиска по умолчанию, который представляет собой список каталогов, разделенных двоеточием и хранящийся в переменной окружения PATH.

Если вы хотите знать какая команда будет выполнена, если вы напечатаете определенную строку, то используйте команду which или type. В Листинге 15 показан мой путь по умолчанию, а также расположение нескольких команд.

Листинг 15. Поиск месторасположения команд

$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/ian/bin
$ which bash env zip xclock echo set ls
alias ls="ls --color=tty"
/bin/ls
/bin/bash
/bin/env
/usr/bin/zip
/usr/X11R6/bin/xclock
/bin/echo
/usr/bin/which: no set in (/usr/local/bin:/bin:/usr/bin:/usr/X11R6/b
in:/home/ian/bin)
$ type bash env zip xclock echo set ls
bash is /bin/bash
env is /bin/env
zip is /usr/bin/zip
xclock is /usr/X11R6/bin/xclock
echo is a shell builtin
set is a shell builtin
ls is aliased to `ls --color=tty"

Заметим, что все каталоги в пути заканчиваются на /bin. Это общепринятое соглашение, но не требование. Команда which доложила нам, что команда ls является псевдонимом и что команда set не может быть найдена. В этом случае это можно интерпретировать, что команды либо не существует, либо она является встроенной. Команда type сообщила нам, что команда ls на самом деле является псевдонимом, а также она определила, что команда set является встроенной командой интерпретатора; также она сообщила, что есть встроенная команда echo, а также есть такая команда в /bin, которую мы нашли с помощью команды which. Эти две команды по-разному осуществляют свой вывод.

Мы видели, что команда ls, используемая для просмотра содержимого каталогов, на самом деле является псевдонимом. Псевдонимы представляют удобный способ использования команд с различными наборами опций или же просто для альтернативного именования команды. В нашем примере опция –color=tty заставляет подсвечивать список файлов каталога в зависимости от типа файлов и каталогов. Попробуйте запустить dircolors –print-database, чтобы увидеть коды цветов, а также, какие цвета используются для конкретного типа файла.

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

Запуск других команд

В Листинге 15 мы видели, что полный путь исполняемых файлов начинается с корневого каталога /. Например, программа xclock это на самом деле /usr/X11R6/bin/xclock, файл, расположенный в каталоге /usr/X11R6/bin. Если программа не находится в переменной PATH, то вы можете запустить ее, указав полный путь к программе и саму программу. Существует два вида путей, которые вы можете использовать:

  • Абсолютные пути, которые начинаются с /, такие как мы видели в Листинге 15 (/bin/bash, /bin/env и так далее).
  • Относительные пути эти пути относительно вашего текущего рабочего каталога, имя которого можно получить с помощью команды pwd. Такие команды не начинаются с /, но по крайней мере содержат один символ /.

Вы можете использовать абсолютные пути в независимости от вашего текущего рабочего каталога, но возможно будете использовать относительные пути, когда команда находится недалеко от текущего каталога. Предположим, что вы разрабатываете новую версию классической программы “Hello World!” в подкаталоге mytestbin вашего домашнего каталога. Возможно вы захотите использовать относительный путь и запустить команду как mytestbin/hello. Существует два специальных имени, которые вы можете использовать в указании пути; простая точка (.) ссылается на текущий каталог, и пара точек (..), которые ссылаются на родительский каталог текущего каталога. Так как ваш домашний каталог не находится в переменной окружения PATH (и так и должно быть), то вам понадобится указать явный путь к файлу, который вы хотите запустить из своего домашнего каталога. Например, если у вас есть копия программы hello в вашем домашнем каталоге, то для ее запуска можете просто использовать команду./hello. Вы можете использовать как. так и.. как часть абсолютного пути, хотя одинарная.не очень полезна в данном случае. Вы можете использовать тильду (~) для ссылки на свой домашний каталог и ~usernameдля ссылки на домашний каталог пользователя username.Некоторые примеры приведены в Листинге 16.

Листнг 16. Абсолютные и относительные пути

$ /bin/echo Use echo command rather than builtin
Use echo command rather than builtin
$ /usr/../bin/echo Include parent dir in path
Include parent dir in path
$ /bin/././echo Add a couple of useless path components
Add a couple of useless path components
$ pwd # See where we are
/home/ian
$ ../../bin/echo Use a relative path to echo
Use a relative path to echo
$ myprogs/hello # Use a relative path with no dots
-bash: myprogs/hello: No such file or directory
$ mytestbin/hello # Use a relative path with no dots
Hello World!
$ ./hello # Run program in current directory
Hello World!
$ ~/mytestbin/hello # run hello using ~
Hello World!
$ ../hello # Try running hello from parent
-bash: ../hello: No such file or directory

Смена рабочего каталога

Также как вы можете исполнять программы из различных каталогов, вы можете изменять ваш текущий рабочий каталог, используя команду cd. Аргументом для cd должен быть абсолютный или относительный путь до каталога. В команде при указании путей вы также можете использовать., .., ~, и ~username. Если вы наберете cd без параметров, то перейдете в домашний каталог. Передача в качестве параметра одиночного (-) означает переход в предыдущий рабочий каталог. Домашний каталог хранится в переменной окружения HOME, а предыдущий каталог хранится в переменной OLDPWD, поэтому cd эквивалентно cd $HOME, а cd – эквивалентно cd $OLDPWD. Обычно мы коротко говорим о смене каталога вместо полной смены текущего рабочего каталога.

Что касается команд, существует переменная среды CDPATH, которая содержит список каталогов, разделенных двоеточием, в которых должен происходить поиск (в дополнение к текущему рабочему каталогу), при разрешении относительных путей. Если решение использует путь из CDPATH, то cd напечатает на выходе полный путь найденного каталога. Обычно удачная смена каталога сопровождается появлением нового приглашения или немного модифицированного приглашения. Некоторые примеры показаны в Листинге17.

Листнг 17. Смена каталогов

$ cd /;pwd
$ cd /usr/X11R6;pwd
/usr/X11R6
$ cd ;pwd
/home/ian
$ cd -;pwd
/usr/X11R6
/usr/X11R6
$ cd ~ian/..;pwd
/home
$ cd ~;pwd
/home/ian
$ export CDPATH=~
$ cd /;pwd
$ cd mytestbin
/home/ian/mytestbin

Рекурсивное применение команд

Многие Linux команды можно применять рекурсивно ко всем файлам в дереве каталогов. Например, у команды ls есть опция -R для рекурсивной выдачи списка каталогов, а у команд cp, mv, rm, и diff есть опция -r для рекурсивного применения.

Подстановка команд

У bash есть чрезвычайно мощная возможность передачи результата одной программы на вход другой; это называется подстановкой команды. Это можно сделать, заключив команду, результаты которой вам нужны, в апострофы (`). При использовании множественных вложенных команд можно заключать команду между $(и).

В предыдущем руководстве ” LPI 101: Установка Linux и управление пакетами” мы видели, что команда rpm может сказать какому пакету принадлежит какая команда; здесь было удобно применять подстановку команды. Теперь вы знаете, что мы действительно это делали.

Подстановка команды является бесценными инструментом при написании сценариев, а также при использовании в командной строке. В Листинге 18 показан пример, как получить абсолютный путь каталога из относительного, как найти пакет, который предоставляет команду /bin/echo, и как (будучи root) просмотреть метки трех разделов на жестком диске. Последний использует команду seq для создания последовательности целых чисел.

Листинг 18. Подстановка команды

$ echo "../../usr/bin" dir is $(cd ../../usr/bin;pwd)
../../usr/bin dir is /usr/bin
$ which echo
/bin/echo
$ rpm -qf `which echo`
sh-utils-2.0.12-3
$ su -
Password:
# for n in $(seq 7 9); do echo p$n `e2label /dev/hda$n`;done
p7 RH73
p8 SUSE81
p9 IMAGES

Man-страницы

В последней теме раздела этого руководства рассмотрим, как получить справку по командам Linux с помощью man-страниц и других видов документации.

Man-страницы и разделы

Главный (и традиционный) источник документации — это man-страницы, доступ к которым можно получить с помощью команды man. На Рисунке 1 показана man-страница для команды man. Используйте команду man man для получения этой информации.

На Рисунке 1 представлены некоторые типичные пункты man-страниц:

* Заголовок с именем команды, за которым в скобках следует номер раздела
* Имя команды и другие похожие команды, которые обсуждаются в этой man-странице
* Список опций и параметров примених к команде
* Короткое описание команды
* Подробное описание каждой опции

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

apropos(1), whatis(1), less(1), groff(1) и man.conf(5).

Обычно общими для man-страниц являются 8 разделов. Большинство страниц обычно ставиться при установке пакета, поэтому если пакет не установлен, то почти наверняка у вас будут отсутствовать его man-страницы. Кроме того, некоторые разделы страниц могут быть пустыми или почти пустыми. Наиболее общие разделы man-страниц это:

1. Команды пользователя (env, ls, echo, mkdir, tty)
2. Системные вызовы или функции ядра (link, sethostname, mkdir)
3. Библиотечные функции (acosh, asctime, btree, locale, XML::Parser)
4. Информация по оборудованию (isdn_audio, mouse, tty, zero)
5. Описание формата файолов (keymaps, motd, wvdial.conf)
6. Игры (заметим, что многие игры теперь работают в графическом режиме, поэтому могут иметь собственную систему помощи, а не man-страницы)
7. Разное (arp, boot, regex, unix utf8)
8. Системное администрирование (debugfs, fdisk, fsck, mount, renice, rpm)

Другие разделы могут включать 9 для документации по ядру Linux, nдля новой документации, o для старой документации и l для локальной документации.

Некоторые записи могут встречаться в нескольких разделах. Наши примеры показали, что mkdir содержится в разделах 1 и 2, а tty в разделах 1 и 4. Вы можете определить определенный раздел, например, man 4 tty или man 2 mkdir, или вы можете использовать опцию -a для получения списка всех разделов man-страниц.

Вы заметили на рисунке, что у man много опций, которые вы можете сами посмотреть. Сейчас давайте быстро взглянем на раздел команд “See also”, имеющих отношение к man.

See also

Две важнейших команды, имеющих отношение к man, это whatis и apropos. Команда whatis ищет man-страницы для указанного вами имени и отображает информации об имени из соответствующих man-страниц. Команда apropos осуществляет поиск по ключевым словам в man-страниц и выводит те, которые содержат ваше слово. В Листинге 19 эти команды представлены.

Листинг 19. Примеры команд whatis и apropos

$ whatis man
man (1) - format and display the on-line manual pages
man (7) - macros to format man pages
man (1) - format and display the on-line manual pages
man.conf (5) - configuration data for man
$ whatis mkdir
mkdir (1) - make directories

$ apropos mkdir
mkdir (1) - make directories
mkdir (2) - create a directory
mkdirhier (1x) - makes a directory hierarchy

Между прочим если вы не можете найти man-страницу для man.conf, то попытайтесь запустить man man.conf ig .

Вывод на экран команды man осуществляет специальная программа постраничного вывода. На большинстве Linux систем такой программой будет less. Другим вариантом может быть более старая программа more. Если вы хотите напечатать страницу, то определите опцию -t для форматирования страницы и печати, используя программу groff или troff.

У программы вывода less есть несколько команд, облегчающих поиск строк в отображаемом тексте. Используйте команду man less, чтобы узнать больше о /(поиск вперед), ?(поиск назад) и n (для последнего произведенного поиска), а также о многих других командах.

Другие источники документации

В дополнение к man-страницам, доступным из командной строки, фонд Free Software Foundation создал большое число info файлов, которые обрабатываются программой info. Она обладает большими возможностями навигации, в том числе и возможностью перехода в другую секцию. Наберите man info или info info, чтобы получить больше информации. Не все команды документированы в info, поэтому вы можете использовать как man-страницы так и info.

Существует несколько графических интерфейсов к man-страницам, как например xman (из проекта XFree86) и yelp (браузер помощи Gnome 2.0).

Если вы не можете найти справки по команде, попытайтесь запусить команду с опцией –help. Так вы, возможно, узнаете то что хотели или получите подсказку, где ещё можно поискать.

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