• Основы программирования в командной оболочке shell. Командная оболочка в UNIX

    Командный язык shell (в переводе - раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой. Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар ("$"). Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX - стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками. shell - это одна из многих команд UNIX. То есть в набор команд оболочки "shell" входит команда "sh" - вызов интерпретатора "shell". Первый "shell" вызывается автоматически при вашем входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам "shell", который вам создаст новую оболочку внутри прежней. Так например, если вы подготовите в редакторе файл "file_1":

    Echo Hello!

    то это будет обычный текстовый файл, содержащий команду "echo", которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл "file_1" выполняемым с помощью команды "chmod 755 file_1". Но его можно выполнить, вызвав явно команду "sh" ("shell"):

    Sh file_1

    Sh < file1

    Файл можно выполнить и в текущем экземпляре "shell". Для этого существует специфическая команда "." (точка), т.е.

    File_1

    Поскольку UNIX - система многопользовательская, вы можете даже на персональном компьютере работать параллельно, скажем, на 12-ти экранах (переход с экрана на экран ALT/функциональная клавиша), имея на каждом экране нового (или одного и того же) пользователя со своей командной оболочкой. Можете и в графическом режиме X-Window также открыть большое число окон, а в каждом окне может быть свой пользователь со своей командной оболочкой... Стержневым элементом языка shell является команда.

    Структуры команд:

    Команды в shell обычно имеют следующий формат:

    <имя команды> <флаги> <аргумент(ы)>

    Например:

    Ls -ls /usr/bin

    Где ls - имя команды выдачи содержимого директория, -ls - флаги ("-" - признак флагов, l - длинный формат, s - об"ем файлов в блоках), /usr/bin - директорий, для которого выполняется команда. Эта команда выдаст на экран в длинном формате содержимое директория /usr/bin, при этом добавит информацию о размере каждого файла в блоках. К сожалению, такая структура команды выдерживается далеко не всегда. Не всегда перед флагами ставится минус, не всегда флаги идут одним словом. Есть разнообразие и в представлении аргументов. К числу команд, имеющих экзотические форматы, относятся и такие "ходовые" команды, как сс - вызов компилятора языка С, tar - работа с архивами, dd - копирование файла с преобразованием, find - поиск файлов и ряд других. Как правило, первое слово shell воспринимает, как команду. Поэтому в командной строке

    первое слово будет расшифровано shell, как команда (конкатенации), которая выдаст на экран файл с именем "cat" (второе слово), находящийся в текущем директории. Перенаправление команд Стандартный ввод (вход) - "stdin" в ОС UNIX осуществляется с клавиатуры терминала, а стандартный вывод (выход) - "stdout" направлен на экран терминала. Существует еще и стандартный файл диагностических сообщений - "stderr", о котором речь будет чуть позже. Команда, которая может работать со стандартным входом и выходом, называется ФИЛЬТРОМ. Пользователь имеет удобные средства перенаправления ввода и вывода на другие файлы (устройства). Символы ">" и ">>" обозначают перенаправление вывода. ls >file_1 команда "ls" сформирует список файлов текущего каталога и поместит его в файл "file_1" (вместо выдачи на экран). Если файл "file_1" до этого существовал, то он будет затерт новым.

    Pwd >>file_1

    команда pwd сформирует полное имя текущего каталога и поместит его в конец файла "file_1", т.е. ">>" добавляет в файл, если он непустой. Символы "<" и "<<" обозначают перенаправление ввода.

    Wc -l

    подсчитает и выдаст на экран число строк в файле file_1.

    Ed file_2 <

    создаст с использованием редактора файл "file_2", непосредственно с терминала. Окончание ввода определяется по символу, стоящему правее "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

    Wc -l file_4

    Wc -l >file_4

    выполняются одинаково: подсчитывается число строк файла "file_3" и результат помещается в файл "file_4". Средство, объединяющее стандартный выход одной команды со стандартным входом другой, называется КОНВЕЙЕРОМ и обозначается вертикальной чертой "|".

    Ls | wc -l

    список файлов текущего каталога будет направлен на вход команды "wc", которая на экран выведет число строк каталога. Конвейером можно объединять и более двух команд, когда все они, возможно кроме первой и последней - фильтры:

    Cat file_1 | grep -h result | sort | cat -b > file_2

    Данный конвейер из файла "file_1" ("cat") выберет все строки, содержащие слово "result" ("grep"), отсортирует ("sort") полученные строки, а затем пронумерует ("cat -b") и выведет результат в файл "file_2". Поскольку устройства в ОС UNIX представлены специальными файлами, их можно использовать при перенаправлениях. Специальные файлы находятся в каталоге "/dev". Например, "lp" - печать; "console" - консоль; "ttyi" - i-ый терминал; "null" - фиктивный (пустой) файл (устройство). Тогда, например,

    Ls > /dev/lp

    выведет содержимое текущего каталога на печать, а file_1 < /dev/null обнулит файл "file_1".

    Sort file_1 | tee /dev/lp | tail -20

    В этом случае будет отсортирован файл "file_1" и передан на печать, а 20 последних строк также будут выданы на экран. Вернемся к перенаправлению выхода. Стандартные файлы имеют номера:

    0 - stdin, 1 - stdout 2 - stderr. Если вам не желательно иметь на экране сообщение об ошибке, вы можете перенаправить его с экрана в указанный вами файл (или вообще "выбросить", перенаправив в файл "пустого устройства" - /dev/null). Например при выполнении команды

    Cat file_1 file_2

    которая должна выдать на экран последовательно содержимое файлов "file_1" и "file_2", выдаст вам, например, следующее

    111111 222222 cat: f2: No such file or directory

    где 111111 222222 - содержимое файла "file_1", а файл "file_2" отсутствует, о чем команда "cat" выдала сообщение в стандартный файл диагностики, по умолчанию, как и стандартный выход, представленный экраном. Если вам не желательно такое сообщение на экране, его можно перенаправить в указанный вами файл:

    Cat file_1 file_2 2>f-err

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

    Cat file_1 file_2 >>ff 2>ff

    Можно указать не только какой из стандартных файлов перенаправлять, но и в какой стандартный файл осуществить перенаправление.

    Cat file_1 file_2 2>>ff 1>&2

    Здесь сначала "stderr" перенаправляется (в режиме добавления) в файл "ff", а затем стандартный выход перенаправляется на "stderr", которым к этому моменту является файл "ff". То есть результат будет аналогичен предыдущему. Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без пробелов. <- закрывает стандартный ввод. >- закрывает стандартный вывод. Командные файлы. Для того, чтобы текстовый файл можно было использовать как команду, существует несколько возможностей. Пусть с помощью редактора создан файл с именем "cmd", содержащий одну строку следующего вида:

    Date; pwd; ls

    Можно вызвать shell как команду, обозначаемую "sh", и передать ей файл "cmd", как аргумент или как перенаправленный вход, т.е.

    $ sh cmd

    $ sh

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

    Chmod 711 cmd

    сделает код защиты "rwx__x__x". Тогда простой вызов

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

    Date; pwd; ls

    представлен в виде: date pwd ls так как переход на другую строку также является разделителем в последовательности команд. Таким образом, выполняемыми файлами могут быть не только файлы, полученные в результате компиляции и сборки, но и файлы, написанные на языке shell. Их выполнение происходит в режиме интерпретации с помощью shell-интерпретатора

    Отладка командных файлов

    В SHELL используются два механизма отладки командных файлов. Первый из них: set -v выводит строки командного файла по мере их чтения. Этот режим применяется при поиске синтаксических ошибок. Для его использования не требуется производить модификацию командного файла, например: sh -v proc... здесь proc - имя командного файла. Ключ -v может использоваться вместе с ключом -n, предотвращающим выполнение следующих за ним команд (команда set -n блокирует терминал до тех пор, пока не вводится признак конца файла EOF). Команда set -х выводит команды по мере их выполнения, причём на терминал выводятся строки программы и на место переменных подставляются их значения. Для отмены ключей -x и -v можно воспользоваться командой set - а для установки - присвоить соответствующее значение макропеременной. СРЕДА SHELL (ПЕРЕМЕННЫЕ И ПАРАМЕТРЫ) На языке shell можно писать командные файлы и с помощью команды "chmod" делать их выполняемыми. После этого они ни чем не отличаются от прочих команд ОС UNIX.

    Shell-переменные

    Имя shell-переменной - это начинающаяся с буквы последовательность букв, цифр и подчеркиваний. Значение shell-переменной - строка символов. То, что в shell всего два типа данных: строка символов и текстовый файл, с одной стороны, позволяет легко вовлекать в программирование конечных пользователей, никогда ранее программированием не занимавшихся, а с другой стороны, вызывает некий внутренний протест у многих программистов, привыкших к существенно большему разнообразию и большей гибкости языковых средств. Однако интересно наблюдать то, как высококлассные программисты, освоившись с "правилами игры" shell, пишут на нем программы во много раз быстрее, чем на Си, но, что особенно интересно, в ряде случаев эти программы работают даже быстрее, чем реализованные на Си. Имя переменной аналогично традиционному представлению об идентификаторе, т.е. именем может быть последовательность букв, цифр и подчеркиваний, начинающаяся с буквы или подчеркивания. Для присваивания значений переменным может использоваться оператор присваивания "=".

    Var_1=13 - "13" - это не число, а строка из двух цифр. var_2="ОС UNIX" - здесь двойные кавычки (" ") необходимы, так как в строке есть пробел.

    Возможны и иные способы присваивания значений shell-переменным. Так например запись,

    DAT=`date`

    приводит к тому, что сначала выполняется команда "date" (обратные кавычки говорят о том, что сначала должна быть выполнена заключенная в них команда), а результат ее выполнения, вместо выдачи на стандартный выход, приписывается в качестве значения переменной, в данном случае "DAT". Можно присвоить значение переменной и с помощью команды "read", которая обеспечивает прием значения переменной с (клавиатуры) дисплея в диалоговом режиме. Обычно команде "read" в командном файле предшествует команда "echo", которая позволяет предварительно выдать какое-то сообщение на экран. Например:

    Echo -n "Введите трехзначное число:" read x

    При выполнении этого фрагмента командного файла, после вывода на экран сообщения

    Введите трехзначное число:

    интерпретатор остановится и будет ждать ввода значения с клавиатуры. Если вы ввели, скажем, "753" то это и станет значением переменной "x". Одна команда "read" может прочитать (присвоить) значения сразу для нескольких переменных. Если переменных в "read" больше, чем их введено (через пробелы), оставшимся присваивается пустая строка. Если передаваемых значений больше, чем переменных в команде "read", то лишние игнорируются. При обращении к shell-переменной необходимо перед именем ставить символ "$". Так команды echo $var_2 echo var_2 выдадут на экран

    ОС UNIX var_2 Экранирование

    Рассмотрим более подробно приемы экранирования, используемые в shell. В качестве средств экранирования используются двойные кавычки (" "), одинарные кавычки (" ") и бэк-слэш (\). Из примеров очевидно их действие: Можно в одной строке записывать несколько приcваиваний.

    X=22 y=33 z=$x A="$x" B="$x" C=\$x D="$x + $y + $z" E="$x + $y + $z" F=$x\ +\ $y\ +\ $z

    (присваивание G=$x+$y не было бы выполнено из-за пробелов) Тогда

    Echo A = $A B = $B C = $C echo D = $D E = $E F = $F eval echo evaluated A = $A eval echo evaluated B = $B eval echo evaluated C = $C

    Выдадут на экран

    A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 evaluated A = 22 evaluated B = 22 evaluated C = 22

    Приведем еще примеры, связанные с экранированием перевода строки. Пусть переменной "string" присвоено значение "массива" 2x3: abc def Обратим внимание, что для избежания присваивания лишних пробелов вторая строка массива начата с первой позиции следующей строки: string="abc def" Тогда три варианта записи переменной в команде "echo" echo $string echo "$string" echo "$string" дадут соответственно три различных результата: abc def $string abc def а последовательность команд echo "str_1 str_2" > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 даст выдаст последовательно одинаковые файлы file_1 и file_2: str_1 str_2 str_1 str_2 Заметим также, что бэк-слэш (\) не только экранирует следующий за ним символ, что позволяет использовать специальные символы просто как символы, представляющие сами себя (он может экранировать и сам себя - \\), но в командном файле бэк-слэш позволяет об"единять строки в одну (экранировать конец строки). Например, приводившийся ранее пример командной строки:

    Cat file_1 | grep -h result | sort | cat -b > file_2

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

    Cat file_1 | grep -h \ result | sort | cat -b > file_2

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

    Cat file_1 | grep -h result | sort | cat -b > file_2

    Манипуляции с shell-переменными Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т. е. "35" - это не число, а строка из двух символов "3" и "5", в раде случаев они могут интерпретироваться иначе, например, как целые числа. Разнообразные возможности имеет команда "expr". Проиллюстрируем некоторые на примерах: Выполнение командного файла:

    X=7 y=2 a=`expr $x + $y` ; echo a=$a a=`expr $a + 1` ; echo a=$a b=`expr $y - $x` ; echo b=$b c=`expr $x "*" $y` ; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; echo e=$e

    выдаст на экран

    A=9 a=10 b=-5 c=14 d=3 e=1

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

    A=`expr "cocktail" : "cock"` ; echo $A B=`expr "cocktail" : "tail"` ; echo $B C=`expr "cocktail" : "cook"` ; echo $C D=`expr "cock" : "cocktail"` ; echo $D

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

    4 0 0 0

    Экспорт переменных В ОС UNIX существует понятие процесса. Процесс возникает тогда, когда запускается на выполнение какая-либо команда. Например, при наборе на клавиатуре "р " порождается процесс "р". В свою очередь "р" может породить другие процессы. Допустим, что "р" вызывает "р1" и "р2", которые последовательно порождают соответствующие процессы. У каждого процесса есть своя среда - множество доступных ему переменных. Например, до запуска "р" уже существовала среда, в которой уже были определены некоторые переменные. Запуск "р" порождает новую среду; уже в ней будут порождены "р1" и "р2". Переменные локальны в рамках процесса, в котором они объявлены, т.е. где им присвоены значения. Для того, чтобы они были доступны и другим порождаемым процессам, надо передать их явным образом. Для этого используется встроенная команда "export".

    Параметры

    В командный файл могут быть переданы параметры. В shell используются позиционные параметры (т.е. существенна очередность их следования). В командном файле соответствующие параметрам переменные (аналогично shell-переменным) начинаются с символа "$", а далее следует одна из цифр от 0 до 9: Пусть "examp-1" вызывается с параметрами "cock" и "tail". Эти параметры попадают в новую среду под стандартными именами "1" и "2". В (стандартной) переменной с именем "0" будет храниться имя вызванного расчета. При обращении к параметрам перед цифрой ставится символ доллара "$" (как и при обращении к переменным): $0 соответствует имени данного командного файла; $1 первый по порядку параметр; $2 второй параметр и т.д. Поскольку число переменных, в которые могут передаваться параметры, ограничено одной цифрой, т.е. 9-ю ("0", как уже отмечалось имеет особый смысл), то для передачи большего числа параметров используется специальная команда "shift". Своеобразный подход к параметрам дает команда "set". Например, фрагмент

    Set a b с echo первый=$1 второй=$2 третий=$3

    выдаст на экран

    Первый=a второй=b третий=c

    т.е. команда "set" устанавливает значения параметров. Это бывает очень удобно. Например, команда "date" выдает на экран текущую дату, скажем, "Mon May 01 12:15:10 2000", состоящую из пяти слов, тогда

    Set `date` echo $1 $3 $5

    выдаст на экран

    Mon 01 2000

    Команда "set" позволяет также осуществлять контроль выполнения программы, например: set -v на терминал выводятся строки, читаемые shell. set +v отменяет предыдущий режим. set -x на терминал выводятся команды перед выполнением. set +x отменяет предыдущий режим. Команда "set" без параметров выводит на терминал состояние программной среды.

    Подстановки shell-интерпретатора

    Перед началом непосредственной интерпретации и выполнением команд, содержащихся в командных файлах, shell выполняет различные виды подстановок: 1. ПОДСТАНОВКА РЕЗУЛЬТАТОВ. Выполняются все команды, заключенные в обратные кавычки, и на их место подставляется результат. 2. ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ И ПЕРЕМЕННЫХ. То есть слова, начинающиеся на "$", заменяются соответствующими значениями переменных и параметров. 3. ИНТЕРПРЕТАЦИЯ ПРОБЕЛОВ. Заэкранированные пробелы игнорируются. 4. ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ. Проверяются слова на наличие в них спецсимволов ("*", "?","") и выполняются соответствующие генерации. Программная среда Каждый процесс имеет среду, в которой он выполняется. Shell использует ряд переменных этой среды. Если вы наберете команду "set" без параметров, то на экран будет выдана информация о ряде стандартных переменных, созданных при входе в систему (и передаваемых далее всем вашим новым процессам "по наследству"), а также переменных, созданных и экспортируемых вашими процессами. Конкретный вид и содержание выдаваемой информации в немалой степени зависит от того, какая версия UNIX используется и как инсталлирована система.

    Результат выполнения команды set без параметров (не полный):

    HOME=/root PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/sae/STUDY/SHELL PS1=${PWD}:" " PS2=> SHELL=/bin/bash

    Прокомментируем значения переменных. HOME=/root - это имя домашнего директория, в котором пользователь оказывается после входа в систему. То есть, правильно набрав имя и пароль, я окажусь в директории "/root". PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - эта переменная задает последовательность файлов, которые просматривает "shell" в поисках команды. Имена файлов разделяются здесь двоеточиями. Последовательность просмотра соответствует очередности следования имен в тропе. Но первоначально поиск происходит среди так называемых встроенных команд. В число встроенных команд входят наиболее часто используемые команды, например "echo", "cd", "pwd", "date". После этого система просматривает директорий "/bin", в котором могут находиться команды "sh", "cp", "mv", "ls" и т.п. Затем директорий "/usr/bin" с командами "cat", "сс", "expr", "nroff", "man" и многими другими. Далее поиск происходит в текущем директории (".", или другое обозначение "пусто", т.е.""), где скорее всего находятся написанные вами команды. После набора командной строки и нажатия "shell" (после выполнения необходимых подстановок) распознает имя, соответствующее команде и осуществляет ее поиск в директориях, перечисленных в PATH. Если команда размещена вне этих директориев, она не будет найдена. Если присутствует несколько команд с одинаковым именем, то вызвана будет та, которая расположена в директории, просматриваемом первым. PATH, как и прочие переменные, можно легко менять, добавляя, переставляя или исключая директории. IFS= (Внутренний Разделитель Полей) перечисляет символы, которые служат для разделения слов (полей). Таковыми являются "пробел", "табуляция" и "перевод строки", поэтому здесь слева от присваивания ничего не видно и занято две строки. LOGNAME=root - имя входа ("имя" пользователя). MAIL=/var/spool/mail/root - имя файла, в который поступает (электронная) почта. PWD=/root - имя текущего директория PS1=${PWD}:" " - вид промтера. В данном случае в промптере будет выдаваться имя текущего директория двоеточие и пробел. То есть здесь будет "/root: ". PS2=> - этот промтер (здесь ">") используется как приглашение к продолжению ввода (в очередной строке) незаконченной команды. Например, наберите открывающую скобку "(" и после нажатия в следующей строке вы увидите этот промптер. Если пока не знаете, что дальше делать, наберите закрывающую скобку ")" и он исчезнет. SHELL=/bin/sh - эта переменная указывает оболочку, которую использует пользователь. В данном случае используется стандартный shell ("sh"). Исходная среда устанавливается автоматически при входе в систему с использованием файлов типа "/etc/rc" и "/etc/.profile". Один из способов просто изменит среду (например, тропу поиска команд, вид промтера, вид оболочки, цвет экрана и т.п.) можно, разместив эту информацию в своем домашнем директории в специализированном файле ".profile" (${HOME}/.profile), присвоив нужные значения переменным среды. То есть вызвать это файл в редактор и написать, что пожелаете). Тогда при каждом вашем входе в систему этот файл будет автоматически выполняться и устанавливать новую среду. Этот файл должен ОБЯЗАТЕЛЬНО размещаться в вашем ДОМАШНЕМ директории (директории входа). Следует иметь в виду, что имена файлов, начинающиеся с точки, вообще имеют особый статус. Так, они не выдаются на экран простой командой "ls" - необходимо вызывать эту команду с флагом "-a". Кстати, и не уничтожаются огульно командой "rm *". Сам интерпретатор shell автоматически присваивает значения следующим переменным (параметрам): ? значение, возвращенное последней командой; $ номер процесса; ! номер фонового процесса;

    1. число позиционных параметров, передаваемых в shell;
    • перечень параметров, как одна строка;

    @ перечень параметров, как совокупность слов; - флаги, передаваемые в shell. При обращении к этим переменным (т.е при использовании их в командном файле - shell-программе) следует впереди ставить "$". Важную роль при создании уникальных файлов играет специальная переменная "$$", значение которой соответствует номеру процесса, выполняющего данный расчет. Каждый новый расчет, выполняемый компьютером, инициирует один или несколько процессов, автоматически получающих номера по порядку. Поэтому, используя номер процесса в качестве имени файла, можно быть уверенным, что каждый новый файл будет иметь новое имя (не запишется на место уже существующего). Достоинство является и главным недостатком такого способа именования файлов. Неизвестно, какие имена будут присвоены файлам. И, если в рамках данного процесса можно найти файл "не глядя", т.е., обратившись к нему, используя $$, то потом такие файлы можно легко потерять. Это создает дополнительные проблемы при отладке программ. Вызов интерпритатора Вслед за регистрацией пользователя в системе (с помощью команды login) вызывается интерпретатор языка SHELL. Если регистрационный справочник пользователя содержит файл.profile, то прежде чем с терминала будет принята хотя бы одна команда, интерпретатор выполняет этот файл (подразумевается, что файл.profile содержит команды). При вызове могут указываться следующие ключи: -c строка Команды считываются из заданной строки. -s Команды читаются из стандартного файла ввода. Сообщения интерпретатора записываются в стандартный файл диагностик. -i Интерактивный режим работы. Если первым символом параметра "0" является знак -, то команды считываются из файла.profile.

    ПРОГРАММНЫЕ СТРУКТУРЫ===

    Как во всяком языке программирования в тексте на языке shell могут быть комментарии. Для этого используется символ "#". Все, что находится в строке (в командном файле) левее этого символа, воспринимается интерпретатором как комментарий. Например,

    # Это комментарий.

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

    Команда test ("")

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

    Test условие

    [ условие ]

    мы будем пользоваться вторым вариантом, т.е. вместо того, чтобы писать перед условием слово "test", будем заключать условие в скобки, что более привычно для программистов. На самом деле shell будет распознавать эту команду по открывающей скобке "[", как слову, соответствующему команде "test". Между скобками и содержащимся в них условием обязательно должны быть пробелы. Пробелы должны быть и между значениями и символом сравнения или операции В shell используются условия различных "типов". УСЛОВИЯ ПРОВЕРКИ ФАЙЛОВ: -f file файл "file" является обычным файлом; -d file файл "file" - каталог; -с file файл "file" - специальный файл; -r file имеется разрешение на чтение файла "file"; -w file имеется разрешение на запись в файл "file"; -s file файл "file" не пустой.

    УСЛОВИЯ ПРОВЕРКИ СТРОК: str1 = str2 строки "str1" и "str2" совпадают; str1 != str2 строки "str1" и "str2" не совпадают; -n str1 строка "str1" существует (непустая); -z str1 строка "str1" не существует (пустая). Примеры.

    X="who is who"; export x; [ "who is who" = "$x" ]; echo $? 0 x=abc ; export x ; [ abc = "$x" ] ; echo $? 0 x=abc ; export x ; [ -n "$x" ] ; echo $? 0 x="" ; export x ; [ -n "$x" ] ; echo $? 1

    Кроме того, существуют два стандартных значения условия, которые могут использоваться вместо условия (для этого не нужны скобки). УСЛОВИЯ СРАВНЕНИЯ ЦЕЛЫХ ЧИСЕЛ: x -eq y "x" равно "y", x -ne y "x" неравно "y", x -gt y "x" больше "y", x -ge y "x" больше или равно "y", x -lt y "x" меньше "y", x -le y "x" меньше или равно "y". СЛОЖНЫЕ УСЛОВИЯ: Реализуются с помощью типовых логических операций: ! (not) инвертирует значение кода завершения. -o (or) соответствует логическому "ИЛИ". -a (and) соответствует логическому "И".

    Условный оператор "if"

    В общем случае оператор "if" имеет структуру

    If условие then список

    Здесь "elif" сокращенный вариант от "else if" может быть использован наряду с полным, т.е. допускается вложение произвольного числа операторов "if" (как и других операторов). Разумеется "список" в каждом случае должен быть осмысленный и допустимый в данном контексте. Самая усеченная структура этого оператора

    If условие then список fi

    если выполнено условие (как правило это ком получен код завершения "0", то выполняется "список", иначе он пропускается. Примеры. Пусть написан "if-1"

    If [ $1 -gt $2 ]

    then pwd else echo $0: Hello!

    Тогда вызов if-1 12 11 даст /home/sae/STUDY/SHELL а if-1 12 13 даст if-1: Hello!

    Оператор вызова ("case")

    Оператор выбора "case" имеет структуру:

    Case строка in

    шаблон) список команд;; шаблон) список команд;; ... шаблон) список команд;;

    Здесь "case" "in" и "esac" - служебные слова. "Строка" (это может быть и один символ) сравнивается с "шаблоном". Затем выполняется "список команд" выбранной строки. Непривычно выглядят в конце строк выбора ";;", но написать здесь ";" было бы ошибкой. Для каждой альтернативы может быть выполнено несколько команд. Если эти команды будут записаны в одну строку, то символ ";" будет использоваться как разделитель команд. Обычно последняя строка выбора имеет шаблон "*", что в структуре "case" означает "любое значение". Эта строка выбирается, если не произошло совпадение значения переменной (здесь $z) ни с одним из ранее записанных шаблонов, ограниченных скобкой ")". Значения просматриваются в порядке записи.

    Оператор цикла с перечислением ("for")

    Оператор цикла "for" имеет структуру:

    For имя

    do список команд done где "for" - служебное слово определяющее тип цикла, "do" и "done" - служебные слова, выделяющие тело цикла. Пусть команда "lsort" представлена командным файлом

    For i in file_1 file_2 file_3 do proc_sort $i done

    В этом примере имя "i" играет роль параметра цикла. Это имя можно рассматривать как shell-переменную, которой последовательно присваиваются перечисленные значения (i=file_1, i=file_2, i=file_3), и выполняется в цикле команда "proc_sort". Часто используется форма "for i in *", означающая "для всех файлов текущего каталога". Пусть "proc_sort" в свою очередь представляется командным файлом

    Cat $1 | sort | tee /dev/lp > ${1}_sorted

    т.е. последовательно сортируются указанные файлы, результаты сортировки выводятся на печать ("/dev/lp") и направляются в файлы file_1_sorted file_2_sorted и file_3_sorted

    Оператор цикла с истинным условием ("while")

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

    While условие

    do список команд done где "while" - служебное слово определяющее тип цикла с истинным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется истинность условия (т.е. код завершения последней команды в теле цикла равен "0") или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие должно выполняться. Команда "break [n]" позволяет выходить из цикла. Если "n" отсутствует, то это эквивалентно "break 1". "n" указывает число вложенных циклов, из которых надо выйти, например, "break 3" - выход из трех вложенных циклов. В отличие от команды "break" команда "continue [n]" лишь прекращает выполнение текущего цикла и возвращает на НАЧАЛО цикла. Она также может быть с параметром. Например, "continue 2" означает выход на начало второго (если считать из глубины) вложенного цикла. Команда "exit [n]" позволяет выйти вообще из процедуры с кодом возврата "0" или "n" (если параметр "n" указан). Эта команда может использоваться не только в циклах. Даже в линейной последовательности команд она может быть полезна при отладке, чтобы прекратит выполнение (текущего) расчета в заданной точке.

    Оператор цикла с ложным условием ("until")

    Оператор цикла "until" имеет структуру:

    Until условие

    do список команд done где "until" - служебное слово определяющее тип цикла с ложным условием. Список команд в теле цикла (между "do" и "done") повторяется до тех пор, пока сохраняется ложность условия или цикл не будет прерван изнутри специальными командами ("break", "continue" или "exit"). При первом входе в цикл условие не должно выполняться. Отличие от оператора "while" состоит в том, что условие цикла проверяется на ложность (на ненулевой код завершения последней команды тела цикла) проверяется ПОСЛЕ каждого (в том числе и первого!) выполнения команд тела цикла. Пример.

    Until false do

    read x if [ $x = 5 ] then echo enough ; break else echo some more fi

    Здесь программа с бесконечным циклом ждет ввода слов (повторяя на экране фразу "some more"), пока не будет введено "5". После этого выдается "enough" и команда "break" прекращает выполнение цикла.

    Пустой оператор

    Пустой оператор имеет формат

    :

    Ничего не делает. Возвращает значение "0".".

    Функции в shell

    Функция позволяет подготовить список команд shell для последующего выполнения. Описание функции имеет вид:

    Имя() { список команд }

    после чего обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции - ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" - код возврата.

    Обработка прерываний ("trap")

    Бывает необходимо защитить выполнение программы от прерывания. Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам: 0 выход из интерпретатора, 1 отбой (отключение удаленного абонента), 2 прерывание от , 9 уничтожение (не перехватывается), 15 окончание выполнения. Для защиты от прерываний существует команда "trap", имеющая формат:

    Trap "список команд" сигналы

    Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в "сигналы", то будет выполнен "список команд", после чего (если в списке команд не была выполнена команда "exit") управление вернется в точку прерывания и продолжится выполнение командного файла. Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в "/tmp", то это может быть выполнено командой "trap":

    Trap "rm /tmp/* ; exit 1" 1 2 15

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

    =====================================================

    ЛАБОРАТОРНАЯ РАБОТА № 1 (время выполнения -- 3 часа)

    Тема: ”Введение в shell

    1. Введение в shell

    Shell– это интерпретатор команд (командный процессор), осуществляющий функции интерфейса между пользователем и ядром Unix. Solarisпредлагает три основных командных процессора:

      Принятый по умолчанию командный процессор Bourne-- /sbin/sh

      Командный процессор C -- /bin/csh

      Командный процессор Korn-- ./bin/ksh

    Кроме перечисленных, Solarisпредоставляет еще дополнительные оболочки:

      J-оболочка -- /sbin/jsh

      Restricted Korn l -- /usr/ bin/rsh

      T-оболочка -- /usr/bin/tcsh

      GNU Bourne Again -- /usr/bin/bash

      Z-оболочка – usr/bin/zsh

    Выбор командного процессора является вопросом персональных предпочтений.

    2. Запуск команд

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

    Пример

    $ /bin/ping –t 10 192.168.2.13

    аргумент

    приглашение shell

    Если при запуске программы не указывается путь к исполняемому файлу, то ОС последовательно просматривает каталоги, задаваемые в переменной PATH. Если в просматриваемом каталоге находится программа с таким именем, то она запускается на выполнение. Текущий рабочий каталог при поиске программ не просматривается, только если он не задан в переменной PATH.

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

    Примеры

    Запуск программы с указанием полного пути

    $ / usr / local / bin / my _ program

    Запуск программы из вышестоящего (родительского) каталога

    $ ../ local / bin / my _ program

    Запуск программы из текущего каталога

    $ ./ my _ program

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

    Некоторые символы в shell имеют специальное значение.

    3.1. Шаблоны генерации имен файлов

    ? (вопросительный знак) соответствует любому одному символу, кроме первой точки;

    (квадратные скобки) определяют группу символов (выбирается один символ из группы);

    - (знак “минус”) определяет диапазон допустимых символов;

    ! (восклицательный знак) отвергает следующую за ним группу символов;

    * (символ “звездочка”) соответствует любому количеству символов, кроме первой точки.

    3.2. Символы перенаправления ввода/вывода

    < - перенаправление ввода;

    >, >> - перенаправление вывода;

    2>, 2>> - перенаправление сообщений об ошибках;

    | - конвейер.

    3.3. Симолы подстановки

    $имя_переменно q - подстановка переменных;

    $(команда) или `команда` - подстановка команд;

    ~ - тильда-подстановка.

    4. Поиск

    Для быстрого поиска файлов и каталогов используется команда whereis, для более глубокого – командаfind(поиск файлов, удовлетворяющих заданным требованиям;).

    5. Текстовый редактор vi

    Текстовый редактор viявляется универсальным редактором, присутствующим в любом Unix. Кроме редактирования текстовых файлов, редактор vi может использоваться для редактирования командной строки.

    Редактор vi имеет 3 режима работы (см.рисунок).

    Вход в редактор vi

    Выход из vi

    Знаком ”~” (тильда) в первой позиции помечаются пустые (несуществующие) строки файла.

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

    Перемещение по тексту в командном режиме осуществляется с помощью стрелок и клавиш (влево), (вниз), (вверх), (вправо).

    Некоторые команды vi приведены в таблице.

    Удаление текущей строки

    Копирование текущей строки в буфер

    Yдвижение курсора

    Занесение отмеченных курсором символы в буфер

    Вставка новой строки снизу

    Вставка новой строки сверху

    Добавление после курсора

    Добавление после текущей строки

    Вставка перед курсором

    Вставка перед текущей строкой

    Замена символа на символ, вводимый с клавиатуры

    Вставка текста из буфера

    . (точка)

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

    Отмена последней команды

    Отмена всех изменений в текущей строке

    Удаление символа над курсором

    В режиме ввода все набранные на клавиатуре символы вставляются в текст.

    В режиме последней строки вводимая команда отображается в последней строке экрана.

    6. Помощь

    В Unix имеется электронный справочник, содержащий описание предназначения команд, их синтаксиса, примеры использования и пр. Справочник вызывается командой man:

    7. Основные команды shell

    who – вывод информации об активных пользователях;

    echo – вывод сообщений на терминал;

    banner – вывод сообщений на терминал прописными буквами;

    man – вызов оперативной справочной системы;

    date – вывод текущей даты;

    write – передача сообщений на терминал другого пользователя;

    mesg – разрешение/запрет вывода сообщений от других пользователей;

    mail – отправка/получение почты;

    news – знакомство с новостями системы;

    pwd – вывод абсолютного маршрутного имени текущего рабочего каталога;

    cd – изменение рабочего каталога;

    ls – вывод информации о содержимом каталога;

    mkdir – создание каталога;

    rmdir – удаление каталога;

    touch – обновление временной метки файла;

    cp – копирование файлов;

    cat – объединение и вывод на экран содержимого файлов;

    more – постраничный просмотр содержимого файла.

    mv – перемещение или переименование файла;

    rm – удаление файла;

    alias – создание псевдонима;

    tr – преобразование символов;

    exit – завершение текущегоshell -а;

    tee – перехват результатов конвейера;

    cut – выделение полей из строки;

    grep – поиск по шаблону;

    pr – вывод файла на стандартный вывод в заданном формате;

    sort – сортировка;

    head – вывод первых строк файла;

    tail – вывод последних строк файла;

    wc – подсчет количества символов, слов и строк;

    read , echo - чтение и вывод значений переменных;

    test - оценивание значения выражения;

    expr , let - вычисление арифметических выражений;

    8. Shell -программы

    Shellпозволяет сохранять последовательность команд в файле и затем выполнять ее. Чтобы запускать файл с shell-программой на выполнение, нужно добавить к правам доступа право на исполнение:

    $ chmod +x имя_файла_с_программой

    Ветвление в shell-программах организуется с помощью операторов:

    if-then-else

    Операторы цикла:

    УПРАЖНЕНИЯ

    1. Какие из приведенных ниже команд приведут в выдаче приветственного сообщения на экран? Какие нет? Почему?

    $ echo hello

    $ Echo hello

    $ echo HELLO, WORLD

    $ banner hello

    $ BANNER HELLO , WORLD

    2. Выведите сообщение из нескольких строк с помощью команд echo иbanner.

    3. Выведите дату в две строки: на первой день, месяц, год, на второйтекущее время, снабдив вывод комментарием.

    4. Используя команду write , пошлите сообщение на консоль. Пошлите сообщения на несколько терминалов одновременно.

    5. Используя команду mesg , определите, разрешены ли сообщения на Ваш терминал. Запретите сообщения. Какова будет реакция системы, если кто-нибудь попытается передать Вам сообщение?

    6. Определите имя своего HOME -каталога.

    7. Просмотрите поддерево каталогов, начиная с каталога /export/homeс помощью командcd, ls иpwd.

    8.. Создайте в своем HOME -каталоге подкаталоги вида:

    fruits flowers

    apple pear grapes rose violet dandelion

    dark green

    9. Находясь в своем HOME -каталоге, создайте следующие подкаталоги, используя одну командную строку:

    A/B/C/D

    10. Находясь в своем HOME -каталоге, удалите все подкаталоги каталогаA.

    11. Находясь в HOME -каталоге, создайте файлmacintosh в имеющемся каталогеapple и несколько файлов в каталогахdark иgreen . Войдите в каталогf lowers . Находясь в каталогеf lowers , скопируйте все подкаталогиf ruits вместе с находящимися в них файлами в специально созданный каталогbasket .

    12. Находясь в каталоге f lowers , удалите каталогf ruits .

    13. Прочитайте файл .profile с помощью командcat иmore.

    14. Создайте в HOME -каталоге текстовый файлmyfile из нескольких строк с помощью командыcat. Создайте текстовый файлM y F ile, записав в него такие же строки. Сколько файлов у Вас получилось? Почему?

    15. Просмотрите содержимое созданного в задаче 2.2 файла myfile . Скопируйте файлmyfile в файлmycopy. Просмотрите содержимое обоих файлов.

    16. Переместите файл mycopy в каталогflowers.

    17. Находясь в HOME -каталоге, создайте ссылкуm y link на файлmycopy , находящийся в каталогеflowers . Просмотрите файл-ссылку.

    18. Добавьте строку к файлу my link . Какие из файловmy link , my copy , my file изменились? Почему?

    19. С использованием какой команды можно определить число ссылок? Определите число ссылок для файлов my link , my copy , my file .

    Удалите файл mycopy . Что произошло с файлом-ссылкой? Определите число ссылок для файловmy link , my file .

    20. Создайте псевдоним dir , распечатывающий содержимое текущего каталога в расширенном формате.

    21. Завершите сеанс работы и вновь зарегистрируйтесь. Работает ли псевдоним dir ? Что следует сделать, чтобы псевдоним «не терялся» между сеансами?

    22. Создайте псевдоним point , распечатывающий список находящихся в рабочем каталоге файлов, имена которых начинаются с точки.

    23. Используя команду touch , создайте файлы в новом каталоге с такими именами, чтобы одновременно:

    Шаблону a * соответствовало 5 файлов;

    Шаблону * a соответствовало 4 файла;

    Шаблону ??.? соответствовало 3 файла;

    Шаблону * aa * соответствовало 2 файла;

    Шаблону??? соответствовал 1 файл.

    24. Какую команду следует ввести, чтобы сделать следующее:

    а) вывести имена всех файлов, начинающихся с точки;

    б) вывести имена всех файлов, оканчивающихся на “.txt” ;

    в) вывести имена всех файлов, содержащие слово “my” ;

    25. Замените в одном заданном файле все строчные буквы на прописные, в другом – все прописные на строчные. Исключите из файла все повторяющиеся пробелы.

    26. Создайте файл с именем * . Удалите только этот файл. Будьте осторожны при использовании символов генерации имен фпйлов!

    27. Создайте файл, в имени которого есть символ «пробел». Как удалить такой файл?

    28. С использованием команды cat удвойте содержимое файла, приписав исходное содержимое к концу этого же файла. Перейдите в каталогflowers . Добавьте в файлspisok список содержимого каталогаflowers. Просмотрите содержимое файла

    29. Попытайтесь прочитать с помощью команды cat несуществующий файл. Какова реакция системы? Сделайте то же самое, перенаправив сообщения об ошибках в файлmyerror . Что Вы видите на экране? Просмотрите файлmyerror .

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

    31. Измените построенный конвейер так, чтобы список сохранялся в файле spisok ВашегоHOME -каталога, а на экран выводилось только число файлов в списке.

    32. Выведите на экран содержимое файла /etc/passwd , упорядоченное по полю с именем пользователя.

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

    33. Выведите текущую дату на экран большими буквами с помощью команд date иbanner.

    34. Присвойте переменной IAM Ваше имя регистрации. Запустите еще одинshell . Видите ли Вы эту переменную? Что нужно сделать, чтобы увидеть ее в порожденномshell ? Измените значение переменнойIAM в порожденномshell . Выйдите из порожденногоshell . Посмотрите значение этой переменной в исходномshell . Объясните результат.

    35. Напишите shell -программуinfo , которая будет просить пользователя ввести имя, адрес, число, месяц и год рождения и выводить эту информацию в обратном вводу порядке

    36. Напишите shell -программу, которая будет выводить на экран приглашение на ввод числа, сохранять введенное число в переменнойY , и печатать сообщение“Y is greater than 7”, если значениеY больше 7, и“Y is not greater than 7” в противном случае.

    37. Напишите shell-программу, которая выводит на экран следующую статистику:

    а) свое имя;

    б) количество аргументов, с которыми она запущена;

    в) печатает каждый свой аргумент и длину аргумента в символах;

    38. Напишите shell -программу, которая определяет количество аргументов в командной строке и выдает сообщение об ошибке, если количество аргументов не равно трем, или сами аргументы, если их количество равно трем.

    39. Напишите shell -программу, которая будет выдавать приглашение на ввод идентификатора пользователя, проверять идентификатор на соответствие используемым в системе и выводить полное имяHOME -каталога или, в случае недопустимого идентификатора, выдавать сообщение об ошибке.

    40. Напишите shell-программу hello , обеспечивающую следующую реакцию на аргументы командной строки:

    Аргумент “-d” - программа будет выполнять командуdate ;

    Аргумент “-l” - программа выведет содержимое текущего каталога;

      при отсутствии аргументов или неправильных аргументах в командной строке программа будет выводить справку о своих опциях.

    41. Напишите программу words , которая будет выдавать пользователю приглашение на ввод по одному слову до тех пор, пока он не введет словоend . Запомните все введенные слова. После ввода словаend выведите на экран все введенные слова.

    42. Измените приглашение системы так, чтобы оно содержало полное маршрутное имя текущего рабочего каталога.

    43. Напишите программу virus , которая создают свою выполняемую копию с другим именем, а затем сама себя удаляет.

    44. Напишите программу virus 2 , которая ищет в текущем каталоге программы командного языка и добавляет в их текст команду вывода на экран словаInfected !”.

    45. Напишите программу virus 3 , которая добавляет к найденным ею программам командного языка свой код для заражения других программ.

    46. Напишите программу virus 4 , модифицировав ваш вирус так, чтобы при заражении заражающий код удалялся из заражающей программы.

    47. Напишите программу antivirus , которая бы находила все зараженные вашим вирусомshell-программы.

    48. Модифицируйте разработанную программу так, чтобы она не только находила зараженные программы в указанном ей каталоге, но и “вылечивала” бы их, сохраняя зараженную версию в новом файле, к имени которого добавлено окончание . vir , и снимая с такого файла атрибут выполнения.

    49. Напишите программу virus 5 , которая бы:

    а) заражала бы вирусом shell-программы в текущем каталоге и его подкаталогах, только если пользователь вводил командуls ;

    б) вела бы себя как команда ls , ничем не выдавая на терминале своей работы.

    50. Напишите программу virus6 на основе программvirus 2 -virus 5 , заражающий код которой нельзя было бы обнаружить разработанной Вами программойantivirus , а заражение происходило бы при любом значении переменнойPATH .

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

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

    Аннотация: Понятие командной оболочки. Обзор командных оболочек. Командная оболочка bash . Особенности работы (история команд, оператор "!" , действия по нажатию клавиши ). Многозадачность в консоли. Задания. Управление заданиями. Переменные среды Midnight commander

    Ход занятия

    1. В мире Linux и Unix работа на компьютере неразрывно связана с понятием командная оболочка (shell) – программа , позволяющая пользователю взаимодействовать с системой посредством ввода и выполнения команд. Тем не менее, командная оболочка является обычной программой. Доказать это можно, установив в качестве оболочки по умолчанию в файле passwd для пользователя другую программу. Но для того, чтобы система знала ее как оболочку, необходимо добавить абсолютное имя файла в /etc/shells .

    В составе Linux идет несколько командных оболочек, их состав может меняться в зависимости от дистрибутива, но всегда вы сможете обнаружить:

    Bourne Shell (sh) – самая старая и самая распространенная командная оболочка для Unix-систем. Нет ни одной системы Unix, где она бы не применялась.

    Bourne Again Shell (bash) – расширенная Bourne Shell . Обладает массой приятных преимуществ, поэтому стала так популярна в последнее время. Является оболочкой " по умолчанию" практически для всех дистрибутивов Linux.

    Также популярными оболочками являются:

    csh – оболочка , система команд которой близка к языку программирования C

    tcsh – оболочка , система команд которой близка к языку программирования Tcl .

    zsh – оболочка , обладающая, наверное, самыми широкими возможностями. Является расширением sh (bourne shell) .

    Поскольку в Linux " по умолчанию" используется bash , то о ней мы и поговорим.

    2. Командная оболочка bash изначально являлась свободно-распространяемым аналогом Bourne Shell . В последствии, когда ее возможности выросли, тогда ее стали считать самостоятельным продуктом. Основными возможностями bash можно назвать следующие:

    Таблица 1.1.
    Возможность Комментарий
    1 Редактирование строки Возможность отредактировать введенную команду вместо того чтобы переписывать ее заново
    2 Организация каналов Возможность перенаправления ввода-вывода , организации каналов между выполняемыми задачами
    3 Удобство в работе Использование псевдонимов команд, истории команд, автодополнения
    4 Управление заданиями Возможность создания фоновых заданий и управления ими
    5 Гибкость настройки Использование файлов-сценариев для входа для каждого пользователя отдельно, переменные среды

    С перенаправлением ввода-вывода и каналами мы познакомимся позднее, на 8-м занятии. Поэтому этот пункт мы опустим. А вот об особенностях работы в bash , о предоставляемых им преимуществах поговорим подробнее.

    Bash автоматически записывает все команды, набранные пользователем в файл ~/.bash_history . Для управления этим файлом служит команда history. history - это встроенная команда bash . То есть, исполняемого файла, соответствующего этой команде не существует. Сама командная оболочка выполняет все действия. Введенная без параметров, она просто выводит список всех команд, сохраненных в этом файле и идентична команде cat ~/.bash_history .

    История команд существует для упрощения набора часто используемых команд. Историю команд можно перебирать по списку клавишами <вверх> и <вниз> .

    Другой способ – набрать в командной строке ! и начало команды и нажать . Последняя команда из истории, первые буквы которой совпадают с набранными, будет выполнена. Например:

    $ !/usr /usr/bin/perl ./ptest.pl OK $ !xfonts bash: !xfonts: event not found $

    Но как ускорить ввод, если в истории еще нет необходимой нам команды? В этом случае нам поможет клавиша . Набрав несколько первых букв команды (или пути к файлу), нажмите и Bash автоматически дополнит вашу команду (или элемент пути). В случае, когда подходит несколько файлов или ни один файл не подходит, система выдаст звуковой сигнал. Если кнопку нажать повторно, то когда подходит несколько файлов – система выведет список , а когда ни одного – повторит звуковой сигнал

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

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

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

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

    команда & – символ & после команды позволяет запустить ее в фоновом режиме.

    jobs – выводит список текущих заданий командного интерпретатора.

    bg <#j> – переводит задание #j в фоновый режим . Перед этим задание должно быть остановлено комбинацией клавиш . Если на данный момент у интерпретатора есть только одно задание, то номер можно не указывать.

    fg <#j> – переводит задание #j в режим выполнения на переднем плане. Задание должно быть остановлено комбинацией клавиш или находиться в фоновом режиме. Если на данный момент у интерпретатора есть только одно задание, то номер можно не указывать.

    $ man bash ^Z + Stopped man bash $ vim ^Z vim + Stopped vim $ bg 1 + man bash & $ jobs + Stopped man bash + Stopped vim $ fg 2 + vim $ fg + man bash $

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

    Часто используемые пользователем переменные это:

    PATH – переменная содержит пути, в которых системе следует искать исполняемые файлы, если в командной строке не набирается полный или относительный путь к ним.

    PWD – переменная содержит полное имя текущей директории.

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

    HOSTNAME – переменная содержит имя компьютера.

    LOGNAME – содержит имя пользователя

    SHELL – содержит имя командной оболочки, запущенной в текущем сеансе.

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

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

    Командный интерпретатор bash имеет и свои переменные. Чтобы локальные переменные стали системными их необходимо экспортировать с помощью все той же команды export .Например:

    $ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $ EDITOR=/bin/vim $ export EDITOR $ export declare -x EDITOR="/bin/vim" declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $

    Команда unset удаляет системную переменную. Например:

    $ unset EDITOR $ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $

    5. На сегодняшнем занятии мы познакомимся с вами с еще одной, немного нестандартной, командной оболочкой Midnight commander . Это не командная оболочка в обычном понимании. Это текстовый файловый менеджер – аналог Norton Commander или Far . Midnight commander запускается командой mc . Мы поговорим о его возможностях.

    Экран Midnight commander"а разделен на две части. Практически все пространство экрана занимают две панели со списком каталогов и файлов. По умолчанию, вторая снизу экрана линия представляет собой командную строку, в которой Вы можете выполнять обычные команды оболочки, а на самой нижней линии изображены подсказки для функциональных клавиш (F1-F10 ). Верхняя линия символов содержит меню , с помощью которого возможно выполнение множества функций. Для использования меню Вы можете кликнуть мышью в необходимый пункт или нажать клавишу F9 и с помощью клавиш управления курсором выбрать нужный пункт .

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

    Теперь поговорим об основных сочетаниях клавиш, которые помогут Вам работать с Midnight commander"ом .

    для смены активной панели применяются клавиши или +

    для того, чтобы отметить файл , нажмите или +

    нажмите для получения справки

    вызовет просмотрщик файлов

    с помощью вы отредактируете файл

    позволит Вам скопировать файл .

    перенести или переименовать файл

    создать каталог

    Клавиша позволит удалить файл и/или каталог

    , как уже говорилось, открывает доступ к меню .

    – позволит выйти из Midnight commander .

    переведет указатель в начало списка файлов,

    - напротив – в конец списка.

    и изменят положение показателя на страницу вверх и вниз соответственно.

    Клавиша <*> на дополнительной клавиатуре позволит инвертировать выделение файлов (она не действует на каталоги)

    Клавиша <+> на дополнительной клавиатуре позволит отметить файлы по маске, а <-> снять отметку с файлов по маске.

    + - обновить содержание директории (перечитав с диска или из сети)

    + - поменять местами правую и левую панели.

    + - убрать/вернуть панели.

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

    Меню состоит из пунктов: "Левая панель", "Файл", "Команда", "Настройки", "Правая панель" .

    "Левая/правая панель" - эти пункты меню совершенно одинаковые. Различия между ними заключаются только в том, что выполняемые действия будут адресованы в левую или правую панель.

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

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

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

    "Дерево" - переводит Midnight commander в режим, похожий на режим работы Проводника из OC Windows . В панели, к которой применена команда "Дерево" , строится дерево каталогов, по которому можно перемещаться с помощью стрелок управления курсором , клавиш PageUp, PageDown, Home, End . В соседней панели высвечивается содержимое каталога, подсвеченного в дереве.

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

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

    "FTP-соединение" - с помощью этой команды Вы можете установить соединение с удаленным (или даже локальным) компьютером по протоколу ftp . Если введен только адрес удаленного сервера, то Midnight commander попытается установить анонимное соединение. Полная же строка, с помощью которой задается узел такова:

    ftp:имя_пользователя:пароль@адрес_сервера:порт/каталог_на_сервере

    После установки соединения, работа с удаленной файловой системой происходит аналогично работе с локальной ФС.

    "Shell-соединение" - позволяет открыть сетевое соединение по протоколу FISH (FIle transfer over SHell – передача файлов посредством оболочки). FISH использует протоколы RSH (Remote SHell – удаленная оболочка ) или SSH (Secure SHell – защищенная оболочка , аналог RSH , но с поддержкой шифрования передаваемых данных). Полная строка, с помощью которой пользователь может задать удаленный узел такова:

    sh:имя_пользователя@адрес_сервера:опции/каталог_на_сервере

    Параметр имя_пользователя , опции и каталог_на_сервере не обязательны. Если имя пользователя не указано, то Midnight commander будет пытаться зарегистрироваться на удаленной системе с именем пользователя, используемым на локальном компьютере.

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

    "Файл" - раздел меню , пункты которого обеспечивают основные функции обработки файлов и каталогов, такие как:

    "Меню пользователя" - позволяет вызвать меню , которое устанавливает сам пользователь . Также вызывается клавишей .

    "Просмотр файла" - аналог функции, выполняемой по нажатию . Позволяет просмотреть подсвеченный файл (или зайти в каталог). Поддерживает множество форматов, таких как текстовые форматы, архива, Winword DOC, исполняемые файлы Linux и т.д.

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

    "Просмотр команды" - позволяет выполнить команду и просмотреть ее стандартный вывод в режиме просмотра файла.

    "Редактирование" - открывает файл для правки. Простой встроенный текстовый редактор имеет достаточный набор встроенных функций для редактирования файлов конфигурации, исходных текстов программ и т.д., а встроенная автоматическая подсветка синтаксиса делает редактирование более удобным, а редактируемые тексты более удобочитаемыми.

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

    "Права доступа" - позволяет изменить права доступа к файлу (или группе файлов) в диалоговом окне.

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

    "Владелец/группа" - изменяет владельца и/или группу, к которой принадлежит файл /каталог.

    "Права (расширенные)" - позволяет изменять одновременно права доступа к файлу и его владельца и/или группу. Права доступа представлены в виде трех последовательностей rwx для владельца, группы и всех пользователей.

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

    "Создание каталога" - создает каталог. Аналог функции, вызываемой по . По умолчанию, каталог создается в каталоге, открытом в активной панели. Это можно изменить, если в открывшемся диалоге указать полный путь к создаваемому каталогу.

    "Удаление" - удаляет файл /группу файлов/каталог. Аналог функции, вызываемой по .

    "Смена каталога" - меняет текущий каталог . Аналогична команде cd командного интерпретатора Bash . Необходимый каталог вводится в диалоговом окне.

    "Отметить группу" - Отмечает группу файлов по маске в каталоге, открытом в активной панели. Аналог функции, вызываемой с помощью <+> на дополнительной клавиатуре.

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

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

    Командная оболочка (shell ) обеспечивает взаимотействие между пользователем и средой операционной системы Linux. Она является специализированным программным продуктом, который обеспечивает выполнение команд и получения результатов их выполнения, или, если совсем уж упрощенно, оболочка - это программа, которая предназначена для обеспечения выполнения других программ по желанию пользователя. Примером оболочки может быть, например, интерпретатор команд command.com операционной системы MS DOS, или оболочка bash операционных систем Unix / Linux.

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

    Интерпретация командной строки.

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

    Поддержка переменных, специальных символов и зарезервированных слов.

    Обработка файлов, операций стандартного ввода и вывода.

    Реализация специального языка программирования оболочки.

        Для операционных систем семейства Unix / Linux возможно использование нескольких различных оболочек, отличающихся свойствами и методами взаимодействия с системой. Наиболее распространенными оболочками являются

    sh - оболочка Bourne , классическая оболочка для ОС Unix

    bash оболочка Bourne Again (GNU Bourne-Again SHell). Пожалуй, наиболее распространенная на данный момент, оболочка в среде ОС семейства Linux.

    ksh - оболочка Korn , разработанная в качестве развития оболочки Bourne с историей командной строки и возможностью редактирования команд.

    csh - оболочка C , использующая синтаксис популярного языка программирования C

    tcsh - версия оболочки C с интерактивным редактированием командной строки.

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

        В процессе загрузки операционных систем семейства Linux, после загрузки ядра системы выполняется переход в интерактивный режим – режим взаимодействия пользователя и операционной системы. В ОС Linux, первым запускаемым в ходе загрузки процессом, является программа инициализации init , которая считывает содержимое конфигурационного файла /etc/inittab , определяет перечень и характеристики терминалов, имеющихся в системе, и вызывает программу интерактивного входа getty , отображающую приглашение для ввода имени пользователя. После ввода имени пользователя и пароля, программа getty вызывает программу login , которая проверяет достоверность учетной записи, выполняет переход в домашний каталог пользователя и передает управление программе начального запуска сеанса, в качестве которой обычно используется программа оболочки пользователя, конкретная разновидность которой определяется содержимым файла /etc/passwd для данной учетной записи. Например:

    user1:x:508:511::/home/user1:/bin/sh
    interbase:x:510:511::/home/interbase:/bin/csh
    apb:x:511:513:apb:/home/apb:/bin/bash

    Как видно из содержимого файла /etc/passwd , для пользователя user1 будет запущена оболочка sh (оболочка Bourne), для пользователя interbase - оболочка csh (оболочка C) и для пользователя apb - оболочка bash (Bourne Again). После старта оболочки, на экран выводится приглашение к вводу команд (обычно в виде знака доллара $ , если работа выполняется в контексте учетной записи обычного пользователя, или фунта # , если оболочка используется под учетной записью привилегированного пользователя (root ).

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

    Посредством команды exit выполненной пользователем

    При получении процессом оболочки сигнала kill , отправленного ядром, например при перезагрузке системы.

    Интерпретация командной строки.

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

    ls -l file01 file02

    Содержит команду ls , опцию -l и два имени файлов file01 file02 .

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

    Ls -l -d
    ls -ld

    Команды, являющиеся частью оболочки, называются встроенными . К таким командам относятся, например, cd, if, case и т. п. Естественно, встроенные команды могут отличаться для различных вариантов оболочек. Кроме встроенных команд, возможно использование программных модулей, представляющих собой отдельные исполняемые файлы, или файлов скриптов или сценариев - обычных текстовых файлов, содержащих последовательно выполняемые строки с командами оболочки. Некоторые скрипты (сценарии) могут выполняться процессами Linux, как например, планировщиком задач cron . Планировщик задач, как правило, предназначен для автоматического выполнения задач администрирования системы по расписанию. Задачи cron представляют собой команды или скрипты и выполняются автоматически, без какого либо вмешательства человека и могут выполняться в контексте разных учетных записей пользователей. В случае, когда задача планировщика предполагает выполнение какого-либо скрипта, возникает проблема выбора оболочки, которая должна быть запущена в качестве дочернего процесса cron для обработки команд из файла скрипта - ведь оболочка может быть любой, а синтаксис скрипта, как правило, предполагает использование конкретной оболочки, под которую он написан. Для устранения данной проблемы, в ОС семейства Linux принято в первой строке скрипта указывать разновидность оболочки, необходимой для его выполнения, в виде:

    #!/bin/bash - для оболочки bash

    #!/bin/sh - для оболочки sh

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

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

    /etc/profile - устанавливает переменные только для командных оболочек. Может запускать любые скрипты в оболочках, совместимых с Bourne shell.

    /etc/bash.bashrc - устанавливает переменные только для интерактивных оболочек. Он также запускает bash-скрипты.

    /etc/environment - используется модулем PAM-env. В этом файле можно указывать только пары имя=значение .

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

    # Если идентификатор ID пользователя более или равно 1000, и существует каталог ~/bin, и он

    #не был ранее добавлен в переменную PATH,

    # выполнить экспорт ~/bin в переменную $PATH.

    If [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin)

    Export PATH=$HOME/bin:${PATH}

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

    Если же нужно изменить среду окружения для конкретного пользователя, используется модификация содержимого среды окружения пользователя:

    - ~/.bash_profile , ~/.bash_login и т.п. - файлы инициализации командной оболочки из домашнего каталога пользователя.

    - ~/.profile - файл инициализации профиля пользователя. Используется многими оболочками для определения переменных среды.

    ~/.pam_environment - пользовательский аналог файла /etc/environment, который используется модулем PAM-env.

    Например, чтобы добавить каталог пользователя ~/bin в пути поиска исполняемых файлов, заданных переменной PATH , можно например, в файл ~/.profile поместить строку:

    export PATH="${PATH}:/home/пользователь/bin"

    Чтобы установить переменные окружения для графических приложений, используется содержимое файлов настройки графической среды пользователей ~/.xinitrc

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

    export PATH=~/bin:$PATH

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

    Для просмотра значения переменной можно использовать команду echo $переменная , например:

    echo $PATH

    В настоящее время, самой распространенной оболочкой, как уже упоминалось выше, является bash . Вызвано это, в первую очередь тем, что оболочка bash является sh - совместимой командной оболочкой, в которую добавлены полезные возможности из оболочек Korn shell (ksh ) и C shell (csh ). Оболочка bash может без какой-либо модификации выполнять большинство скриптов, написанных под язык программирования оболочки sh и в максимальной степени пытается приблизиться к стандарту POSIX , что привело к появлению множества улучшений, причем как для программирования, так и использования в интерактивном режиме. В современной реализации bash имеется режим редактирования командной строки, неограниченный размер истории команд, средства управление заданиями, возможность использования псевдонимов, обширный перечень встроенных команд, функции командной оболочки и т.п. В целом, bash в наибольшей степени соответствует потребностям среднестатистического пользователя, что и сделало ее наиболее используемой в среде Linux.

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

    Основная среда взаимодействия с UNIX – командная строка . Суть её в том, что каждая строка, передаваемая пользователем системе, – это команда, которую та должна выполнить. Пока не нажата клавишаEnter , строку можно редактировать, затем она отсылается системе.

    Команды интерпретируются и выполняются специальной программой – командной оболочкой (или «shell», по-английски). Через командную оболочку производится управление пользовательскими процессами – для этого используются средства межпроцессного обмена.

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

    Рисунок 3.1. Интерфейс командной строки

    Одновременный доступ к системе

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

    Характерный для современных версий UNIX способ организации параллельной работы пользователей – виртуальные консоли . Виртуальные консоли (virtual console) – это несколько параллельно выполняемых операционной системой программ, предоставляющих пользователю возможность зарегистрироваться в системе в текстовом режиме и получить доступ к командной строке (см. Рисунок 3.2, «Виртуальные и графические консоли»).

    В операционной системе Linux переключение между виртуальными консолями в текстовом режиме производится с помощью комбинации клавиш Alt -F1 ,Alt -F2 и т.п. При этом каждая виртуальная консоль обозначается специальным именем: «tty1», «tty2» и т.д. С каждым сочетанием связана соответствующая по номеру виртуальная консоль. Каждая из таких консолей связано с собственнымтерминалом , который характеризуется файлом устройства с соответствующим именем (например,/dev/tty1).

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

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

    Рисунок 3.2. Виртуальные и графические консоли

    Каждое устройство терминала имеет свои возможности по вводу и выводу информации. Примерами таких возможностей являются: число цветов отображения, способность перемещать курсор и изменять размер экрана, набор управляющих символов и т.п.. Терминалы разделяют потипам : набору возможностей, регламентированных в специальном конфигурационном файле. Примерами типов являются: tty (телетайп) или xterm (графический терминал). Тип терминала явно указан в имени устройства терминала (например,/dev/tty1). Все настройки типов терминалов находятся в директории/etc/termcap.