Мы — долго запрягаем, быстро ездим, и сильно тормозим.

RFC
Программирование
  shell
  sed
  awk
FreeBSD
man
EXIM


www.lissyara.su —> документация —> Программирование —> shell

Программирование на языке командного интерпретатора - shell


ИНТЕРПРЕТАТОР КОМАНД SHELL

Введение

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

  • объединяться для образования новых команд;
  • передавать позиционные параметры;
  • добавляться или переименоваться пользователем;
  • выполняться внутри циклов или по определенному условию;
  • создаваться  для локального выполнения без риска вступления в конфликт с командами других пользователей;
  • выполняться в фоновом режиме.

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


    Основные положения

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

    Как создаются командные оболочки

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

    Команды

       Наиболее простой  способ использования Shell - это ввод простых команд с клавиатуры.  Простая команда - это любая  последовательность аргументов,   разделенных пробелами или знаками табуляции. Первый  аргумент (с порядковым номером  0)   определяет  имя команды, которая  должна быть выполнена. Все остальные аргументы, за некоторыми исключениями,  передаются этой команде.   Например, чтобы вызвать  печать на принтер файлов с именами allan,  barry и calvin можно дать следующую команду:
    lpr allan barry calvin
    

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

    Как Shell находит команды

       Обычно интерпретатор  Shell  ищет команды,  которые требуется выполнить в трех конкретных  местах  файловой  системы.   Сначала Shell пытается использовать имя команды в том виде,  как оно указано. Если  команда не найдена, то к имени добавляется /bin. Если это не помогает, по добавляется /usr/bin. Это означает, что поиск по порядку производится сначала в текущем каталоге, затем в каталоге /bin и после этого в каталоге /usr/bin. Например, команды pr и man могут быть на самом деле файлами с полными именами  /bin/pr и /usr/bin/man.    Можно указывать и более сложные пути для того, чтобы или поместить файл в конкретное место относительно текущего каталога пользователя,  или чтобы обращаться к команде по ее полному имени. Если в команде имеется косая черта (/) (например /bin/sort dir/cmd),   то к имени никаких путей для поиска добавляться не будет.
       Поскольку текущий   каталог  обычно  просматривается  первым, пользователь может хранить в нем свою личную модификацию программы, которая    не  будет влиять на выполнение программ с таким же именем другими   пользователями.   Конкретная  последовательность просмотра каталога  может быть изменена переопределением переменной PATH. (Переменные Shell будут рассматриваться позднее.)

    Генерация списка аргументов

       Аргументами в командах очень  часто  являются  имена  файлов. Иногда эти файлы имеют похожие,  но неодинаковые имена. Чтобы использовать схожесть имен,  Shell позволяет пользователю применять шаблоны, которые    соответствуют именам файлов в каталоге.  Если шаблон соответствует одному или нескольким именам файлов в  каталоге, то  эти файлы автоматически будут рассматриваться интерпретатором Shell как аргументы для команды.
       Большинство символов  в  таких шаблонах обозначают сами себя, но в UNIX существуют также и специальные символы,  которые  можно включать в шаблоны. Ими являются:

  • звездочка (*), обозначающая любую последовательность символов, включая и последовательность нулевой длины;
  • знак вопроса (?), который соответствует любому символу;
  • квадратные скобки ([ ]),  означающие любой из заключенных в них символов.
       Внутри квадратных скобок пара символов, разделенных дефисом, соответствует любому символу из определяемого ими диапазона. Например, [a-de] эквивалентно [abcde].
       Примеры использования метасимволов:
    Метасимвол
    Значение
    * Соответствует любому имени в текущем каталоге
    *temp* Соответствует всем именам; содержащим 'temp'
    [a-f]* Соответствует всем именам начинающимся на a;b;c;d;e;f
    *.c Соответствует всем именам с расширением `c`
    /usr/bin/? Все имена файлов в каталоге /usr/bin; из одного символа

       Использование шаблонов  позволяет  избежать  лишнего  ввода с клавиатуры, и, что более существенно, дает возможность объединять связанные между  собой  информационные файлы в группы,  используя общие символы в именах или расширениях.
       Вместе с  тем на использование шаблонов накладываются некоторые ограничения. Если имя файла начинается с точки (.), оно может заменяться только аргументом, тоже начинающимся с точки.
       Следует заметить, что имена каталогов не должны включать в себя следующие символы:
      * ? [ ]

    Использование кавычек

       Имеется несколько символов, которые имеют в Shell специальное значение. Это  <, >, *, ?, [ и ]. Чтобы отменить специальное значение этих символов, требуется заключать их особым образом в одинарные (')  или двойные (") кавычки.  То же действие в отношении одиночного символа  выполняет обратная наклонная черта (\).  (Обратные одинарные кавычки (`)  используются только  для  командной подстановки в Shell и не отменяют специальных значений символов.)
       Все символы, заключенные в одинарные кавычки, воспринимаются как обычные текстовые символы. Например, строка:
    echostuff='echo $? $*; ls *| wc'
    

    только присваивает переменной echostuff значение
    echo $? $*; ls *| wc
    

    но не вызывает выполнение ни одной из команд.
       Внутри двойных кавычек специальное значение сохраняется только у некоторых символов - это $, \, ` и ". В результате внутри двойных кавычек имеет место подстановка значений переменных и команд. Однако, сами по себе двойные кавычки никак не влияют на подставляемые команды, и поэтому такие символы, как *, сохраняют свое специальное значение.
       Чтобы отменить специальное значение символа $ и одинарных и двойных кавычек внутри двойных кавычек, перед ними требуется до полнительно указывать символ \. Вне двойных кавычек указание символа \ перед специальным символом адекватно заключению этого специального символа в одинарные кавычки. Символ \, стоящий перед символом новой строки, обозначает игнорирование этого символа. Благодаря этому можно продлевать командную строку.
       Ниже приводятся несколько примеров использования кавычек:
    Ввод
    Интерпретация
    '`' обратная кавычка
    '"' двойная  кавычка
    '`echo one`' одно слово '`echo one`
    '\"' двойная кавычка
    '`echo one`' слово one
    '`' cинтаксическая ошибка
    one two два слова one и two
    'one two' одно слово 'one two'
    'one two' одно слово 'one two'
    'one * two' одно слово 'one * two'
    'one * two' одно слово 'one * two'
    `echo one` одно слово 'one'

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

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

  • файл "стандартного" ввода
  • файл "стандартного" вывода
  • файл "диагностического" вывода (файл ошибок)
       Каждому из этих файлов соответствует число, называемое дескриптором файла. Принято, что дескриптор 0 соответствует стандартному вводу, 1 - стандартному выводу и  дескриптор 2 - диагностическому выводу. Процессы-потомки, как правило, берут эти файлы из "родительского" процесса. Первоначально все три файла подключены к терминалу (0 - к клавиатуре, 1 и 2 - к экрану). Интерпретатор команд Shell позволяет перенаправлять файлы до того, как управление будет передано вызванной команде.
       Аргументы для интерпретатора, записанные в форме <file или >file, открывают файлы с указанными именами в качестве устройств стандартного ввода или вывода (в случае вывода старое содержимое файла с указанным именем, если он существовал ранее, будет уничтожено). Аргумент, записанный в виде >>file, направляет стандартный вывод в конец файла, тем самым давая возможность добавлять данные к уже существующему файлу, не разрушая его содержимого. В последних двух случаях Shell создает файл с указанным именем, если он не существовал до этого. Таким образом, команда:
    > output
    

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

       В аргументах команд, перенаправляющих ввод-вывод, не производится интерпретация пробелов и поиск файлов по шаблонам. Это означает, что команда:
    echo 'this is a test' > *.gal
    

    создает файл с именем *.gal, содержащий одну строку. В случае, если вы, например, дадите команду:
    cat < ?
    

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

    Диагностика и другие виды вывода

       Диагностический вывод от команд UNIX обычно направляется в файл, имеющий дескриптор 2. (Часто возникает необходимость иметь файл, куда выводятся сообщения об ошибках, который отличается от стандартного вывода, для того, чтобы сообщения об ошибках не оказались потерянными). Вы можете перенаправить вывод ошибок в файл, указав номер дескриптора файла (2 в нашем случае) непосредственно перед любым из символов переадресации (> или >>). Приводимая ниже команда добавляет сообщения об ошибках от команды cc в файл с именем ERRORS:
    cc testfile.c 2>> ERRORS
    

       Обратите внимание на то, что между дескриптором файла и стрелками не должно быть никаких пробелов или символов табуляции - в противном случае число будет передано  в  качестве аргумента команды.
       Этот метод может быть обобщен для осуществления переадресации вывода, связанного с любыми из первых десяти дескрипторов файлов (с номерами от 0 до 9). Например, если вывод команды cmd идет на дескриптор 9, то следующая командная строка перенаправляет этот вывод в файл savedata:
    cmd 9> savedata
    

       Команды как правило генерируют стандартный вывод и вывод ошибок, но могут быть также другие типы вывода, например, файл данных. В этом случае можно независимо друг от друга перенаправить все различные разновидности вывода. Предположим, например, что cmd направляет свой стандартный вывод в файл с дескриптором 1, сообщения об ошибках - в файл с дескриптором 2 и создает файл данных с дескриптором 9. Приводимая ниже команда направляет каждый из этих выводов в различные файлы:
    cmd >standard 2> error 9> data
    

    Командные строки и конвейеры

       Последовательность команд, разделенных вертикальными чертами (|), образует конвейер. В конвейере, состоящем более чем из одной команды, каждая команда выполняется как отдельный процесс, связанный с соседними с помощью программных каналов - т.е. вывод каждой команды (за исключением последней) становится вводом для следующей команды в строке.
       Фильтр - это команда, которая считывает стандартный ввод, преобразует его некоторым образом и затем записывает в  стандартный вывод. Конвейер, как правило, состоит из последовательности фильтров. Несмотря на то, что процессы в конвейере могут выполняться параллельно, каждой программе необходимо прочитать вывод предыдущей. Многие команды работают с отдельными строками текста - считывают их, обрабатывают, записывают и возвращаются назад для считывания новых строк. Некоторые команды должны наоборот сначала считать большой объем данных и потом только начинают выводить результаты - sort является примером такой команды, которой требуется вначале считать все входные данные и затем только будет проводиться обработка. Вот пример типичного конвейера:
    nroff -mm text| col| lpr
    

       Здесь nroff - это форматер текста, имеющийся в Системе Обработки Текстов UNIX, col - преобразует вывод для конкретного типа дисплея и lpr осуществляет печать текста. Флаг '-mm' обозначает одну из наиболее часто употребляемых опций форматирования, и text - это имя файла, который должен быть отформатирован.
       Следующие примеры демонстрируют множество возможностей, которые могут быть получены комбинированием команд описанными выше способами. Попробуйте выполнить их:
    who
    

         Печатает на экране список зарегистрированных в системе пользователей.
    who >> log
    

         Добавляет список загруженных пользователей в конец файла log.
    who| wc -l
    

         Печатает количество зарегистрированных пользователей.
    who| pr
    

         Постранично печатает список пользователей.
    who| sort
    

         Печатает список пользователей в алфавитном порядке.
    who| grep bob
    

         Печатает список пользователей, чьи имена содержат слово bob.
    who| grep bob| sort| pr
    

         Печатает постранично в алфавитном порядке список пользователей, чьи имена содержат слово bob.
    { date;who | wc -l; } >> log
    

         Добавляет в файл log текущую дату и количество зарегистрированных в системе пользователей. Обратите внимание на пробелы после левой фигурной скобки и перед правой  фигурной скобкой.
    who| sed -e 's/ .*//'| sort| uniq -d
    

         Печатает имена только тех пользователей, которые регистрировались в системе более одного раза. Обратите внимание на использование sed в качестве фильтра для удаления символов, стоящих после имени пользователей.
       Команда who сама  по себе не имеет возможности получать все эти результаты - их можно получить только объединив who с другими командами. Команда who в этих примерах служит как источник информации. В качестве упражнения замените "who|" на "</etc/passwd" и убедитесь в том, что файл может также быть использован как источник данных. Помните, что аргументы переадресации могут находиться в любом месте в командной строке, даже в самом ее начале. Это значит, что конвейер
    < infile >outfile sort| pr
    

    аналогична
    sort < infile |pr >outfile
    

    Командная подстановка

       Любая командная строка может быть помещена  внутрь обратных кавычек (`....`), в результате чего вывод этой командной строки заменит при выполнении саму эту строку. Это называется командная подстановка. Команда или команды, заключенные в обратные кавычки, обрабатываются Shell в первую очередь и их вывод заменяет сами эти команды и обратные кавычки. Это свойство часто используется для присвоения значений переменным Shell. (Переменные Shell рассматриваются в следующем разделе.)
       Например:
    today=`date`
    

    присваивает строку со значением текущей даты переменной today (например "Tue Nov 26 16:01:09 EST 1985"). Следующая команда сохраняет число зарегистрированных в системе пользователей в переменной users:
    users=`who | wc -l`
    

       Любая команда, которая пишет в стандартный вывод, может быть заключена в обратные кавычки. Обратные кавычки могут быть вложены одни в другие, но при этом внутренние должны отделяться обратными косыми чертами (\), например:
    logmsg=`echo Your login directory is \`pwd\``
    

    покажет строку Your login directory is ...(имя вашего каталога). Переменным Shell также можно присваивать значения, используя команды read и line.  Команда read считывает строку из стандартного ввода (обычно с терминала) и присваивает отдельные слова всем указанным переменным.
       Например, предположим, что команда:
    read first init last
    

    прочитала строку вида:
    G. A. Snyder
    

    Тогда указанным переменным будут присвоены значения:
    first=G. init=A. last=Snyder
    

       Все "лишние" прочитанные слова команда read присваивает последней переменной.
       Команда line считывает строку из стандартного ввода и повторяет в стандартном выводе.

    Переменные Shell

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

    Позиционные параметры

       Когда вызывается  процедура  Shell,   то  Shell  сразу неявно создает позиционные параметры.  Имя самой процедуры Shell в нулевой позиции   в командной строке присваивается позиционному параметру $0.  Первый аргумент команды называется $1 и т.д. Чтобы получить доступ  к аргументам в позициях с номером больше 9,  можно использовать команду shift.  Например,  следующую процедуру можно использовать для просмотра позиционных параметров и затем обрабатывать все необходимые файлы:
     while test -n "$1"
     do case $1 in
     -a) A=aoption ; shift;;
     -b) B=boption ; shift;;
     -c) C=coption ; shift;;
     -*) echo "bad option" ; exit 1 ;;
     *) process rest of files
     esac
     done
    

       Пользователь может явно передать  необходимые  значения  этим позиционным параметрам с помощью команды set. Например, команда:
    set abc def ghi
    

    присваивает значение  "abc"  первому  позиционному  параметру $1, значение "def" - второму $2 и "ghi" - третьему $3.  Нулевой позиционный параметр  $0  нельзя  переопределить  таким способом - он всегда относится к имени процедуры Shell.


       Переменные, определяемые пользователем

       Интерпретатор Shell  также распознает буквенно-цифровые переменные, которым  присвоены текстовые значения.   Простая  команда присвоения имеет синтаксис:
    имя=строка
    

       После присвоения  при указании $имя будет выдаваться значение строки. Имя переменной - это последовательность букв, цифр и знаков подчеркивания,    обязательно  начинающееся с буквы или знака подчеркивания. Пробелы вокруг знака равенства (=) в команде присваивания недопустимы.  Позиционные параметры таким способом определить нельзя; они могут устанавливаться только командой set.
       В команде  присвоения может быть более одного присвоения,  но помните, что Shell присваивает значения переменным справа налево.
    Так, в результате выполнения следующей командной строки:
    A=$B B=abc
    

    переменной А будет присвоено значение "abc".
       Ниже приводятся примеры простых присвоений. Двойные кавычки с правой стороны   команды  присвоения позволяют указывать пробелы, знаки табуляции, символы перехода на новую строку и точки с запятой в  присваиваемом тексте,  а также выполнять подстановку переменных. Это  значит, что при обнаружении позиционных параметров и других имен  переменных,  перед которыми стоит знак $,  они будут заменяться на соответствующие значения, если они имеются. Одинарные кавычки подавляют подстановку переменных:
     MAIL=/usr/mail/gas
     echovar="echo $1 $2 $3 $4"
     stars=*****
     asterisks='$stars'
    

       В приведенных примерах переменной echovar присвоено  значение строки, состоящей из слова echo и четырех позиционных параметров, разделенных пробелами. Вокруг последовательности звездочек, присваиваемых переменной stars,  кавычек не требуется, т.к. их специальное значение здесь не действует.  Обратите внимание, что переменной asterisks  присвоено  текстовое  значение  "$stars",  а не "*****", т.к. одинарные кавычки отменили подстановку.
       В командах присвоения при подстановке пробелы повторно не интерпретируются, поэтому  переменные $first и $second в  следующем примере имеют одно и то же значение:
    first='a string with embedded spaces'
    second=$first
    

       При обращении к значениям переменных вы можете заключать  имя переменной в   фигурные скобки,  чтобы отделить имя переменной от остального текста. В частности, если символ, непосредственно следующий после имени,  является буквой, цифрой или знаком подчеркивания, то фигурные скобки необходимы. В качестве примера рассмотрим:
    a='This is a string'
    echo "${a}ent test of variables."
    

       В данном случае команда echo напечатает:
    This is a stringent test of variables.
    

       Если бы  вы  не  использовали  фигурные  скобки,   то   Shell
    подставил бы пустое значение вместо "$aent" и напечатал:
    test of variables.
    

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

    HOME  Программа login  присваивает этой  переменной  значение каталога загрузки пользователя,  т.е. каталога, который является текущим во время выполнения login; команда cd, казанная без аргументов,  переключает в каталог с именем $HOME.  Использование этой переменной позволяет  не следить за полными именами процедур Shell.
    IFS  Эта переменная определяет, какие символы являются внутренними разделителями полей. Это символы, которые Shell использует при интерпретации пробелов.  (Если вы хотите использовать какой-либо разделитель,  вы должны установить его в переменной IFS.) Интерпретатор Shell при запуске включает  в IFS символ пробела,  знак табуляции и символ новой строки.
    MAIL  Эта переменная  содержит  полное имя (с путями,  где он расположен) файла, куда приходит почта. Если переменная MAIL установлена,  то Shell проверяет, было ли что-нибудь добавлено в указанный файл и дает сообщение о  появлении новой  почты  при  каждом возврате на командный уровень (например, при выходе из редактора). Переменная MAIL автоматически  не устанавливается; если требуется, ее необходимо  установить  в   пользовательском   файле .profile. Команда  export и файл .profile рассматриваются ниже.)  (О наличии почты в стандартном файле почты сообщается при загрузке независимо от значения переменной MAIL.)
    MAILCHECK Этот  параметр определяет с какой частотой (в секундах) Shell будет проверять появление почты в файлах, указанных в параметрах MAILPATH и MAIL.  Принимаемое по умолчанию значение равно 600 секунд. Если этот параметр установлен равным  0,   то  Shell будет проверять наличие почты при каждом появлении символа приглашения.
    MAILPATH  Этот параметр содержит список имен файлов,  разделенных двоеточием. Если этот параметр установлен, то Shell информирует пользователя  о приходе почты в любой из указанных файлов.  После каждого имени файла может  стоять знак %  и  сообщение,  которое будет выводиться,  когда произойдет изменение времени модификации  этого  файла. По умолчанию выдается сообщение "You have mail".
    SHACCT  Если в этот параметр  занесено  имя  файла,  доступного пользователю для записи,  Shell будет делать в него соответствующие записи для каждой  выполняемой  процедуры Shell. Для анализа этих данных могут использоваться такие процедуры, как acctcom (ADM) и accton (ADM).
    SHELL  Когда вызывается интерпретатор Shell, он ищет эту переменную и если она имеется и в ее значении вместо  имени файла указан символ 'r',  то Shell загружается в укороченном виде.
    PATH  Эта переменная определяет пути, которые использует Shell при поиске команд.  Ее значение представляет собой список имен  каталогов,   разделенный  двоеточиями.  Shell присваивает переменной PATH значение  :/bin:/usr/bin, где перед  первым двоеточием ничего не указано.  Пустой аргумент в любом месте в списке путей всегда обозначает текущий каталог.   В некоторых системах поиск в текущем каталоге по умолчанию отсутствует, и поэтому переменная PATH определяется  как  /bin:/usr/bin.  Если вы хотите, чтобы текущий каталог при поиске команд  просматривался последним, а не первым, используйте:
    PATH=/bin:/usr/bin:
    

    В следующем примере два двоеточия,  стоящие подряд, интерпретируются как двоеточие, за которым следует пустой аргумент и двоеточие, тем самым обозначая текущий каталог. Вы  можете  создать  личный  каталог   с командами (например, $HOME/bin[color]) и задать просмотр его в первую очередь:
    PATH=$HOME/bin::/bin:/usr/bin
    

    Параметр PATH обычно устанавливается в файле [color=gray].profile.
    CDPATH  Эта переменная определяет пути поиска каталогов, содержащих arg.  Альтернативные имена каталогов  разделяются двоеточиями. Путь,  используемый по умолчанию, - <null> (он определяет текущий каталог).  Текущий каталог определяется нулевым  именем пути,  который можно указывать сразу после знака равенства или между двумя двоеточиями в любом  месте списка.  Если arg начинается с /, тогда поиск по путям не выполняется. В противном случае просматриваются все указанные в путях каталоги.
    PS1  Эта переменная определяет,  какое выражение следует использовать в  качестве  первичного приглашения системы. Если Shell является интерактивным, то он выдает приглашение в  виде PS1,  когда ожидается ввод.  По умолчанию PS1 присвоено значение "$ ".
    PS2  Эта переменная определяет выражение для вторичного приглашения системы.  Если интерпретатору Shell  требуется входных данных больше, чем было указано в строке, то он  выдает приглашение в виде PS2. По умолчанию PS2 присвоено значение  ">  " (знак "больше",  за которым следует пробел).
       В большинстве случаев вам необходимо передавать все указанные переменные во все интерпретаторы,  которые вы  используете.   Для этого используйте  команду export в вашем файле .profile, например:
    export HOME IFS MAIL PATH PS1 PS2
    

    Заранее определяемые специальные переменные
       
       У некоторых переменных есть специальное значение и оно  устанавливается только самим интерпретатором. Это:
    $#  Записывает количество аргументов,  переданных в Shell, несчитая имени самой вызываемой процедуры.  Например, при выполнении команды:
    sh cmd a b c 
    

    в $# передается номер последнего позиционного параметра и поэтому $# равно 3.  Эту переменную  можно  использовать, например, для  проверки наличия всех необходимых аргументов:
    if test $# -lt 2
    then
    	echo 'two or more args required'; exit
    fi
    

    $? - Эта переменная содержит код завершения последней   выполненной команды.  Ее значение это десятичное число.  Большинство команд  UNIX дают код возврата 0 при успешном завершении. Сам Shell возвращает  текущее  значение  $? в качестве своего кода завершения.
    $$  В этой переменной хранится номер текущего процесса.  Поскольку номера процессов среди всех выполняемых никогда не могут совпадать,  эту переменную часто используют для образования имен временных файлов. В UNIX нет механизма автоматической генерации и удаления временных файлов.  Файл существует до  тех  пор,   пока его не сотрут специально. Пользоваться временными файлами как правило  бывает  неудобно - механизм программных каналов UNIX для большинства приложений намного лучше.  Однако, потребность во временных файлах  с уникальными именами иногда все же появляется.
       Следующий пример  демонстрирует рекомендуемый способ создания временных файлов.  Обратите внимание  на  то, что  каталоги /bin  и /usr/tmp очищаются в случае перезагрузки системы.
    # применение идентификатора текущего
    # процесса для формирования уникального
    # временного файла
    temp=/usr/tmp/$$
    ls > $temp
    # здесь стоят команды, некоторые из которых
    # используют временные файлы
    rm -f $temp
    # стирание в конце работы
    

    $!  Номер последнего процесса,  который выполнялся  в фоновом режиме. Это число, содержащее от 1 до 5 цифр.
    $-  Это переменная, состоящая из имен флагов, включенных в данный момент в Shell.

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

    Смена каталогов

       Команда cd  меняет каталог на тот,  который указан в качестве аргумента. Ее можно и нужно использовать для перехода в требуемое место в структуре каталогов.  Обратите внимание, что cd часто помещают внутри скобок, чтобы приказать подоболочке сменить каталог и выполнить какие-либо команды,  не затрагивая основную оболочку.
       Например, первая из приводимых ниже команд копирует файл /etc/passwd в /usr/you/passwd, а вторая сначала меняет каталог на /etc и затем копирует файл:
    cp /etc/passwd /usr/you/passwd
    (cd /etc; cp passwd /usr/you/passwd)
    

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

    Файл .profile

       Файл с именем .profile считывается каждый раз,  когда вы загружаетесь в UNIX. Он обычно используется для выполнения специальных команд   и для установки и передачи переменных во все подоболочки. Только после того, как все команды из файла .profile будут считаны и выполнены,  Shell начнет считывание команд из стандартного ввода - обычно с терминала.
       Если вы хотите произвести переустановку параметров среды после внесения изменений в файл .profile, введите:
    .profile
    

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

    Флаги выполнения

       Команда set позволяет вам изменять поведение Shell путем  установки определенных   флагов.  В частности,  флаги -x и -v могут быть полезны при вызове Shell как команды с терминала.  Эти флаги можно установить командой set:
    set -xv
    

    Те же самые флаги можно выключить командой:
    set +xv
    

    Эти два флага имеют следующее действие:
    -v  Вводимые  строки  печатаются  так,  как  они  считываются Shell'ом. Этот флаг удобен для устранения  синтаксических ошибок. Команды  на  каждой  введенной строке выполняются после того, как она будет напечатана.
    -х  Команды и их аргументы печатаются по мере  их выполнения. (Команды управления Shell, такие как for, while и т.д. не печатаются.) Обратите внимание,  что -х вызывает  трассировку только тех команд,  которые выполняются, а -v печатает всю командную строку,  пока не встретится  синтаксическая ошибка.

       Команда set также  используется  для установки этих и других флагов в процедурах Shell.

    Среда выполнения команд
       -------------------------------------------------------------

       Все переменные и их значения,  которые известны команде перед выполнением, образуют ее оболочку (среду выполнения). Эта оболочка включает в себя переменные,  которые команда получает "по наследству" от родительского процесса,  и переменные,  указанные как ключевые параметры в командной строке, которая запускает команду.
       Переменные, которые Shell передает дочернему процессу  -  это переменные, перечисленные как аргументы в команде export. Эта команда помещает указанные переменные в оболочки как самого  Shell, так и всех его будущих дочерних процессов.
       Ключевые параметры - это пары  переменная-значение,   которые появляются в   форме присвоений,  обычно перед именем процедуры в командной строке. Такие переменные помещаются в оболочку вызываемой процедуры. Например:
    # keycommand
    echo $a $b
    

       Это пример простой процедуры,  которая выводит значения  двухпеременных. Если ее вызвать следующим образом:
    a=key1 b=key2 keycommand
    

    то результирующий вывод будет:
    key1 key2
    

       Ключевые параметры не являются аргументами и не изменяют $#.
       Процедура имеет доступ к значению любой  переменной  в  своей оболочке. Однако,  даже если значение переменной было изменено, эти изменения не отражаются на параметрах  Shell;  они  относятся только к конкретной процедуре. Для того, чтобы эти изменения были переданы в дочерние процессы данной  процедуры, эти переменные должны быть перечислены в команде export в этой процедуре.  Чтобы получить список переменных, которые являются передаваемыми из текущего интерпретатора Shell, введите:
    export
    

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

    или
    env
    

    Вызов интерпретатора Shell
       -------------------------------------------------------------

       Shell -  это команда и она может быть вызвана также как и любая другая команда:
    sh proc [arg...]      Новая копия Shell вызывается для чтения proc.
    sh -v proc [arg...]   Это эквивалентно помещению "set -v" в начале proc. Также можно указывать флаги -x, -e, -u, -n.
    proc [arg...]         Если proc  является выполняемым файлом, а не скомпилированной  программой, то эффект будет такой же, как от команды:
    sh proc args
    

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

    Передача параметров в процедуры Shell
       -------------------------------------------------------------

       Когда просматривается командная строка,  любая последовательность символов в виде $n заменяется на n-ный аргумент Shell, считая имя процедуры как $0.  Такое соглашение позволяет производить прямое обращение к имени процедуры и к позиционным параметрам (не более 9).  Дополнительные аргументы можно обрабатывать, пользуясь командой shift или используя цикл for.
       Команда shift сдвигает аргументы влево,  т.е. значение $1 теряется, $2  заменяет $1,  $3 заменяет $2 и т.д. Позиционный параметр с наибольшим номером становится неопределенным  ($0  никогда не сдвигается). Например, в приводимой ниже процедуре ripple, команда echo записывает свои аргументы в стандартный вывод:
    
     # команда ripple
     while test $# != 0
     do
     echo $1 $2 $3 $4 $5 $6 $7 $8 $9
     shift
     done
    

       Строки, начинающиеся с #, являются комментариями. Команда цикла while рассматривается в пункте "Условные циклы: while и until" в этой главе.  Если эта процедура будет вызвана таким способом:
     ripple a b c
    

    то она напечатает:
    
     ---------------------------------------------------------
    ¦ a b c
    ¦ b c
    ¦ c
    

       Специальная переменная "звездочка" ($*) вызывает подстановку всех позиционных параметров, кроме $0. Так, строку с командой echo в последнем примере можно записать намного компактнее:
     echo $*
    

       Эти две записи команды echo неэквивалентны полностью. Первая печатает максимум девять позиционных параметров, а вторая печатает все текущие позиционные параметры. Переменная ($*) более емкая и подвержена ошибкам в меньшей степени. Один из способов ее использования состоит в передаче команде произвольного числа аргументов. Например, команда:
     wc $*
    

    подсчитывает слова в каждом из  файлов, указанных в командной строке.
       Важно понимать последовательность действий, выполняемых Shell'ом при просмотре командной строки и выполнении подстановок. Shell сначала считывает ввод до символа новой строки или точки с запятой и затем выполняет анализ считанной части ввода. Переменные заменяются своими значениями и затем делается командная подстановка (через обратные кавычки). Затем определяются, обрабатываются и удаляются из строки аргументы, переадресующие ввод-вывод. После этого  Shell просматривает получившуюся командную строку и ищет внутренние разделители полей, т.е. все символы, определенные в IFS и разделяющие командную строку на отдельные аргументы. Пустые аргументы (определенные в виде "" или '') сохраняются, а остальные пустые аргументы, полученные в результате оценки переменных, которые являются нулевыми или не определены, удаляются. Затем происходит формирование имен файлов по указанным шаблонам. И только после этого командная строка выполняется интерпретатором.
       Иногда командные строки создаются внутри процедур Shell. В этом случае бывает полезно заставить Shell повторно просмотреть командную строку после выполнения подстановок. Для этих целей имеется специальная команда eval. Она считывает командную строку в качестве своего аргумента, выполняет все подстановки и печатает ее. Рассмотрим следующий пример:
     command=who
     output=' | wc -l'
     eval $command $output
    

       Эта часть процедуры выведет на экран получившуюся строку:
     who | wc -l
    

       Использование команды eval может быть вложенным, при этом командная строка просматривается несколько раз.

    Управление потоком выполнения

       Shell имеет несколько команд, которые используют множество управляющих структур, полезных при управлении потоком выполнения процедур. Перед тем как описывать эти структуры, необходимо определить некоторые термины.
       Простая команда - это любая неделимая команда, определяемая именем выполняемого файла. Аргументы переадресации ввода-вывода могут указываться в простых командах и они передаются интерпретатору, а не самой команде.
       Команда - это простая команда или любая из управляющих команд Shell, описанных ниже. Конвейер - это последовательность из одной или более команд, разделенных вертикальными чертами (|). В конвейере стандартный вывод каждой команды,  кроме последней, соединен посредством программного канала со стандартным вводом следующей команды. Каждая   команда в конвейере выполняется отдельно; Shell ждет завершения последней команды. Код завершения конвейера равен коду завершения последнего процесса в конвейере.
       Список команд - это последовательность из  одного  или  более конвейеров, разделенных  точками с запятой (;), амперсандами (&), символами "и-если" (&&)  или "или-если" (||)   и  заканчивающаяся (необязательно) точкой с запятой или амперсандом. Точка с запятой вызывает последовательное выполнение предыдущего конвейера. Это значит, что  Shell ждет конца выполнения конвейера и только после этого считывает следующий. С другой стороны, амперсанд вызывает асинхронное выполнение   в  фоновом режиме предыдущего конвейера. Таким образом допускаются как последовательное, так и фоновое выполнение. Фоновый конвейер продолжает выполнение до тех пор, пока не завершится самостоятельно или будет уничтожен.
       Другие области  применения амперсанда включают в себя фоновую компиляцию и создание заданий, которые будут пересылаться другим компьютерам. Допустим, вы ввели:
    nohup cc prog.c&
    

       Вы можете продолжать работать в то время как Си-компилятор выполняется в фоновом режиме. Командная строка, заканчивающаяся амперсандом, защищена от прерываний и выхода, которые вы указываете, набирая с клавиатуры INTERRUPT или QUIT. Только одновременное нажатие клавиш Ctrl-d может снять команду в случае, если вы работаете через коммутируемую линию или имеете stty hupcl. В этом случае мы также советуем устанавливать защиту от прерываний. Для этого используется команда nohup. Допустим, что в  приведенном примере вы не указали nohup, тогда если вы выходите из подзадачи до того, как завершится процесс сс, он будет уничтожен со всем своим выводом.
       Амперсанд нужно применять с ограничениями,  особенно в сильно загруженных системах. В противном случае возникнут претензии со стороны других пользователей, если вы будете запускать много процессов в фоновом режиме без достаточных на то оснований.
       Операторы "и-если" и "или-если" (&& и ||) вызывают выполнение конвейеров при соответствии определенных условий.  Оба эти оператора имеют одинаковый приоритет при расшифровке командной строки, но меньший,  чем  у амперсанда и вертикальной черты.  В командной строке:
    cmd1 || cmd2
    

    первая команда cmd1 выполняется и анализируется ее  код  завершения. Команда cmd2 выполняется только в том случае, если сmd1 завершилась с кодом, не равным 0. Т.е. это является краткой записью следующих команд:
    
     if cmd1
     test $? !=0
     then
     cmd2
     fi
    

       Оператор "и-если" (&&) выполняет проверку на равенство. Например, в командной строке:
    
     cmd1 && cmd2
    

    вторая команда выполняется только в том случае, если первая завершилась успешно (код завершения равен 0). В следующей строке каждая команда выполняется по очереди до тех пор,  пока какая-нибудь не закончится с кодом, не равным 0:
    
     cmd1 && cmd2 && cmd3 && ... && cmdn
    

       Простая команда в конвейере может быть заменена списком команд, заключенным в простые или фигурные скобки. Вывод всех команд, заключенных в скобки, объединяется в один поток, который становится входом для следующей команды в  конвейере. Следующая командная строка форматирует и печатает два отдельных документа:
    { nroff -mm text1; nroff -mm text2; } | lpr
    

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

                                7-28


    Использование оператора if

       Shell позволяет структурировать условные переходы с помощью оператора if. Простейшая форма оператора if следующая:
    
     if список команд
     then список команд
     fi
    

       Список команд, стоящий после if, выполняется, и если код завершения последней выполненной команды равен 0, тогда выполняется список команд, указанный после then. Слово fi обозначает конец команды if.
       Чтобы выполнить альтернативный набор команд при ненулевом коде завершения, используется условие else, которое записывается cледующим образом:
    
     if список команд
     then список команд
     else список команд
     fi
    

       Используя условие elif вместе с командой if, можно выполять различные условия, но при большом количестве проверок редпочтительнее использовать оператор case. Например:
    
     if test -f "$1"
     # является ли $1 файлом?
     then pr $1
     elif test -d "$1"
     # если нет, то является ли $1 каталогом?
     then (cd $1; pr *)
     else echo $1 не является ни файлом, ни каталогом
     fi
    

       Приведенный пример выполняется следующим образом: если значение первого позиционного параметра является именем файла (-f), то этот файл печатается; если нет,  то проверяется, является ли это имя именем каталога (-d). Если это так, то вы переходите в этот каталог (cd) и печатаете все находящиеся в нем файлы ( pr *). Во всех остальных случаях появляется сообщение об ошибке.
       Команды if могут вкладываться друг в друга, но каждый if обязательно должен иметь свой fi.
       Кодом завершения команды if является код завершения последней выполненной команды после условий then и else. Если команды не выполнялись, то код завершения равен 0.
       Обратите внимание, что вместо указания команды test можно ис-
    пользовать альтернативное обозначение -  прямоугольные  скобки  с
    заключенным в  них проверяемым выражением.  Например,  предыдущий
    пример можно было записать так:

       if    [ -f "$1" ]
       #     является ли $1 файлом?
       then  pr $1
       elif  [ -d "$1" ]
       #     если нет, то является ли $1 каталогом?
       then  (cd $1; pr *)
       else  echo $1 не является ни файлом, ни каталогом
       fi

       Обратите внимание  на то,  что при такой форме записи пробелы
    после левой скобки и перед правой обязательны.

       Использование оператора case

       Оператор case также дает возможность проверять различные  ус-
    ловия. Основной формат оператора case следующий:

       case  подстрока  in
             шаблон ) cписок команд ;;
         ....
             шаблон ) cписок команд ;;
       esac

       Shell пытается  найти указанную подстроку по очереди в каждом
    шаблоне, используя  те же самые соглашения,  что и при  генерации
    имен файлов. Если соответствие установлено, то выполняется список
    команд после этого шаблона. Два символа точки с запятой (;;) слу-
    жат обозначением  конца оператора case и необходимы после каждого
    шаблона кроме последнего. Обратите внимание на то, что только од-
    но значение шаблона (из указанных)  может обнаружиться в подстро-
    ке, что сравнение с шаблонами выполняется последовательно, и поэ-
    тому если первым шаблоном выступает звездочка (*),  все остальные
    значения игнорируются.

                                7-30


       С одним  и тем же списком команд может быть связано несколько
    альтернативных шаблонов, разделенных символом (|).

       case $i in
             *.c)  cc $i
                   ;;
             *.h | *.sh)
                   : do nothing
                   ;;
             *)    echo "$i of unknown type"
                   ;;
       esac

       В этом примере для второго набора шаблонов не выполняется ни-
    каких действий,  т.к.  указана пустая команда (:).  Звездочка ис-
    пользуется как шаблон, соответствующий любому слову.
       Код завершения оператора case равен коду завершения последней
    выполненной команды.  Если никакие команды не выполнялись, то код
    завершения равен 0.

       Условные циклы: while и until

       Основная форма команды while имеет вид:

       while   список команд
       do
               список команд
       done

       Сначала выполняются команды из первого списка, и если код за-
    вершения последней команды в этом списке равен 0,  тогда выполня-
    ются команды из второго списка. Эта последовательность повторяет-
    ся до тех пор,  пока код завершения первого списка равен 0. Чтобы
    цикл выполнялся до тех пор, пока код завершения первого списка не
    равен 0, надо заменить while на until.
       Любая строка может быть заменена символом "точка с  запятой".
    Код завершения команд while и until равен коду завершения послед-
    ней выполненной команды во втором списке. Если команды из второго
    списка не выполнялись, код завершения равен 0.

                                7-31


       Организация цикла для списка: for

       Часто бывает нужно выполнить  некоторый  набор  операций  для
    каждого файла   из  какого-либо списка или выполнить одну команду
    для каждого из нескольких аргументов. Для этого существует коман-
    да for. Формат команды for следующий:

       for переменная in список значений
       do
           список команд
       done

       Значения переменных в списке разделяются пробелами. Команды в
    списке команд  выполняются один раз для каждого значения перемен-
    ной из списка значений.  Переменной по очереди присваивается каж-
    дое значение из списка.  Например,  следующий цикл for производит
    сравнение исходных текстов xec.c,  cmd.c и word.c в текущем ката-
    логе с     файлами   с   такими   же   именами,   но  в  каталоге
    /usr/src/cmd/sh:

       for CFILE in xec cmd word
       do    diff $CFILE.c /usr/src/cmd/sh/$CFILE.c
       done

       Обратите внимание на то,  что первое упоминание  имени  CFILE
    сразу после  слова  for не сопровождается появлением символа "$",
    поскольку в данном случае используется имя переменной,  но не  ее
    значение.
       Слово "in",  являющееся частью команды for,  можно не  указы-
    вать. В    этом случае текущий набор позиционных параметров будет
    использован вместо списка значений. Это полезно в том случае, ес-
    ли набор команд выполняется для каждого аргумента из списка аргу-
    ментов, общее число которых неизвестно.
       В качестве примера создайте файл с именем echo2,  который со-
    держит следующий текст:

       for word
       do echo $word$word
       done

       Измените статус файла echo2:

       chmod +x echo2

                                7-32


       Теперь введите следующую команду:

       echo2 ma pa bo fi yo no so ta

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

       ---------------------------------------------------------

    ¦   mama
    ¦   papa
    ¦   bobo
    ¦   fifi
    ¦   yoyo
    ¦   nono
    ¦   soso
    ¦   tata
    ¦

       Управление циклами: break и continue

       Для прекращения  выполнения  циклов while или for применяется
    команда break.  Команда continue немедленно запускает  выполнение
    следующего шага   в цикле.  Эти команды действуют только если они
    встречаются между командами do и done.
       Команда break завершает выполнение только выполняемого в дан-
    ный момент цикла, вызывая продолжение работы команд, стоящих пос-
    ле ближайшего done. Выход из n-уровневого вложенного цикла дости-
    гается командой break n.

                                7-33


       Команда continue продолжает выполнение с ближайшего открытого
    оператора for,  while или until, т.е. того, который содержит этот
    оператор continue.    Вы также можете задать аргумент n в команде
    continue, и тогда выполнение будет продолжено с n-ного вложенного
    цикла:

       # Эта процедура интерактивная.
       # Команды "break" и "continue" используются
       # пользователем для управления вводом данных.
       while true #loop forever
       do  echo "Please enter data"
           read response
           case "$response" in
           "done")     break
                 # no more data
                 ;;
           "")   # just a carriage return,
                 # keep on going
                 continue
                 ;;
           *)    # process the data here
                 ;;
           esac
       done

       Конец файла и выход

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

       Группирование команд: скобки () и []

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

                                7-34


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

       garble(stuff)

    то Shell выдаст сообщение об ошибке. Строки с кавычками типа:

       garble"("stuff")"
       "garble(stuff)"

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

       CURRENTDIR=`pwd`; cd /usr/docs/otherdir;
       nohup nroff doc.n > doc.out&; cd $CURRENTDIR

    и

       (cd /usr/docs/otherdir; nohup nroff doc.n > doc.out&)

    дают один и тот же результат: файл /usr/docs/otherdir/doc.n обра-
    батывается nroff     и     вывод     сохраняется     в      файле
    /usr/docs/otherdir/doc.out. (Следует заметить,  что команда nroff
    обрабатывает текстовую информацию.)  Во втором примере возврат  в
    начальный рабочий  каталог  происходит  автоматически.  Пробелы и
    символы новой строки вокруг скобок допустимы,  но не обязательны.
    При вводе  командной  строки  с  терминала  Shell высветит символ
    приглашения в виде значения переменной PS2, в случае, если требу-
    ется закрытие скобок.
       Фигурные скобки { и } могут также применяться для группирова-
    ния команд. Обе эти скобки распознаются только если они находятся
    на месте первого (не заключенного в кавычки) слова команды. После
    открывающей фигурной скобки может следовать символ новой строки -
    в этом случае Shell выдаст приглашение для  ввода  дополнительной
    информации. В  отличие от обычных скобок,  для фигурных скобок не
    создается никаких подоболочек - заключенные в них команды  просто
    считываются интерпретатором Shell.  Фигурные скобки удобны в слу-
    чае, когда  вы хотите использовать (последовательный)   вывод  от
    нескольких команд в качестве ввода для одной команды.

                                7-35


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

       Определение функций

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

       name ( ) { список; }

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

       # Ответ "да" или отсутствие ответа - возвращение ненулево-
       # го значения  в случае "нет"
          getyn  ( )  {
             while echo "$* (y/n)? C" >& 2
             do   read yn rest
                  case $yn in
                  [yY] return 0                        ;;
                  [nN] return 1                        ;;
                  *)   echo "Please answer y or n" >&2 ;;
                  esac
             done
          }

       В этом  примере функция добавляет "(y/n)?" к выводу и ожидает
    ввода символов "Y",  'y",  "N" или "n",  возвращая 0 или 1.  Если
    введены какие-либо   другие символы,  функция просит пользователя
    исправить ввод.
       Функции можно использовать так же как и любые другие команды.
    Вызов функции getyn может быть, например, такой:

       getyn "Do you wish to continue" || exit

       Надо помнить,  что при этом позиционные  параметры  $1,$2,...
    устанавливаются равными значениям аргументов функции. Т.к. коман-
    да exit, использованная в функции, завершает работу всей процеду-
    ры, то    для возвращения обратно в процедуру требуется применять
    команду return.

                                7-36


       Переопределение направления ввода/вывода и управляющие коман-
       ды

       Обычно Shell не разветвляет свои процессы и не создает  новые
    подоболочки при обнаружении управляющих команд (отличных от обыч-
    ных скобок).  Однако,  каждая команда в конвейере выполняется как
    отдельный процесс для того,  чтобы правильно направить ввод и вы-
    вод для каждой команды.  Когда  переадресация  ввода-вывода  явно
    указана в  команде,  тогда запускается отдельный процесс для этой
    команды. Таким  образом,  когда команды if,  while, until, case и
    for применяются в конвейере,  состоящем более чем из одной коман-
    ды, Shell  разветвляется и подоболочка выполняет управляющую  ко-
    манду. При этом надо помнить:
       1. Все изменения, сделанные с переменными во время выполнения
          управляющей команды, не сохраняются при ее завершении. Это
          аналогично группированию команд с помощью обычных скобок.
       2. Управляющие  команды при переадресации выполняются немного
          медленнее.

       Обмен между файлами: команда (.)

       Командная строка в виде :

       . proc

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

       . .profile

       Управление прерываниями: trap

       Процедуры Shell  могут использовать команду trap для отключе-
    ния сигнала (когда это требуется)  или  для  переопределения  его
    действия. Синтаксис команды trap следующий:

       trap аргумент список_сигналов

                                7-37


       Здесь аргумент - это текст, который интерпретируется как спи-
    сок команд, а список_сигналов состоит из одного или более номеров
    сигналов, описанных  в UNIX Programmer's Reference. Наиболее важ-
    ными сигналами являются:

       -----------T----------------------------------------------
       ¦  номер   ¦     сигнал                                   ¦
       +----------+----------------------------------------------+
       ¦    0     ¦  Выход из Shell                              ¦
       ¦    1     ¦  HANGUP                                      ¦
       ¦    2     ¦  символ INTERRUPT (DELETE или RUB OUT)       ¦
       ¦    3     ¦  QUIT (Ctrl-\)                               ¦
       ¦    9     ¦  KILL (не может быть перехвачен или          ¦
       ¦          ¦   проигнорирован)                            ¦
       ¦   11     ¦  Изменение сегментации (не может быть пере-  ¦
       ¦          ¦   хвачен или проигнорирован)                 ¦
       ¦   15     ¦  Сигнал завершения работы программы          ¦
       L----------+-----------------------------------------------

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

       trap 'echo Directory was `pwd` when interrupted` 2 3 15
       for i in /bin /usr/bin /usr/gas/bin
       do
           cd $i
              # здесь идут команды, исполняемые в каталоге $i
       done

       Та же самая процедура, но с двойными кавычками выполняет дру-
    гие действия. Следующая команда:

       trap "echo Directory was `pwd` when interrupted" 2 3 15

    печатает имя каталога, из которого впервые стала выполняться про-
    цедура.
       Сигнал с номером 11 никогда не может быть перехвачен, т.к. он
    необходим самому интерпретатору для правильного распределения па-
    мяти. Ноль интерпретируется командой trap как сигнал, образующий-
    ся при выходе из Shell. Это происходит любо при выполнении коман-
    ды exit,  либо при достижении конца процедуры.  Если аргумент  не
    указан, тогда при получении любого из сигналов выполняются приня-
    тые в системе по умолчанию действия.  Если аргумент является пус-
    тым (""   или ''),  тогда сигналы из списка сигналов игнорируются
    Shell'ом.

                                7-38


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

       temp=$HOME/temp/$$
       trap 'rm -f $temp; exit' 0 1 2 3 15
       ls > $temp
            # здесь идут команды, использующие $temp

       В этом примере,  как только любой из сигналов 1,  2, 3 или 15
    будет получен процедурой или сама процедура будет завершаться, то
    будут выполнены все команды, записанные в одинарных кавычках. Ко-
    манда exit здесь необходима,  т.к. в противном случае Shell будет
    читать команды дальше после того места, где был получен сигнал.
       В некоторых  случаях Shell продолжает чтение команд после вы-
    полнения команды trap.  Приводимая ниже  процедура  берет  каждый
    подкаталог из текущего каталога, переходит туда, печатает его имя
    и выполняет команды, вводимые с терминала до тех пор, пока не бу-
    дет введен символ конца файла (Ctrl-d) или не будет получено пре-
    рывание. Конец файла вызывает возврат из команды read с ненулевым
    кодом завершения,  тем самым прекращая цикл while и запуская цикл
    для следующего имени каталога.  Прерывания игнорируются во  время
    выполнения вводимых команд, но вызывают завершение, если процеду-
    ра в этот момент ждет ввода:

       d=`pwd`
       for i in *
       do  if test -d $d/$i
           then cd $d/$i
           while echo "$i:"
                 trap exit 2
                 read x
           do    trap : 2
                 # игнорирование прерываний
                 eval $x
           done
       fi
       done

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

       trap

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

                                7-39


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

       Пример работы интерпретатора Shell

       Ниже приводится  фрагмент программы Shell,  связанный с обра-
    боткой сигналов.

       :
       #
       #     Установка подпрограмм обработки сигналов
       #
       trap "echo
       trap "echo
       trap "echo
       #
       #     Замечание: Если вы перешли в другой каталог, вы можете
       #     сбросить прерывание SIGQUIT с обнаружением файла "core".
       #     Для этого вставьте соответствующую строку после команды
       #     cd.
       #
       trap "echo

       echo " Going into loop0
       while true
       do
              cd /tmp
              trap "echo
              lf
              cd /usr
              trap "echo
              lf
              sleep 1
       done
       echo " Leaving the loop 0
       exit 0

                                7-40


       Специальные команды Shell
       -------------------------------------------------------------


       Существует несколько специальных команд,  являющихся внутрен-
    ними для Shell.  Некоторые из них мы уже рассмотрели. Интерпрета-
    тору не требуется создавать подоболочку для выполнения  этих  ко-
    манд и   следовательно не создаются дополнительные процессы.  Эти
    команды рекомендуем использовать везде,  где это возможно,   т.к.
    они работают быстрее и эффективнее, чем другие команды UNIX.
       Некоторые из специальных команд мы уже рассмотрели,  т.к. они
    влияют на управление процессами.  Это точка (.), break, continue,
    exit и trap.  Команда set также  является  специальной  командой.
    Описание остальных специальных команд приводится ниже:

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

       cd arg           Делает arg текущим каталогом.  Если  arg  не
                        является каталогом  или  у  пользователя нет
                        права доступа к нему,  команда завершается с
                        ненулевым кодом завершения.  Указание cd без
                        аргументов эквивалентно  вводу  "cd  $HOME",
                        что возвращает вас в каталог загрузки.

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

                                7-41


       hash [-r] name   Этой командой запоминается место в пути  по-
                        иска команды,   указанной  в name.  Опция -r
                        указывает Shell,  что старые значения  можно
                        стереть. Если никаких аргументов не указыва-
                        ется, то выводится информация о  запомненных
                        командах. Hits - это количество раз, которое
                        команда вызывалась Shell.  Cost -  это  мера
                        затрат, необходимых  для нахождения команды.
                        Бывают ситуации,  требующие пересчета  места
                        расположения команды.

       newgrp arg...    Команда newgrp при выполнении  создает новый
                        интерпретатор Shell,  который заменяет  ста-
                        рый. Помните,  что в новом Shell будут опре-
                        делены только переменные системы.  Все пере-
                        менные, которые  раньше  были  помечены  как
                        экспортируемые, теперь станут обыкновенными.

       pwd              Печатает текущий каталог.

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

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

       return n        Вызывает  возврат из функции с кодом заверше-
                       ния, равным n.  Если n не указано, то код за-
                       вершения равен  коду завершения последней вы-
                       полненной команды.

                                7-42


       times           Печатает  суммарное  время,    использованное
                       пользователем и процессами,   запущенными  из
                       текущей оболочки.

       type  name      Для каждого указанного имени показывает,  как
                       оно будет интерпретироваться в случае,   если
                       будет использоваться в качестве имени команды.

       ulimit [ -f] n  Эта команда устанавливает предел размера  за-
                       писываемого файла равным n блоков.   Флаг  -f
                       устанавливает этот предел для файлов, записы-
                       ваемых дочерними процессами (считываться  мо-
                       гут файлы любого размера). Команда, указанная
                       без аргумента, показывает текущий установлен-
                       ный предел.

       umask nnn       Устанавливает маску для создания файлов поль-
                       зователя равной nnn. Если nnn отсутствует, то
                       печатается текущее значение маски.  Эта бито-
                       вая маска  используется  для  установки  прав
                       доступа к  файлам при их создании.  Например,
                       значение маски,  равное  восьмеричному  числу
                       137, соответствует  следующей битовой маске и
                       правам доступа для создаваемого файла:
                         ------------T----------T------T------
                         ¦           ¦пользоват.¦группа¦другие¦
                         +-----------+----------+------+------+
                         ¦восьмеричн.¦     1    ¦   3  ¦  7   ¦
                         +-----------+----------+------+------+
                         ¦бит. маска ¦   001    ¦  011 ¦ 111  ¦
                         +-----------+----------+------+------+
                         ¦доступ     ¦   rw-    ¦  r-  ¦ -—  ¦
                         L-----------+----------+------+-------
                       Допустимые значения nnn см.   в  UNIX  User's
                       Reference.

       unset name      Для каждого указанного имени удаляет соответ-
                       ствующую переменную или функцию.   Переменные
                       PATH, PS1, PS2, MAILCHECK и IFS удалить нель-
                       зя.

                                7-43


       wait n          Shell ждет завершения  всех активных дочерних
                       процессов. Если n указано,  то Shell ждет за-
                       вершения только указанного процесса.  Код за-
                       вершения команды wait всегда равен 0, если не
                       указан аргумент n,  в противном случае он ра-
                       вен коду завершения дочернего процесса n.

                                7-44


       Создание и организация процедур Shell
       -------------------------------------------------------------


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

       proc args

    а не

       sh proc args

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

       LETTER=$1
       shift
       for i in $*
       do mail $i < $LETTER
       done

       Затем введите:

       chmod +x mailall

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

       mailall letter joe bob

       Здесь letter это имя файла, содержащего сообщение, которое вы
    хотите разослать, а joe и bob - это адресаты.
       Если mailall создан таким способом в каталоге,   указанном  в
    переменной PATH, то пользователь может менять каталоги и вызывать
    mailall таким же способом.

                                7-45


       Процедуры Shell часто используются пользователями, работающи-
    ми в csh. Однако, если первым символом процедуры является # (сим-
    вол комментария),  то csh полагает, что данная процедура является
    процедурой csh и вызывает для ее выполнения /bin/csh.  Всегда на-
    чинайте процедуры Shell с какого-либо другого символа, если пред-
    полагается, что  ею будут пользоваться и пользователи, работающие
    в csh. В этом случае для ее выполнения будет вызываться стандарт-
    ный интерпретатор Shell /bin/sh.
       Процедуры Shell могут создаваться динамически.  Процедура мо-
    жет генерировать файл с командами,  вызывать другой интерпретатор
    для выполнения   этого файла и затем удалять его.  Альтернативный
    подход - это применение команды (.),  чтобы заставить текущий ин-
    терпретатор прочитать команды из нового файла,  использовать зна-
    чения существующих переменных Shell,  не создавая дополнительного
    процесса в подоболочке.
       Многие пользователи предпочитают писать процедуры Shell, а не
    программы на Си или другом традиционном языке программирования. У
    этого есть свои причины:
       1. Процедуру Shell легко создавать и работать с ней, т.к. это
          обычный текстовый файл.
       2. У  процедуры  Shell  нет соответствующего объектного кода,
          который требовалось бы создавать.
       3. Процедуру  Shell  можно быстро создать,  использовать нес-
          колько раз и удалить.
       4. Поскольку процедуры Shell короткие,  написаны на языке вы-
          сокого уровня и содержат только исходный текст,  их  очень
          легко понимать и при необходимости исправлять.

       По принятому  соглашению,  каталоги,  которые содержат только
    команды и процедуры Shell,  называются bin. Это имя является сок-
    ращением от  binary (двоичный)  и используется потому,  что часто
    скомпилированные и выполняемые программы называют binaries, чтобы
    отличать их от исходных текстов программ. Большинство групп поль-
    зователей имеют свои собственные bin-каталоги для хранения  общих
    процедур. Некоторые пользователи указывают в переменной PATH нес-
    колько таких каталогов.  Мы не советуем указывать много каталогов
    в переменной PATH,  т.к.  от этого может пострадать эффективность
    выполнения процедур.

                                7-46


       Дополнительная информация о флагах
       -------------------------------------------------------------


       В Shell  имеется  несколько  флагов,  доступных для процедур.
    Это:

       -e   Этот флаг указывает Shell на необходимость  немедленного
            выхода, если  какая-либо выполняемая команда кончается с
            ненулевым кодом завершения. Этот флаг полезен для проце-
            дур, составленных из простых командных строк. Его нельзя
            использовать в сочетании с другими условными конструкци-
            ями.

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

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

       -n   Это флаг отмены выполнения.  Его используют, когда хотят
            проверить процедуру на наличие синтаксических ошибок, но
            при этом не выполнять саму процедуру.  Это делается ука-
            занием "set -nv" в начале файла.

       -k   Этот  флаг  указывает Shell'у,  что все аргументы в виде
            переменная=значение должны рассматриваться как  ключевые
            параметры. Когда этот флаг не установлен,  ключевыми па-
            раметрами считаются только аргументы,  стоящие перед са-
            мой командой.

                                7-47


       Команды поддержки и их особенности
       -------------------------------------------------------------


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

       Условная проверка: test

       Команда test проверяет выражение,  указанное в качестве аргу-
    мента, и  если выражение истинно, то test заканчивается с нулевым
    кодом. В  противном случае возвращается ненулевой код завершения.
    test также дает ненулевой код завершения в случае, если не указа-
    ны аргументы.  Часто бывает удобно применять test в качестве пер-
    вой команды в списке команд после if или while. Переменные Shell,
    используемые в проверяемых выражениях,  должны быть  заключены  в
    двойные кавычки,  если имеется вероятность, что они пустые или не
    определены.
       В качестве  альтернативного  обозначения  команды  test можно
    применять квадратные скобки, например:

       [ выражение ]

    имеет такое же действие как:

       test выражение

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

       -r file    Истинно, если указанный файл существует и доступен
                  пользователю для чтения.

       -w file    Истинно, если указанный файл существует и доступен
                  пользователю для записи.

       -x file    Истинно,   если  указанный файл существует и может
                  быть выполнен пользователем.

       -s file    Истинно,  если  указанный  файл существует и имеет
                  ненулевую длину.

                                7-48


       -d file    Истинно, если указанный файл является каталогом.

       -f file    Истинно, если указанный файл является обычным фай-
                  лом.

       -z sl      Истинно, если длина строки sl равна нулю.

       -n sl      Истинно, если длина строки sl не равна нулю.

       -t fildes  Истинно, если открытый файл с дескриптором fildes
                  соответствует терминалу. Если fildes не указан, по
                  умолчанию считается fildes=1.

       s1 = s2    Истинно, если строки s1 и s2 идентичны.

       s1 != s2   Истинно, если строки s1 и s2 различны.

       s1         Истинно, если строка s1 ненулевая.

       n1 -eq n2  Истинно, если  целые  числа  n1 и n2 алгебраически
                  равны. Другие алгебраические сравнения обозначают-
                  ся: -ne (не равно),  -gt (больше чем), -ge (больше
                  или равно), -lt (меньше чем), -le (меньше или рав-
                  но).

       Все эти опции можно объединять со следующими операторами:

       !          оператор унарного отрицания
       -а         бинарный логический оператор AND (и)
       -o         бинарный логический оператор OR (или), имеет мень-
                  ший приоритет, чем AND
       (выраж)    Скобки  для группирования.  При  отсутствии скобок
                  проверка выражения идет слева направо.

       Помните, что все опции,  операторы, имена файлов и т.д. явля-
    ются отдельными аргументами для test.

                                7-49


       Команда echo

       Команда echo имеет следующий синтаксис:

       echo [опции] [аргументы]

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

       echo *

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

       echo -n 'enter name:'
       read name

       Команда echo  может обрабатывать некоторые ESC-последователь-
    ности, описанные в UNIX User's Reference.

       Оценка арифметических выражений: expr

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

          #  увеличить $A
          A=`expr $A + 1`
          #  поместить символы $1 с 3-го по последний
          #  в подстроку substring
          substring=`expr "$1" : '..\(.*\)'`
          #  получить длину $1
          c=`expr "$1" : '.*'`

                                7-50


       Наиболее часто expr применяется для подсчета числа итераций в
    циклах.

       Команды true и false

       Команды true  и  false  возвращают код завершения 0 или не 0,
    соответственно. Их часто используют для создания безусловных цик-
    лов, например:

       while true
       do echo forever
       done

       В результате  слово forever будет появляться на экране до тех
    пор, пока не будет нажато INTERRUPT.

       Внутристрочный ввод документов

       При обнаружении командной строки в виде:

       command << eofstring

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

       command <<\eofstring

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

                                7-51


       cat <<-xx
            Это сообщение будет выведено на терми-
            нал без лишних пробелов и знаков табу-
            ляции.
       xx

       Переадресация ввода-вывода с помощью дескрипторов файлов

       Мы ранее уже говорили, что команда обычно направляет свой вы-
    вод в некоторый файл с дескриптором, равным 1 или 2. В языках ти-
    па Си можно связать вывод с любым дескриптором  файла  с  помощью
    системной команды write (см. UNIX User's Reference). В Shell име-
    ется свой собственный механизм создания выходного файла,  связан-
    ного с конкретным дескриптором файла. Вводя :

       fd1 >& fd2

    где fd1  и fd2 - разрешенные дескрипторы файлов,  можно направить
    вывод, который был связан с файлом с дескриптором fd1  в  файл  с
    дескриптором fd2. По умолчанию значения fd1 и fd2 равны 1. Если к
    моменту выполнения команды значение fd2 не определено, то переад-
    ресация отменяется. Наиболее часто этот механизм используется для
    переадресации стандартного вывода ошибок в файл стандартного  вы-
    вода. Это делается так:

       command 2>&1

       Если вы хотите перенаправить и стандартный вывод и вывод оши-
    бок в один и тот же файл file, введите:

       command 1>file 2>&1

       Порядок следования аргументов здесь важен: сначала дескриптор
    1 связывается с файлом file, затем дескриптор 2 связывается с тем
    же файлом,  т.к. он уже связан с дескриптором 1. Если порядок ар-
    гументов изменить,   то вывод ошибок пойдет на терминал,  а стан-
    дартный вывод пойдет в file,  т.к. к моменту переадресации вывода
    ошибок дескриптор 1 будет связан с терминалом.

                                7-52


       Этот механизм может быть обобщен для переадресации  стандарт-
    ного ввода. Если вы введете, например:

       fda <& fdb

    то оба дескриптора fda и fdb будут связаны с одним и тем же вход-
    ным файлом. Если fda и fdb не указаны, то они принимаются равными
    0. Такая переадресация ввода удобна для команд, которые использу-
    ют несколько источников ввода.

       Подстановка по условию

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

       A=
       bcd=""
       efg=''
       set ''  ""

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

       ${variable:-string}    Если variable установлена и ненулевая,
                              то вместо этого выражения подставляет-
                              ся значение переменной  $variable.   В
                              противном случае  выражение заменяется
                              значением string.  Помните, что значе-
                              ние variable при этом не изменяется.

       ${variable:=string}    Если variable установлена и ненулевая,
                              то вместо этого выражения подставляет-
                              ся значение  переменной  $variable.  В
                              противном случае  переменная  variable
                              устанавливаетcя равной  string и затем
                              производится подстановка вместо  выра-

                                7-53


                              жения нового значения variable.  Пози-
                              ционные параметры   установить   таким
                              способом нельзя.

       ${variable:?string}    Если variable установлена и ненулевая,
                              то вместо этого выражения подставляет-
                              ся значение  переменной  $variable.  В
                              противном случае печатается  сообщение
                              в виде:

                              variable: string

                              и происходит  выход из текущей оболоч-
                              ки. Если  вы  находитесь  в   основном
                              Shell'е, то выхода не происходит. Если
                              string не указана,  то сообщение будет
                              выглядеть так:

                              variable: parameter null or not set

       ${variable:+string}    Если variable установлена и ненулевая,
                              то вместо этого выражения подставляет-
                              ся значение string. В противном случае
                              выражение заменяется нулевой  строкой.
                              Помните, что   значение  variable  при
                              этом не изменяется.

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

       1. Пример явного присвоения значения переменной PATH:

          PATH=${PATH:-':/bin:/usr/bin'}

          Это означает,  что если переменная PATH была установлена и
          ненулевая, то сохраняется ее текущее значение, в противном
          случае она устанавливается равной ":/bin:/usr/bin".

       2. Пример автоматического присвоения значения переменной HOME:

          cd ${HOME:='/usr/gas'}

          Если HOME установлена и ненулевая, то происходит переход в
          этот каталог.   В противном случае HOME присваивается ука-
          занное значение и затем выполняется команда.

                                7-54


       Флаги, устанавливаемые при вызове Shell

       При вызове  Shell  в командной строке можно указать пять фла-
    гов. Эти флаги нельзя включить командой set.

       -i    Если указан этот флаг, или ввод и вывод Shell оба  под-
             ключены к терминалу, то Shell является интерактивным. В
             таком Shell'е INTERRUPT (сигнал 2)   перехватывается  и
             игнорируется, а TERMINATE (сигнал 15) и QUIT (сигнал 3)
             игнорируются.

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

       -c    Когда указан этот флаг, Shell считывает команды из пер-
             вой строки,  следующей после флага. Все остальные аргу-
             менты игнорируются.

       -t    Когда указан этот флаг,  то считывается  и  выполняется
             только одна  команда и затем происходит выход из Shell.
             Этот флаг рекомендуется использовать с Си-программами.

       -r    Если указан этот флаг, то Shell является усеченной вер-
             сией Shell (см. rsh(C)).

                                7-55


       Правила программирования в Shell
       -------------------------------------------------------------


       В этом разделе  приводятся  стратегии  написания  эффективных
    процедур Shell,   которые не тратят лишние ресурсы при выполнении
    поставленных задач. Основной задачей является достижение желаемо-
    го результата с минимальными затратами. Акцент всегда должен ста-
    виться на простоту,  ясность и удобочитаемость,  но эффективность
    может быть   достигнута  при использовании определенных стратегий
    программирования. Во многих случаях переорганизация процедуры по-
    вышает ее  эффективность за счет уменьшения размера,  и часто об-
    легчает ее понимание. В любом случае, вы можете не оптимизировать
    процедуры Shell,  пока они вас устраивают по быстродействию и ре-
    сурсов системы хватает для ее выполнения.
       Создание процедуры Shell состоит из таких же шагов, как и на-
    писание обычных программ:  написания текста, определения его раз-
    мера и  оптимизации только отдельных важных частей.  Пользователь
    должен уметь свободно пользоваться командой time,  которую  можно
    использовать для определения времени выполнения как всей процеду-
    ры, так и ее частей. Мы настоятельно рекомендуем пользоваться ей,
    т.к. человеческая интуиция непригодна для оценки времени выполне-
    ния программ.  Каждый тест должен быть  выполнен  несколько  раз,
    т.к. его    результаты  могут зависеть от загруженности системы в
    данный момент.

       Число генерируемых процессов

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

                                7-56


         break  case   cd         continue   echo
         eval   exec   exit       export     for
         if     read   readonly   return     set
         shift  test   times      trap       umask
         until  wait   while      .          :
         {}

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

       число процессов = (k*n) + c

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

                                7-57


       В качестве примера проанализируем процедуру с  именем  split,
    чей текст проведен ниже:

       :
       #     split
       trap 'rm temp$$; trap 0; exit' 0 1 2 3 15
       start1=0 start2=0
       b='[A-Za-z]'
       cat > temp$$
                #  read stdin into temp file
                #  save original lengths of $1,$2
       if test -s "$1"
       then start1=`wc -l < $1`
       fi
       if test -s "$2"
       then start2=`wc -l < $2`
       fi
       grep "$b" temp$$ >> $1
                #  lines with letters onto $1
       grep -v "$b" temp$$ | grep '[0-9]' >> $2
                #  lines without letters onto $2
       total=" `wc -l< temp$$` "
       end1=" `wc -l< $1` "
       end2=" `wc -l< $2` "
       lost=" `expr $total - \($end1 - $start1\)\
        - \($end2 - $start2\)` "
       echo "$total read, $lost thrown away"

       Для каждой итерации в цикле имеется одна команда expr и  либо
    команда echo или другая команда expr. Еще одна дополнительная ко-
    манда echo выполняется в конце процедуры. Если n - число строк на
    вводе, то количество процессов равно 2*n+1.
       Некоторые разновидности  процедур  не   следует   писать   на
    Shell'е. Так,  например, если с каждым символом файла связан один
    или несколько процессов, хорошим решением будет перенос процедуры
    на язык  Си.   Shell-процедуры не следует использовать для посим-
    вольного сканирования или посимвольного формирования файлов.

       Количество байтов данных

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

                                7-58


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

       sort file | grep pattern
       grep pattern file | sort

       Поиск в каталогах

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

       ls -l /usr/bin* >/dev/null
       cd /usr/bin; ls -l * >/dev/null

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

       Порядок поиска в каталогах и переменная PATH

       Переменная PATH  предоставляет удобный механизм для организа-
    ции процедур. Однако применять ее нужно с разумной осторожностью,
    иначе может произойти значительное увеличение дополнительных зат-
    рат системных ресурсов.
       Процесс нахождения  команды  заключается в чтении содержимого
    каждого каталога,  включенной в переменную PATH,  до тех пор пока
    не будет  найдена нужная команда.  В качестве примера рассмотрим,
    как вызывается nroff (предположим,  что команда находится в ката-
    логе /usr/bin), когда переменной PATH присвоено значение ":/bin:/
    usr/bin". Последовательность просмотра каталогов следующая:

       .
       /
       /bin
       /
       /usr
       /usr/bin

       В нашем  примере было просмотрено 6 каталогов.  Если же пере-
    менной PATH присвоен длинный список путей, то количество просмат-
    риваемых каталогов может значительно возрасти.

                                7-59


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

       :/usr/john/bin:/usr/localbin:/bin:/usr/bin
       :/bin:/usr/john/bin:/usr/localbin:/usr/bin
       :/bin:/usr/bin:/usr/john/bin:/usr/localbin
       /bin::/usr/bin:/usr/john/bin:/usr/localbin

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

       Правила создания каталогов

       Мы советуем вам не создавать каталогов больше,  чем вам необ-
    ходимо. Вы    должны знать,  что существуют несколько специальных
    размеров каталогов. Каталог, содержащий до 30 файлов (считая фай-
    лы .  и ..), умещается на одном блоке диска и может быть просмот-
    рен очень быстро.  Каталог,  содержащий до 286 файлов,  еще можно
    считать маленьким,  использование каталога большего размера в ка-
    честве рабочего уже связано с определенными неудобствами.  Мы  не
    советуем делать рабочие каталоги больше, чем стандартные. Особен-
    но важно сохранять загрузочный каталог маленьким, желательно раз-
    мером в 1 блок. Помните, что каталоги, как правило, не ужимаются.
    Если ваш каталог содержит более 30 или 286 файлов, то поиск будет
    выполняться неэффективно.  Более того, даже если вы удалите файлы
    так, что  их у вас станет меньше, чем указанные пределы, операци-
    онная система все равно будет просматривать каталог неэффективно.

                                7-60


       Примеры процедур Shell
       -------------------------------------------------------------


       Возможности командного языка Shell наиболее явно  чувствуются
    при виде того, как легко можно объединить много утилит для выпол-
    нения нужных команд.  В этом разделе приводятся примеры процедур.
    Изучая эти примеры, вы приобретете навыки программирования проце-
    дур Shell.  Обратите внимание на то, что все процедуры начинаются
    с команды (:), а символ # открывает строку комментариев.
       Для каждой процедуры надо выполнить следующие действия:
       1. Создайте файл с именем процедуры и запишите ее туда.
       2. Измените права доступа к файлу с помощью команды chmod.
       3. Переместите файл в каталог,  где хранятся команды,  напри-
          мер, в ваш bin.
       4. Убедитесь,  что в переменной PATH имеется имя вашего ката-
          лога bin.
       5. Выполните указанную команду.

       BINUNIQ

            :
            ls /bin /usr/bin | sort | uniq -d

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

                                7-61


       COPYPAIRS

            :
            #   Формат: copypairs file1 file2 ...
            #   Копирует file1 в file2, file3 в file4, ...
            while test "$2" != ""
            do
                 cp $1 $2
                 shift; shift
            done
            if test "$1" !=""
                 then echo "$0: odd number of arguments" >&2
            fi

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

       COPYTO

            :
            #   Формат:  copyto dir file ...
            #   Копирует перечисленные файлы в каталог "dir"
            #   при условии, что указано не менее двух
            #   аргументов, что "dir" является каталогом,
            #   и что каждый последующий аргумент
            #   представляет собой файл, доступный для чтения.
            if test $# -lt 2
                 then echo "$0: usage: copyto directory file ...">&2
            elif test ! -d $1
                 then echo "$0: $1 is not a directory";>&2
            else dir=$1; shift
                 for eachfile
                 do    cp $eachfile $dir
                 done
            fi

                                7-62


       Эта процедура  использует  команду  if для вывода сообщений о
    неправильном применении процедуры.  Цикл for  в  конце  процедуры
    просматривает все аргументы, кроме первого.

       DISTINCT1

           :
           #   Формат: distinct1
           #   Читает стандартный ввод и выводит список
           #   алфавитно-цифровых строк, различающихся только
           #   размером букв, представляя их в строчной форме
           tr -cs 'A-Za-z0-9' '\012' | sort -u |\
           tr 'A-Z' 'a-z' | sort | uniq -d

       Эта процедура является примером процесса, создаваемого конве-
    йером. Символ  \ в конце первой строки означает,   что  следующая
    строка является продолжением. На первый взгляд представляется не-
    ясным, как эта команда работает.  С принципами работы команд  tr,
    sort и  uniq  можно  ознакомиться в User's Reference.  Команда tr
    преобразует все символы,  кроме букв и цифр,   в  символы  "новая
    строка", после чего уплотняет повторяющиеся символы. В результате
    каждый набор литер окажется в отдельной строке. Команда sort сор-
    тирует строки  и  оставляет из любой последовательности повторяю-
    щихся строк только одну строку.  Следующая команда tr преобразует
    все буквы в строчные, делая тем самым идентификаторы, отличающие-
    ся лишь величиной букв, одинаковыми. Вывод вновь сортируется, все
    дубликаты собираются вместе. Команда "uniq -d" формирует перечень
    строк, встречающихся в тексте более одного раза.
       Процесс построения  подобного конвейера основан на том факте,
    что каналы и файлы могут взаимозаменяться.  Первая из  нижеприве-
    денных строк  эквивалентна  двум  последующим при условии наличия
    достаточного дискового пространства:

       cmd1 | cmd2 | cmd3
       cmd1 > temp1; < temp1 cmd2 > temp2; < temp2 cmd3
       rm temp[123]

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

                                7-63


       DRAFT

           :
           #   Формат: draft file(s)
           #   Вывод страниц на принтер.
           for i in $*
                do nroff -man $i | lpr
           done

       Пример использования  явных  флагов,   не имеющих значений по
    умолчанию.

       EDFIND

           :
           #   Формат: edfind file arg
           #   Ищет последнее появление в файле "file" строки,
           #   начинающейся с подстроки "arg", после чего
           #   выводит 3 строки (предыдущую, найденную,
           #   последующую)
           ed - $1 << -EOF
                 ?^$2?
                 -,+p
                 q
           EOF

       Иллюстрация использования команды ed для  редактирования  ис-
    ходных текстов,   в  которых Shell выполняет подстановку значений
    переменных.

                                7-64


       EDLAST

           :
           #   Формат: edlast file
           #   Выводит последнюю строку файла
           #   и удаляет ее.
           ed - $1 << -\!
                 $p
                 $d
                 w
                 q
           !
           echo done

       Иллюстрация считывания  данных  из  файла до восклицательного
    знака.

       FSPLIT

          :
          #    Формат: fsplit file1 file2
          #    Чтение стандартного ввода и разбиение его на 3 части
          #    с добавлением строки, содержащей не менее одной буквы,
          #    к файлу file1, добавления другой строки с цифрами, но
          #    без букв к файлу file2, и сбрасыванием остального.
          count=0 gone=0
          while read next
          do
             count="`expr $count +1`"
             case "$next" in
             *[A-Za-z]*)
                  echo "$next" >> $1 ;;
             *[0-9]*)
                  echo "$next" >> $2 ;;
             *)
                  gone="`expr $gone + 1`"
             esac
          done
          echo  "$count lines read, $gone thrown away"

       На каждой итерации цикла из вводного потока считывается стро-
    ка и анализируется.  Цикл завершается только тогда, когда команда
    read обнаружит  конец  файла.  Обратите внимание на использование
    команды expr.

                                7-65


       LISTFIELDS

          :
          grep $* | tr ":" "\012"

       Эта процедура выводит в виде строк свой аргумент. Она заменя-
    ет каждый символ ":" на символ новой строки. Так, если в качестве
    аргумента указать:

          joe newman: 13509 NE 78th St: Redmond, Wa98062

    то эта процедура выведет:

          joe newman
          13509 NE 78th St
          Redmond, Wa98062

       MKFILES

          :
          #    Формат: mkfiles pref [quantity]
          #    Создает файлы "quantity".
          #    По умолчанию - 5, как показано на следующей строке.
          quantity=${2-5}
          i=1
          while test "$i" -le "quantity"
          do
              > $1$i
              i="`expr $i + 1`"
          done

       Процедура mkfiles использует переадресацию вывода для  созда-
    ния файлов нулевой длины.  Команда expr используется для подсчета
    числа итераций в цикле while.

                                7-66


       NULL

         :
         #   Формат: null files
         #   Создает каждый из указанных файлов как пустой.
         for eachfile
         do
            >$eachfile
         done

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

       PHONE

         :
         #   Формат: phone initials ...
         #   Вывод номеров телефонов людей с
         #   указанными инициалами.
         echo 'initsext home'
         grep "$1" <<END
               jfk  1234  999-2345
               lbj  2234  583-2245
               hst  3342  988-1010
               jqa  4567  555-1234
         END

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

                                7-67


       TEXTFILE

          :
          if test "$1"= "-s"
          then
          #    Возвращает код завершения
               shift
               if test -z "`$0 $*`" # проверка возвращаемого значения
               then
                      exit 1
               else
                      exit 0
               fi
          fi
          if test $# -lt 1
          then echo  "$0: Usage: $0 [ -s ] file ..." 1>&2
               exit 0
          fi
          file $* | fgrep 'text' | sed 's/:.*//'

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

          pr `textfile *` | lpr

       В процедуре используется флаг -s,  отбирающий из списка текс-
    товые файлы.

       WRITEMAIL

          :
          #   Формат: writemail message user
          #   Если пользователь зарегистрировался,
          #   сообщение выводится на терминал;
          #   в противном случае, посылается пользователю.
          echo "$1" | { write "$2" || mail "$2" ; }

       Иллюстрация использования командной группировки.   Сообщение,
    обозначенное как "$1", передается команде write, и, в случае неу-
    дачного завершения последней, команде mail.

                                7-68


       Синтаксис Shell
       -------------------------------------------------------------


       элемент: слово
                ввод-вывод
                имя = значение

       простая-команда: элемент
                элемент простой-команды

       команда: простая-команда
                ( список-команд )
                { список-команд }
                for имя do список-команд done
                for имя in слово do список-команд done
                while список-команд do список-команд done
                until список-команд do список-команд done
                case слово in case-часть esac
                if список-команд then список-команд else-часть fi

       конвейер: команда
                конвейер | команда

       andor:   конвейер
                andor && конвейер
                andor || конвейер

       список-команд: andor
                список-команд ;
                список-команд &
                список-команд ; andor
                список-команд & andor

       ввод-вывод: > файл
                < файл
                << слово
                >> файл
                цифра > файл
                цифра < файл
                цифра >> файл

                                7-69


       файл:    слово
                & цифра
                & -

       case-часть: шаблон ) список-команд ;;

       else-часть: elif список-команд then список-команд else-часть
                else список-команд
                пустая-строка

       пустая-строка:

       слово:   последовательность символов кроме пробелов

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

       цифра:   0 1 2 3 4 5 6 7 8 9

       Метасимволы и зарезервированные слова

       1. Синтаксические

       |        символ канала
       &&       символ и-если
       ||       символ или-если
       ;        разделитель команд
       ;;       разделитель регистров
       &        фоновые команды
       ()       группирование команд
       <        перенаправление ввода
       <<       ввод из документа
       >        создание вывода
       >>       добавление к выводу
       #        комментарий в конце строки

    2. Шаблоны

    последовательность
    значение
    * отображает любой символ(ы) включая и его отсутствие
    ? отображает любой одиночный символ
    [...] отображает любые символы в скобках

    3. Подстановки

    последовательность
    значение
    ${...} подстановка переменной оболочки
    `...` подстановка вывода команд

    4. Квотирование

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

    5. Зарезервированные слова

     if esac
     then for
     else while
     elif until
     fi do
     case done
     in {}
    



    Ссылка на обсуждение: http://forum.lissyara.su/viewforum.php?f=32.



  • Хостинг HOST-FOOD

    2014-07-27, lissyara
    gmirror

    Удалённое создание софтверного зеркала средствами gmirror, на диске разбитом с использованием gpart. Использование меток дисков для монтирования разделов.
    2013-08-20, zentarim
    Scan+Print server FreeBSD 9

    Настройка сервера печати и сервера сканирования под управлением операционной системы FreebSD 9 для МФУ Canon PIXMA MP540
    2011-11-20, BlackCat
    Разъём на WiFi-карту

    Делаем съёмной несъёмную антену на WiFi-карте путём установки ВЧ-разъёма
    2011-09-14, manefesto
    Настройка git+gitosis

    Настройка системы контроля версия исходного кода в связке git+gitosis+ssh
    2011-08-14, zentarim
    Wi-FI роутер + DHCP + DNS

    Настройка Wi-Fi роутера на Freebsd 8 + DNS сервер + DHCP сервер: чтобы Wi-Fi клиенты были в одной подсети с проводными, проводные и беспроводные клиенты получали адреса автоматически по DHCP, кэширующ
    2011-06-15, -ZG-
    Охранная система на FreeBSD+LPT

    В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт и видеорегистрацией.
    2011-03-13, terminus
    ng_nat

    Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
    2011-02-20, Капитан
    Nagios+Digitemp

    Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
    2011-02-17, Le1
    Zyxel Configuration

    Скрипт для массового изменения конфига свичей Zyxel. Берет из файла iplist список ip-шек, заходит последовательно на каждый и выполняет комманды из файла commands, записывая происходящее в лог файл.
    2011-02-16, fox
    hast carp zfs ucarp cluster

    HAST (Highly Available Storage), CARP, UCARP, ZFS, Cluster настройка и одаптация плюс личные размышления…
    2011-02-04, BlackCat
    Восстановление ZFS

    История о том, как был восстановлен развалившийся RAIDZ ZFS-пул (перешедший в FAULTED) с помощью скотча и подручных средств. Или о том, какие приключения ожидают тех, кто не делает резервных копий.
    2011-02-03, Капитан
    1-Wire

    Статья описывает самостоятельное изготовление контроллера DS9097 для съёма показаний с датчиков температуры DS1820 с помощью программы Digitemp.
    2011-01-28, Капитан
    Температура в серверной

    Статья описывает построение системы наблюдения за температурой в помещении серверной с использованием программы Digitemp и выводом графиков в MRTG
    2011-01-21, m4rkell
    Syslog server

    Как то буквально на днях, у нас завалилось, что то в еве) или не в еве не суть. Суть в том, что когда захотели снять логи с хостов esx обнаружили, что хранят эти негодяи логии только за последнии сутк
    2011-01-11, Fomalhaut
    cvs, svn, portsnap

    Обновление сорцов системы через CVS и SVN, портов - CVS и portsnap. Обновление через Proxy-сервер.
    2011-01-07, lissyara
    Canon/gphotofs

    Монтирование цифровых фотоаппаратов Canon (PTP) как файловой системы, автоматизация этого процесса через события devd и внешние скрипты.
    2010-12-13, Al
    IPSec

    Описание принципов работы IPSEC и способов аутентификации.
    2010-12-07, manefesto
    FreeBSD on flash

    Было принято решении переехать на USB Flash и установить минимальный джентельменский набор для работы своего роутера. Делаем =)
    2010-12-05, Fomalhaut
    root ZFS, GPT

    Инструкция по установке FreeBSD с использованием в качестве таблицы разделов GPT и в качестве основной файловой системы - ZFS
    2010-09-05, Cancer
    Настройка аудиоплеера на ximp3

    Цели: Простенький аудиоплеер, для того что бы тетя продавец в магазине утром пришла нажала на кнопку Power и заиграла в зале музыка, так же был доступ по сети, общая шара куда можно заливать музыку, к
    2010-08-31, Cancer
    Установка и настройка OpenVPN

    На днях появилась задача - объединить головной офис и 3 филиала в одну сеть через интернет посредством OpenVPN, чтобы люди могли подключаться через RDP к базам 1С на серверах.
    2010-08-25, manefesto
    freebsd lvm

    Использование linux_lvm для работы с LVM разделами из-под FreeBSD. Проблемы которые возники при монтирование lvm раздела
    2010-04-30, gonzo111
    proftpd file auth&quota

    Proftpd - квоты и авторизация из файлов, без использования базы данных и/или системных пользователей
    2010-04-22, lissyara
    tw_cli

    Пошаговая инструкция по восстановлению RAID на контроллере 3ware, из которого выпал один диск. Настройка мониторинга состояния рейда и отчётов о его состоянии на email.
    2010-04-14, fox
    MySQL Master+Master

    MySQL (Master Master) and (Master Slave) Как настроить репликацию…
    2010-03-22, Mufanu
    named 9.7.0

    Система доменных имен (Domain Name Service, DNS) - одна из тех незаметных, закулисных программ, которым не уделяется и половины того внимания, которого они заслуживают.
    2010-03-09, terminus
    DNS zones

    Краткий ликбез про управление DNS зонами. Примеры проведения делегирования прямых и обратных DNS зон.
    2010-03-09, aspera
    Squid+AD (group access)

    Настройка прокси сервера SQUID с автроризацией пользователей в AD. Разделение пользователей на группы
    2010-03-02, BlackCat
    Шлюз: Часть 4

    Настройка дополнительных сервисов: синхронизация времени (OpenNTPD), клиент DynDNS.org.
    2010-03-01, BlackCat
    Шлюз: Часть 3

    Настройка DHCP и DNS серверов для работы внутри частной сети, c поддержкой внутренних (частных зон) DNS, а так же интеграция DHCP и DNS сервисов.
    2010-03-01, BlackCat
    Шлюз: Часть 2

    Конфигурация МСЭ pf для проброса портов с изменением порта назначения и без, а так же поддержки активного режима FTP и ограничения максимального размера сегмента
    2010-03-01, BlackCat
    Шлюз: Часть 1

    Быстрая настройка шлюза/маршрутизатора с установлением PPPoE-соединения, поддержкой NAT и DNS-forwarding.
    2010-02-23, Morty
    darkstat

    Простая считалка траффика, со встроенным веб-сервером. Очень маленькая, может делать отчеты трафика по хостам, портам, протоколам, а также строить графики
    2010-01-23, gonzo111
    squid+sams+sqstat

    Пилим squid и sams - примеры конфигов с объяснениями. Установка SqStat.
    2009-12-19, schizoid
    mpd5 + radius + ng_car + Abills

    Настройка pppoe-сервера с биллинговой системой Abills и шейпером ng_car
    2009-11-16, lissyara
    UFS->ZFS

    Удалённая миграция с UFS на ZFS. Загрузка с раздела zfs. Настройка для работы с малым количеством памяти под архитектурой i386.
    2009-11-13, gx_ua
    fusefs-ntfs

    Установка, настройка и использование fusefs-ntfs, драйвер NTFS, предназанченного для монтирования NTFS разделов под FreeBSD
    2009-11-12, Morty
    LiveCD

    Создание собственного LiveCD с необходимыми вам изменениями, автоматизирование данного процесса, а так же вариант скоростной сборки СД.
    2009-09-27, lissyara
    Samba как PDC

    Контроллер домена - аналог M$ NT4 домена под самбой, без использования LDAP и прочей хиромантии. Просто и быстро =)
    2009-08-30, terminus
    ipfw nat

    Подробное руководство по ipfw nat, сложные случаи конфигурации.
    2009-08-24, levantuev
    HotSpot

    Установка Hotspot системы в общественное заведение.
    2009-08-18, lissyara
    diskless

    Создание бездисковых терминалов под управлением FreeBSD - с загрузкой по сети. Используются для старта rdesktop и подключения к виндовому серверу терминалов.
    2009-07-29, BAV_Lug
    Видеонаблюдение

    Настройка бюджетного варианта видеонаблюдения на удаленном объекте
    2009-07-22, Cancer
    OpenLDAP адресная книга

    Настройка и создание адресной книги на базе OpenLDAP + phpLDAPadmin
    2009-06-30, SergeySL
    AimSniff

    Руководство по созданию системы мониторинга ICQ-переписки на базе AimSniff, использующей базу данных MySQL для хранения и Web-интерфейс WAS (Web Aim Sniff) для просмотра перехваченных сообщений
    2009-06-25, atrium
    Управление правами доступа

    Полномочия пользователей и файлов, принадлежащих им, формирует концепцию ОС UNIX.
    2009-06-16, DNK
    Exim+PgSQL

    Установка почтовой системы exim+pgsql на FreeBSD 7.1
    2009-05-30, mvalery
    HDD(mbr) -> HDD(gpt)

    Как разбить диск размером более 2TB на разделы, сделать загрузочным, а затем перенести на него информацию с рабочей системы — донора.
    2009-05-22, Cancer
    SendXMPP

    Отправка сообщений на Джаббер сервер по средствам SendXMPP
    2009-05-11, Raven2000
    Network UPS Tools

    Network UPS Tools представляет собой набор программ, которые обеспечивают общий интерфейс для мониторинга и администрирование UPS оборудования.
    2009-04-29, m0ps
    IPSEC over GRE with RIP

    Пример IPSEC over GRE и динамическим роутингом (RIP), с ADSL в качестве последней мили на оборудовании Cisco.
    2009-04-24, WhiteBear777
    qemu network

    Появилась необходимость поставить на БСД эмулятор(qemu) и настроить в качестве гостевой ОС Windows XP, предоставив ей выход в локалку и в сеть internet...
    2009-04-22, vp
    freebsd + huawei 162 gsm modem

    В статье описывается простой способ подключения модема huawei 162 к freebsd + первичная настройка smstools
    2009-04-12, mvalery
    Мониторинг RAID

    Мониторинг из командной строки RAID компаний AMCC 3ware, HighPoint, Dell (Perc 5/i и PERC 6/i) и LSI (MegaRAID SAS 8408E и SAS1078)
    2009-04-09, texnotronic
    RAID1 via LAN

    Функциональности DRBD во FreeBSD можно добиться примонтировав блочное устройство по сети при помощи GEOM Gate (ggate) и добавив его в зеркало с локальным диском средствами gmirror.
    2009-04-03, Raven2000
    Оптимизация хоста для CMS

    В последнее время на старый и не очень быстрый ПК (Celeron 800 RAM 256) мною было навешано с десяток сайтов и некоторые были из серии тяжелых CMS. И так нам дано FreeBSD 7.1 и ~10 сайтов/CMS.
    2009-04-01, atrium
    VSFTPD + AD && MySQL

    Настройка самого безопасного сервера FTP - vsftpd.
    2009-03-31, Dron
    Peoplenet + C-motech (3G)

    Описание подключения к сети Peoplenet посредством 3G модема С-motech CCu-650U на FreeBSD
    2009-03-25, lissyara
    mod_auth_external

    mod_auth_external - авторизация пользователей в apache c помощью внешней программы - например, системных пользователей.
    2009-03-24, gx_ua
    Lightsquid

    Частично lightsquid может заменить sams: быстрая и простая инсталляция, быстрый парсер, cgi скрипт для динамической генерации отчета, нет привязки к БД, различные графические отчеты, мультиязычный инт
    2009-03-18, LHC
    Установка Zabbix-1.6

    Установка и первоначальная настройка системы мониторинга Zabbix (версия 1.6)
    2009-03-16, Cancer
    Принт-Сервер Samba+LPD & AD

    Простейшая настройка Принт-Сервера на FreeBSD используя Samba+LPD & AD
    2009-03-04, Mad_caterpillar
    ipsec_vpnc

    Настройка VPN IPSec концентратора на FreeBSD 6.2 для клиента cisco с использованием ipsec-tools и авторизацией в активной директории
    2009-02-18, Andy
    Free-SA

    Программа анализирует log файлы Squid'а и формирует по ним отчет.
    2009-02-02, Cancer
    Openfire Jabber Server

    Установка Jabber сервера на примере Openfire
    2009-01-28, Cancer
    mpd5 + сжатие и шифрование

    Установка VPN сервера mpd5 + сжатие и шифрование
    2009-01-26, vp
    freebsd + webcamera

    Подключение и настройка вебмкамеры для работы с freebsd на примере Logitech QCam STX
    2009-01-10, Grishun_U_S
    конфиг для офисов

    В статье разбирается конфиг для офиса, пользователи которого имеют строгие ограничения по портам. Заворачиваем www трафик на транспарентный прокси, а остальное NAT'им. Эффективно делим канал интернет
    2008-12-27, Storoge
    sftp+chroot

    Возникла необходимость дать возможность нескольким пользователям заливать на сервер контент для своих сайтов через sftp, чтобы при этом не страдала безопасность.
    2008-12-13, Morty
    PurefFTPd

    Администрирование pureftpd-сервера с помощью вэб интерфейса Usermanager
    2008-12-11, lissyara
    termlog

    Небольшая простая утилита, использующаяся для записи в файл всего что происходит на терминалах системы. Полезно, когда есть доступ по ssh у тех, кому не очень доверяете. Паранойя - это не плохо =)
    2008-11-26, Cancer
    SQUID+SAMS +Rejik-(ADLDAP)

    Установка Прокси сервера SQUID с красивой мордой SAMS и редиректором REJIK,для учета кто куда ходил + графики в pdf,РЕЖИК собственно рубит банеры и запрещает пользователям ходить на запрещенные сайты,
    2008-11-22, dvg_lab
    php5-oci8

    Решение проблем segmentation fault (core dumped) при работе с oracle8-client и php5-oci8
    2008-11-21, m0ps
    NTP

    Пример настройки NTP сервера для локальной сети и клиента, для синхронизации времени с локальный NTP сервером. Обновление ntpd из портов.
    2008-11-20, Cancer
    SQUID+SAMS +Rejik-(NTLM)

    Установка Прокси сервера SQUID с аутентификацией по NTL с красивой мордой SAMS и редиректором REJIK,для учета кто куда ходил + графики в pdf, РЕЖИК собственно рубит банеры и запрещает пользователям хо
    2008-11-20, UA
    Hotspot

    Настройка безпроводной точки доступа (WiFi) на freebsd
    2008-11-12, Shaman
    Enemy Territory

    Появилась у меня такое желание поднять сервер Enemy Territory. Поискал погуглил, ничего толкового не нашел пришлось все самому делать. И вот решил поделиться опытом. Начинаем......
    2008-11-11, lissyara
    Samba+ NT ACL

    Использование vfs самбы - модули full_audit и recycle. Настройка для использования в качестве файлопомойки с 500+ одновременно работающих юзеров. Раздача прав через нативный виндовый интерфейс.
    2008-11-11, Raven2000
    Upgrading OpenBSD

    Сегодня мы будем обновлять OpenBSD. Систему необходимо поддерживать в актуальном виде и следить, чтобы все работало, как часы и все дырки были залатаны до прихода врага =)
    2008-11-10, lexy
    SMSTools 3

    Как автоматизировать отправку и обработку входящих сообщений при помощи мобильного телефона, датакабеля и компа
    2008-11-06, Cancer
    Asterisk IP PBX

    Установка VoiP сервера Asterisk IP PBX для соединения двух шлюзов и АТС
    2008-10-30, atrium
    Samba & CUPS & AD & ACL

    Настройка Samba в роли доменного файл-сервера, и CUPS в роли принт-сервера для Windows клиентов
    2008-10-17, Raven2000
    src & ports

    Конечно, в OpenBSD система портов никогда не сможет быть полной сравнение с той же системой во FreeBSD. Связано это с тем, что разработчики включают в порты лишь те приложение которые протестированн
    2008-10-13, Morty
    Mysql - базовое описание

    Базовое описание и принципы работы с MySQL
    2008-10-10, Cancer
    exim&dovecot + fetchmail + SSL

    Exim & Dovecot + Postfixadmin & Roundcube + Fetchmail & smtp_relay С возможностью отправлять письма через смтп релей провайдера. С использование SSL шифрование: POP3s IMAPs sSMTP
    2008-10-09, m0ps
    Дополнительные порты для роутера

    Увеличение количества Ethernet портов маршрутизатора за счет свободных портов коммутатора пробросив vlan с сабинтерфейса роутера на интерфейс коммутатора.
    2008-10-06, princeps
    Bacula

    Настройка сервера системы резервного копирования Bacula на FreeBSD для бэкапов FreeBSD и Windows машин
    2008-10-02, zheromo
    Postfix + DBMail

    Создание почтовой системы на основе Postfix + DBMail + SASL2 + TLS + DSpam + ClamAV + RoundCubeWebMail
    2008-10-02, Cancer
    SugarForge CRM

    SugarForge CRM предоставляет подавляющее большинство функциональных возможностей CRM систем
    2008-09-12, arksu
    ng_ipacct + squid

    Подсчет трафика с помощью ng_ipacct. Связка ng_ipacct + squid + парсер логов + авторизатор + nginx + mysql и куча служебных скриптов для работы всей системы.
    2008-09-03, Raven2000
    GLPI

    Мне надо было найти замену существующей программы инвентаризации, чтобы за компьютерами, принтерами, картриджами, лицензиями и тп был учет. Желательно с дополнительными бонусами типа системы подачи...
    2008-09-03, salimk
    POWERDNS

    Статья о том как мигрировать с DNS сетвера ISC Bind на POWERDNS
    2008-09-03, DNK
    Rinetd

    Редирект TCP портов с помощью утилиты rinetd - просто до безобразия - само прилодение простое, конфиг в одну строчку - что ещё надо для счастья? =)
    2008-09-03, L!Ner
    eGroupWare

    Это сервер групповой работы. Он укомплектован собственным веб-интерфейсом, который обеспечивает доступ к вашим данным с любой платформы по всей планете.
    2008-08-30, jafff
    MAC адрес

    У девайса VoIP Planet VIP-000 слетел MAC адрес и стал FF-FF-FF-FF-FF-FF, как я его востанавливал
    2008-08-30, Morty
    clonehdd

    Перенесение, бэкапирование HDD,легко и просто
    2008-07-31, Raven2000
    Proxy Auto Configuration

    Возникла необходимость автоматически настраивать прокси для всех компов и не бегать например если поменялось что-то на сервере прокси. Для этого давно существует технология Proxy Auto Configuration.
    2008-07-29, f0s
    NNTP сервер

    Конфигурирование собственного NNTP-сервера.
    2008-07-28, Al
    spamooborona

    настройка yandex spamooborona в качестве smtp-proxy для работы с exim
    2008-07-28, Cancer
    SQUID+SAMS +Rejik-(NCSA)

    Установка Прокси сервера SQUID с красивой мордой SAMS и редиректором REJIK,для учета кто куда ходил + графики в pdf,РЕЖИК собственно рубит банеры и запрещает пользователям ходить на запрещенные сайты,
    2008-07-20, Raven2000
    Pax

    Эта замечательная утилита поставляется с FreeBSD по умолчанию, и она имеет неплохой потенциал. Можно создавать архивы модифицировать их, а так же живьем переносить всю операционную систему с данными
    2008-07-16, Andy2k
    BIND & AD

    Настройка BIND для обслуживания запросов контроллеров Active Directory. Альтернатива поднятию DNS от Microsoft.
    2008-07-16, aleksey.kravchenko
    Samba (PDC+BDC)

    Поднять главный (офис) и резервный (филиал) контроллер домена на базе Samba и OpenLDAP, организовать синхронизацию и репликацию между ними. Запись в LDAP должена выполняться только на PDC.
    2008-07-14, aleksey.kravchenko
    OpenVPN + LDAP

    Статья о том, как настроить OpenVPN с авторизацией пользователей в OpenLDAP.
    2008-07-14, aleksey.kravchenko
    ProFTPd + LDAP

    ProFTPd с авторизацией пользователей в OpenLDAP
    2008-07-13, lissyara
    Asus Eee PC

    Дали на несколько дней поиграться Asus Eee PC - мелкий ноутбок по смешной цене. Ну, первым делом ставим правильный ОС и смотрим - что из этого получиться.
    2008-07-09, terminus
    DNS сервер Unbound

    Установка и настройка кеширующего DNS сервера Unbound под управлением FreeBSD 7.0
    2008-07-08, f0s
    mozilla autoconfig

    Автонастройка браузера и почты Mozilla Seamonkey пользователям
    2008-07-05, lissyara
    iftop

    Утилита предназначена для мониторинга загрузки канала в режиме реального времени - позволяет видеть кто именно занял полосу. Полезно для организаций с FreeBSD на шлюзовой машине.
    2008-07-02, manefesto
    snd_hda

    Патчим snd_hda для корректной работы с наушниками
    2008-06-27, Grishun_U_S
    dd : бэкапируем windows

    Клонирование разделов windows с помощью загрузочного диска FreeBSD
    2008-06-25, terminus
    DNS сервер NSD

    Установка и настройка авторитарного DNS сервера NSD под управлением FreeBSD 7.0
    2008-06-17, Al
    NetXtreme BCM5722

    Драйвер для сетевой карты NetXtreme BCM5722 Gigabit Ethernet
    2008-06-15, tango
    Amanda

    Установка и настройка сервера резервного копирования Amanda на FreeBSD.
    2008-06-12, LMik
    Виртуальный свитч

    Статья описывает создание виртуального коммутатора для соединения удаленных физических ethernet сетей.
    2008-06-08, littlesavage
    SiS*Mirage*1 на D201GLY2

    Как заставить работать видеоrарту SiS*Mirage*1 на материнской D201GLY2
    2008-06-06, nsand
    Рыбалка на FreeBSD

    Стьатья о том как настроить рыбалку со спутника под FreeBSD
    2008-06-06, nsand
    TT budget S-1401

    Настройка драйвера ttbudget (SkyStar3) под FreeBSD
    2008-05-30, Andy2k
    NOD32 mirror

    Скрипт для создания зеркала обновлений для антивируса NOD. Автоматически ищет нужные логин-пароль для получения обновлений. В теории не требует обслуживания.
    2008-05-25, Romzes
    метаданные exif

    Пример сортировки фотографий сделаных разными фотоаппаратами, с разными названиями, датами создания/модификации. Из под консоли, конечно.
    2008-05-23, FenX
    svn+apache+trac

    Установка связки Apache2.2 + Subversion + Trac (Установка и настройка SVN сервера с доступом к репозиториям по http протоколу)
    2008-05-22, Grishun_U_S
    простой конфиг PF

    В статье разбирается простой конфигурационный файл pf "изнутри можно все"
    2008-05-20, KrivoSoft
    HAVP

    HAVP(HTTP AntiVirus proxy)- работает как http прокси, проверяющий файлики используя LibClamav. В заметке описан процес прикручивания антивируса к уже работающему прокси серверу squid.
    2008-05-20, Covax
    ALTQ в IPFW

    Исполльзование ALTQ вместе с IPFW
    2008-05-19, nonalog2007
    pppoe

    Настройка ADSL-модема для подключения к Интернет.
    2008-05-04, Abigor
    php + mssql

    Настройка php на freebsd для работы с базами в mssql по доменной авторизации.
    2008-04-28, serge
    i386=>amd64

    Рассматриваеться способ удаленной миграции с архитектуры i386 на amd64 на рабочем сервере.
    2008-04-24, Mr.Y
    Lan over Bluetooth

    Статья описывает как используя Bluetooth, объединить две FreeBSD машины в сеть.
    2008-04-19, lissyara
    WiFi WPA

    Подключение FreeBSD к беспроводной WiFi сети с использованием шифрования WPA.
    2008-04-18, nikll
    nginx+php-fpm+mysql

    Статья о настройке мощного веб сервера который не ляжет от хорошей нагрузки.
    2008-04-16, nikll
    qmail-ldap + AD

    Статья о том как я прикрутил qmail к АД win2003 (с упровлением почтовыми аккаунтами через консоль mmc из под винды)
    2008-04-14, SHPAk
    Приглашение csh/tcsh

    Приглашение csh/tcsh не всегда удобно. Здесь описано как помянять оное...
    2008-04-07, inspirra
    deltup, xdelta, bdelta

    Некоторые тонкости создания бинарных патчей. И использование "The dynamic deltup server network" для экономии на обновлениях исходников программ устанавливаемых из портов.
    2008-04-02, fr33man
    exim + cyrus-imapd

    Руководство по настройке почтовой системы на базе OpenBSD-4.2: exim + cyrus-imapd + mysql
    2008-03-30, Morty
    LiveCD (+restore)

    LiveCD, который развернет мне на жёсткий диск готовую настроенную систему
    2008-03-25, lissyara
    BlueTooth mouse

    Краткое повествование о том, как привернуть BlueTooth мышь к FreeBSD. Краткое - потому как делается это с полпинка...
    2008-03-21, moonug
    ProFTPD+iconv

    Порт позволяющий включить перекодировку имён файлов в proftpd. Раньше для этого был патч, а щас всё поломали =))
    2008-03-11, helloworld
    vsftpd + mysql

    Настройка фтп сервера vsftpd с пользователями из mysql
    2008-03-06, Raven2000
    Call of Duty 4

    Call of Duty 4: Modern Warfare — компьютерная игра, продолжение серии COD, разработанное студией Infinity Ward. Это первая игра в серии, действие которой происходит не во время мировой войны.
    2008-03-04, schizoid
    NeTAMS 2

    Netams, статистика, биллинг, огрнаичение и подсчет трафика
    2008-03-04, schizoid
    NeTAMS

    Программа для учета и управления сетевым трафиком
    2008-03-01, Le1
    EA Battlefield 2 server

    Установка игрового сервера EA Battlefield 2 под ОС FreeBSD
    2008-02-25, dikens3
    Dynamic DNS

    Свой сервер с динамическим IP-Адресом.
    2008-02-23, fr33man
    squid ntlm

    Настройка Squid с аутентификацией ntlm, под OpenBSD. Решение проблем сборки с поддержкой АД.
    2008-02-18, lissyara
    BlueTooth

    Встала задача залить на Нокию гиг музыки через BlueTooth. ОС - правильный - FreeBSD, вот про то как это сделать из под неё - и рассказ. Также немного про нынешнее состояние дел с голубыми зубами =)
    2008-02-17, Raven2000
    NFS & Win2k3

    При работе с UNIX системами на предприятиях часто приходится организовывать совместную работу с Windows. Необходимо обеспечить взаимодействие UNIX<>WIN бывает, что доступ по FTP или др не устраивает.
    2008-02-14, Morty
    Lightsquid

    Снятие статистики с OOPS, SQUID с помощью lightsquid - нечто на подобии SARGa, и выполняет туже задачу, подбивает статистику пользования прокси сервером
    2008-02-14, Morty
    OOPS

    Краткое описание установки и настройки прозрачного прокси-сервера OOPS
    2008-02-12, fr33man
    Apache

    Настройка web-сервера apache, на базе OpenBSD. Нужен был web сервер. Стандартно нужно было ставить apache. Но я помнил, когда раньше работал с OpenBSD, что апач поставляется вместе с системой. Так
    2008-02-11, Raven2000
    Установка OpenBSD

    OpenBSD — свободная многоплатформенная операционная система, основанная на 4.4BSD — BSD-реализации UNIX системы. Основным отличием OpenBSD от других свободных операционных систем, базирующихся на
    2008-01-31, serge
    ApacheStats

    Сбор статистики с веб-сервера Apache в Cacti с использованием модулей mod_status и mod_info. Отображается число хитов в секунду, загрузка чилдренов и прочая полезная инфа.
    2008-01-30, Raven2000
    CVSUP и софт через Proxy

    При работе за прокси люди испытывают неудобство при обновление портов и установки портов. Хотя, наверное, догадываются, что FreeBSD может элегантно обходить эти камни, но не знают как.
    2008-01-25, nikll
    kde и smb

    статья о том как фрю сделать членом win2003 домена и о том как в кде 3.5 ходить по доменным шарам с нормальной русской кодировкой
    2008-01-21, Fastman
    Создание программ на QT4/С++

    Установка и настройка QT4. Пример создание приложения с GUI.
    2008-01-17, Morty
    stunnel для pop3,smtp

    Создание защищенного подключения для сервисов POP3, SMTP, Imap , www с помощью stunnel
    2008-01-09, lissyara
    Atheros AR5007EG

    Прикручивание карточки Atheros AR5007EG (в ноутбуке Toshiba L40-139) под FreeBSD.
    2008-01-04, LMik
    growfs

    Статья наглядно описывает изменение размера раздела диска в FreeBSD при помощи growfs, без потери данных находящихся на диске.
    2007-12-23, serge
    FreeBSD на VDS

    Рассматривается настройка FreeBSD6.2 на VDS с чистой ОС.
    2007-12-22, serge
    OTRS на Apache1

    Рассматривается установка Open Ticket Request System для работы на хостинг сервере в связке apache1.3 + mod_perl + mysql50.
    2007-12-11, INFected
    SkyStar-2+SlonAx

    Встала задача организовать прием трафика от спутникового провайдера. Естественно на раздающем сервере должна быть FreeBSD. А как же иначе?
    2007-12-08, netcat
    GEOM-ELI

    Шифрование файловых систем посредством класса GEOM-ELI
    2007-12-07, helloworld
    PVPGN

    Настройка сервера Battle.net в небольшой локальной сети.
    2007-12-06, seacon
    ESET NOD32

    Описание настройки антивирусной системы NOD32 ESET File Security
    2007-11-23, azu
    Bluetooth proximity monitor

    Описание и скрипты для отслеживания удаленности bluetooth устройства.
    2007-11-19, catdog_
    verlihub (p2p)

    описывается, как установить, настроить p2p-сервер и как им управлять
    2007-11-14, UA
    OpenVPN

    руководство по настройке openvpn между FreeBSD и Windows
    2007-11-11, AlkoGekS
    atacontrol

    Проверка работы raid-1 с помощью штатной утилиты atacontrol на freebsd 6.2
    2007-11-08, Raven2000
    Transport Tycoon Deluxe

    Transport Tycoon Deluxe (сокращенно - TTD) - экономическая транспортная стратегия, в которой целью игрока является создание максимально доходной транспортной империи.
    2007-11-06, lissyara
    squid+AD

    Инструкция - как авторизовать пользователей в домене, разделив доступ к ресурсам по виндовым группам - кому куда можно, а кому нельзя, с использованием squid2.6. Ну и объяснение - почему пока не 3.0.
    2007-11-03, schizoid
    icecast2

    Вещание интернет радио в локальной сети с помощью icecast2
    2007-11-02, AlkoGekS
    RoundCube

    Возникла необходимость перевести пользователей с squirrelmail на roundcube, завязать все это хотелось на postgresql, чтобы и в ней разобратьс заодно.
    2007-10-30, SniZ
    queues

    Краткая заметка по использованию очередей В IPFW
    2007-10-29, s@sh@
    LACP и VLAN

    Описание настройки LACP отдельно и совместно с VLAN во FreeBSD 7.0
    2007-10-26, Al
    portaudit

    Эти приложение используется для контроля уязвимостей и обновления приложений, установленных из портов.
    2007-10-24, -cat-
    Заметки об IPFW

    Заметки о настройке IPFW, подключение IPFW и NATD, принцип взаимодействия, принципы построения правил IPFW.
    2007-10-23, Raven2000
    X-Bomber

    Представляю вниманию отличную аркаду которая скрасит наш быт и существование в офисном пространстве именуемая как "работа" И так прошу любить и жаловать X-Bomber
    2007-10-22, Raven2000
    TeamSpeak

    Teamspeak (тимспик) — семейство программ, предназначенных для общения голосом в сети. От классического телефона отличается практически неограниченным количеством абонентов, разговаривающих одноврем
    2007-10-22, RageLT
    Nginx+php+fcgi

    "Nginx + PHP + Spawn-fcgi" - установка nginx под FreeBSD и настройка для выполнения PHP скриптов.
    2007-10-20, dikens3
    UFS2

    Как устроена UFS2. Небольшой взгляд изнутри.
    2007-10-19, Al
    Nagios - мониторинг сети

    настройка мониторинга сети с использованием Nagios
    2007-10-19, BlackCat
    FFS из-под WinXP

    Описание програмки для чтения BSD разделов под Windows. К сожалению, диск подключается в режиме только чтения - но и это уже неплохо.
    2007-10-14, dikens3
    recovery files

    Восстановление файлов на FreeBSD с использованием foremost, sleuthkit, photorec. Немного теории о хранении файлов на диске.
    2007-10-05, lissyara
    ClamAV mirror

    Понадобилось создать внутри локальной сети зеркало обновлений ClamAV, c учётом того, что разработчики это не привтствуют - пришлось изобретать подпорки и велосипеды.
    2007-10-04, SeeD
    irc + services

    Установка irc сервера (unreailircd) + сервисов (anope) на FreeBSD 6.0. Приведён тот необходимый минимум, который вполне подойдет для одиночных серверов.
    2007-10-04, lissyara
    установка по сети

    Столкнувшись с невозможностью поставить FreeBSD на старенький ноут с CD-ROM (толи диск царапаный, толи чё), пришлось изгаляться с установкой по сети - благо на нём был PXE у встроенной сетевухи.
    2007-10-04, Al
    cups-samba на samba+AD

    Пример настройки сервера печати с использованием CUPS, Samba и AD. Пример установки и настройки клиентских (для винды) драйверов принтера на сервер с использованием порта cups-samba.
    2007-10-03, schizoid
    ipcalc

    Скрипт для вычисления широковещательного адреса, диапазон хостов, шаблон сетевой маски по полученному IP и сетевой маске. Может использоваться для конструирования сетей и подсетей, а также в обучающих
    2007-09-26, lissyara
    немного о ssh

    Краткое описание как пробросить порты с удалённой локальной сети на локальную машину при помощи ssh. Может быть полезным, когда нет VPN в удалённую сеть, а есть ssh, и нужен доступ к какому-то сервису
    2007-09-26, SniZ
    mod_ntlm2

    mod_ntlm2 - модуль для apache22, позволяющий прозрачно авторизовать пользователя использую его доменную учетную запись. Удобно, если необходимо сделать ограниченный доступ к содержимому корпоротивного
    2007-09-18, lissyara
    klaptopdaemon

    даемон KDE для мониторинга состояния батареи ноутбука. Наверное, самое удобное и функциональное из того, что я перебрал.
    2007-09-17, bisyarin
    Удаленное разбиение HDD

    В статье рассмотрен пример удаленной доразбивки винчестера. Показан путь решения задачи как с использованием sysinstall, так и с помощью утилит fdisk, bsdlabel и newfs.
    2007-09-14, freeman_tnu
    DSL-G804V и FreeBSD 6.2

    Настройка VPN-туннеля между D-Link DSL-G804V и FreeBSD 6.2
    2007-09-13, lissyara
    KNemo

    Служба KDE отображающая в трее значка сетевого подключения, с богатым функционалом - позволяет собирать статистику, строить графики, выполнять скрипты при изменении статуса сетевого подключения.
    2007-09-12, lissyara
    desktopbsd-tools

    Набор утилит для упрощения жизни под KDE. Включают в себя утилиты трея для слежения за сетью, монтирования/ демонтирования, информацию о заряде батереи. Также несколько апплетов для контрольной панели
    2007-09-06, lissyara
    nettop

    Приложение позволяющее отслеживать сетевую активность по портам-протоколам, и отображать скорость передачи данных по этим портам и протоколам. Весьма удобно для наблюдения - что происходит на сервере.
    2007-09-04, squid
    sshd & AD

    Использование одной учетной записи на FreeBSD и Windows - используя AD для авторизации пользователей по ssh
    2007-09-02, lissyara
    ISPmanager

    Краткое описание того, как заменить дефолтовый майлер на ISPmanager, если он у вас - sendmail. Может пригодится тем кто берёт виртуальный сервер, и хочет большей гибкости в настройке.
    2007-08-25, serge
    mod_ntlm

    mod_ntlm - модуль для apache13, позволяющий прозрачно авторизовать пользователя использую его доменную учетную запись. Удобно, если необходимо сделать ограниченный доступ к сайту.
    2007-08-15, lissyara
    colorize

    colorize - утилита для подсветки ключевых слов в просматриваемых логах. Весьма удобно - становится более понятно и доходчиво, тока временами слишком уж пёстро :)))
    2007-08-13, Raven2000
    Документация на Unix

    Здесь представляем список необходимой документации для чтения и полного освоения FreeBSD как основной серверной операционной системы. И не только ее.
    2007-08-06, lissyara
    QTFW

    Графический интерфейс для составления и редактирования правил файрволла IPFW - абсолютно бесполезная приблуда...
    2007-08-01, Raven2000
    Counter-Strike 1.6

    По просьбам трудящихся, точнее по их заявлениям, о том что нужна им Counter-Strike 1.6 хоть "убейся об стену". Решил разобраться, наконец, с этим вопросом, что и сделал. И так поехали. :)
    2007-07-31, f0s
    LDAP: samba, dns, dhcp

    Настраиваем PDC на самбе, все данные в LDAP. Попутно вешаем DDNS+DHCP - их данные тоже храним в LDAP.
    2007-07-27, lissyara
    root-tail

    Практически бесполезное, но довольно забавное приложение, показывающее логи на рабочем стол. Может пригодится лишь если на ваш десктоп логи передаются с удалённых хостов.
    2007-07-27, lissyara
    laptop battery

    Краткий обзор программ мониторинга состояния заряда батареи ноутбука - что можно использовать на FreeBSD7.0 (CURRENT) и AMD64.
    2007-07-24, Raven2000
    phpBB-2/3

    phpBB – это мощное, полностью масштабируемое и легко изменяемое программное обеспечение с открытым исходным кодом для создания конференций. Основанный на мощном языке PHP и имеющий поддержку серверов
    2007-07-23, lissyara
    apache 2.0

    Настройка WEB-сервера на apache2 и php в режиме CGI с использованием mod_fastcgi.
    2007-07-15, lissyara
    geom_uzip

    Создание образа сжатой ФС с загрузкой по сети - данный метод может использоваться для создания загрузочных дисков/сидюков и прочего - на машинах где мало оперативки, например...
    2007-07-06, bdmalex
    2 CD -> 1 DVD

    FreeBSD: Заменим 2 инсталляционных диска на 1 DVD.... чтобы коллекцию дисков уменьшить....
    2007-07-04, Andy
    NSPluginWrapper

    Перевод с французского очень хорошего мануала, досконально объясняющего, как инсталлировать линуксовые плугины для firefox, используя NSPluginWrapper. В том числе и 9-й flash.
    2007-07-01, lissyara
    sshit

    Перловый скрипт мониторящий попытки подбора паролей для ssh/ftp в режиме реального времени, и блокирующий атакующего используя файрволл - pf/ipfw/ipfw2 - просто и со вкусом :)
    2007-06-19, Raven2000
    CMS - TYPO3

    Ставим CMS TYРOЗ - Корпоративная система управления веб-контентом TYРOЗ — система управления сайтами (CMS/CMF) с открытым исходным кодом и свободной лицензией. Написана на PHP, для хранения данных...
    2007-06-15, lissyara
    SAMBA+ACL

    SAMBA + правка расширенных пермишенов (ACL) через виндовые галочки - полезно для передачи управления шарами на самбе виндовым админам, ничё кроме галок и не умеющим :)
    2007-06-13, roygbiv
    ntop 4.10

    Установка, настройка, оптимизация сетевого анализатора трафика ntop 4.1 stable с плагинами (в т.ч.SPAN-Sniffer и NetFlow) на FreeBSD 8.2 release. Описание nProbe.
    2007-06-09, Andy
    vsftpd

    перевод мана на vsftpd
    2007-06-04, lissyara
    exim + dovecot + win2003 AD

    Как заставить связку exim+dovecot использовать в качестве БД пользователей виндовый домен. Статья неполноценная - тока основные моменты и ссылки, где взять остальное. Скорее - просто заметка для себя.
    2007-05-30, lissyara
    exim + exchange

    Настройка релея на exim для сервера M$ exchange находящегося внутри локальной сети. Настройка перезаписи адресов локального домена на внешний.
    2007-05-13, Raven2000
    Бронированный FreeBSD

    Как и любую другую систему FreeBSD нужно так же защищать от посягательств на нее. Она не так уж защищена, как много людей о ней думают и ее можно так же сломать и крякнуть, как и тот же Windows.
    2007-05-12, alex3
    Печать из фри в винду

    Печать из FreeBSD на сетевой принтер виндов
    2007-05-03, Raven2000
    Десктоп c FreeBSD

    По просьбам трудящихся возьмусь за неблагодарную тему по одомашниванию FreeBSD.Начнем с одомашниванием консоли закончим русским KDE и настройками видео карт.
    2007-04-28, fr33man
    iPod

    Использование iPod во FreeBSD
    2007-04-25, lissyara
    AutoMount

    Как настроить автоматическое монтирование флэшек и CD-ROM в KDE. Заодно пришлось победить грабли с неверной русской кодировкой на флэшках.
    2007-04-24, Fastman
    Socket сервер на FreeBSD.

    Пишем tcp демона на С++ !
    2007-04-14, BAV_Lug
    ATSlog

    Ведение статистики звонков с офисной мини-АТС.
    2007-04-11, nk
    Backup MX

    Настройка fetchmail для сбора писем с сервера провайдера или резервного сервера и дальнейшая передача их локальному MTA
    2007-04-11, Raven2000
    Quake III Arena

    Представляю установку всеми любимого игро-мясо-экшена Quake III Arena именно так и никак не иначе! Будет чем заняться Васе и Пете (и отделу) во время работы, т.е. вместо нее :) И так Kill'em All!!
    2007-03-31, Raven2000
    Работа с HDD

    Есть много вопросов как грамотно разбить диск, выделить своп и диагностировать узкие места дисковой системы и т.к.дисковая подсистема-узкое место и разбивка его во многом определяет производительность
    2007-03-29, Abigor
    mpd + freeradius + mysql

    Настройка связки mpd + freeradius + mysql с дальнейшим превращением ее в биллинговую систему. Может пригодится совсем мелкому домашнему провайдеру
    2007-03-27, fr33man
    Exim + LDAP

    Настройка почтового сервера на базе Exim, с хранением информации в директориях LDAP.
    2007-03-21, dikens3
    PBR & IPFW

    Настройка 2-х каналов в Интернет.
    2007-03-16, fr33man
    Samba(PDC) + Ldap

    Множество неточностей заставили меня полностью переписать статью по настройке Samba + LDAP.
    2007-03-16, lissyara
    IPSEC

    Настройка шифрованного туннеля с использованием IPSEC на FreeBSD6.2, с использованем сертификатов. Используются только штатные прграммы (не считая racoon из портов).
    2007-03-11, Raven2000
    make.conf

    Так как мы сидим под фряхой и ставим все исключительно из портов (как умные ;)) компилим ядра и тд то неплохо было бы оптимизировать процесс компиляции многие часто не придают этому значение, но ведь
    2007-03-07, lissyara
    /usr/sbin

    Системные приложения из '/usr/sbin'
    2007-03-06, lissyara
    /usr/bin

    Системные приложения из '/usr/bin'
    2007-03-02, lissyara
    /sbin

    Это даже не статья, а просто однострочное описание каждого приложения находящегося в '/sbin'. К каждому приложению можно оставить комментарий, что уже и сделано для многих - примеры использования.
    2007-02-28, lissyara
    /bin

    Краткое описание (в одну строку, в основном) всех системных приложений из '/bin'
    2007-02-22, Raven2000
    Jabber - OpenFire

    OpenFire — это свободный многофункциональный и отказоустойчивый Jabber-сервер написанный на Java.На базе использования данной технологии было создано множество частных и корпоративных серверов Jabber.
    2007-02-07, lissyara
    ru man

    Интересный проект нашёлся - товарисчи переводят маны от FreeBSD. Народу не много, перевели тоже не много - но всё же, хоть что-то. Дело нужное - поэтому ставим.
    2007-02-05, Raven2000
    SkyLink-CDMA

    SkyLink-CDMA + FreeBSD 6.1 Подрубаем телефоны SkyLinkие т.е. CDMA к нашей любимой фряхе :) Например мне надо было подключить к BSD 2 телефона, мобильный Ubiquam UM-105 и стационарник RWT FCT-CDMA.2
    2007-01-29, dikens3
    Rejik

    Блокирование баннеров с помощью SQUID+REJIK
    2007-01-25, lissyara
    Samba как PDC

    Понадобилось поднять домен без винды - намучавшись со всякими LDAP`ами сделал по простому - на системных учётках. Работает и работает - разве что пришлось десяток скриптов на шелле написать.
    2007-01-15, Raven2000
    Настройка AWStats

    Статистика с AWStats 6.6 AWStats – еще один парсер, написанный на perl. Поддерживает запуск из командной строки и динамически через CGI Настройка для Аpache, Proftp, Postfix, Sendmail, QMail, MDae
    2007-01-14, lissyara
    loader.conf

    Перевод комментариев файла loader.conf (FreeBSD 6.2 RC2RC2) В нём довольно много интересных вещщей, в частности, через него можно добавить некоторые возможности без сборки нового ядра.
    2006-12-27, dikens3
    if_bridge

    Настройка DMZ при помощи if_bridge
    2006-12-18, lissyara
    BIOS & PXE

    Прошивка загрузочного PXE биоса для сетевых плат RTL8139(A/B/C)/RTL8130 прямо в БИОС материнской платы - полезно, когда на сетевухах нет кроватки под микросхему, или когда нет самих микросхем :)
    2006-12-12, lissyara
    DSPAM

    Наиболее эффективное использование этой программы - в качестве второго фильтра, на спам. Первичный "грубый" отсев стоит проводить самим MTA Exim, благо он обладает широкими возможностями фильтрации.
    2006-12-01, seacon
    D-Link DWL-G520

    Понадобилось сделать радиолинк на базе карточки DWL-G520 и апэшки DWL-2100AP, особых проблем вроде не возникло...
    2006-11-29, lissyara
    pppd

    Понадобилось поднять dial-in сервер на фре. Ввиду того, что этот самый сервер, будучи под виндой достал всех, решили на новом оторваться по полной :)) Но - сервак всё равно подняли :)))
    2006-11-27, fr33man
    newsyslog

    Программа для ротации логов -- newsyslog.
    2006-11-25, lissyara
    NetMos NM9845

    Понадобилось много com-портов под фрёй, тока вот на тех платах, что купили, определились не все - четыре вместо шести. Жалко - с двух плат четыре порта пропало. Пришлось рыться - почему не подцепились
    2006-11-23, dysel
    MRTG

    Недавно назрела необходимость снимать статистику с ADSL модема. Изначально закралось подозрение, что копать нужно в сторону SNMP. Недолгие копания в мануале модема это подозрение подтвердили.
    2006-11-18, lissyara
    bsnmpd

    Штатный SNMP-даемон. Позволяет удалённо снимать с хоста статистику интерфейсов, количество залогиненых юзеров, насколько заполнены разделы, среднюю загрузку системы и прочие прелести протокола SNMP.
    2006-11-17, lissyara
    diskless

    Бездисковые терминалы на FreeBSD - тонкие клиенты грузящиеся по сети и коннектящиеся к виндовому серверу терминалов. Офигенная экономия на железе. В ход идёт всё - первые пни и выше. Может даже 486...
    2006-11-16, lissyara
    mount_nullfs

    Эта системная утилита позволяет монтировать одну директорию в другую, поверх старой. Очень полезно, когда на одной машине в разных местах надо держать одно и то же (типичный пример - jail)
    2006-11-14, BAV_Lug
    Контроль провайдера

    Как попытаться доказать провайдеру, что у Вас не было интернета
    2006-11-11, fr33man
    maildrop & postfix

    Настройка MDA maildrop и postfix.
    2006-11-09, fr33man
    Postfix + LDAP

    Настройка Postfix с хранением информации о пользователях в БД LDAP.
    2006-11-08, fr33man
    rsync

    Архивируем по rsync
    2006-11-08, fr33man
    auth_ldap

    auth_ldap - это модуль апача, который позволяет авторизовать пользователей, беря информацию о них из LDAP.
    2006-11-08, fr33man
    Apache + SSL

    Прикручиваем SSL к Apache 2.2.0
    2006-11-08, fr33man
    knockd

    Технология port knocking позволяет выполнять любые действия на сервере, даже если все порты на нем закрыты. Вам достаточно соедениться с определенными портами, в определенной последовательности.
    2006-11-08, fr33man
    КПК + FreeBSD

    Привязываем КПК(HP hx4700) к FreeBSD по протоколу bluetooth - избавляемся от проводов дома
    2006-11-08, fr33man
    LAM

    Совершенно случайно наткнулся на то, что Вы видите в листинге, то бишь lam(LDAP Account Manager). Решил установить, так как давно хотел скрипт для добавления пользователей написать.
    2006-11-08, fr33man
    SAMBA + LDAP

    Хранение учётных записей пользователей SAMBA в LDAP.
    2006-11-08, fr33man
    LDAP auth

    Хранение в LDAP пользователей. Привяка пользователей из LDAP к системе.
    2006-11-08, fr33man
    LDAP+SSL

    Шифруем при помощи SSL данные передаваемые по LDAP - в целях безопасности.
    2006-11-08, fr33man
    Основы LDAP

    Cлужба каталогов LDAP (Light Weight Directory Access Protocol) - описание принципов работы.
    2006-11-08, fr33man
    PBR & PF

    Понадобилось настроить роутер, между сетями. Так как на cisco начальство раскошеливаться не захотело(это намек =)), пришлось ставить на компутер ОС - FreeBSD. Ну и файрволл - pf.
    2006-11-06, serge
    dvd в avi

    Скрипт кодирования dvd в avi. Кодек DIVX (FMP4), 2 прохода, качество выбирается вручную, размер видео 700 Мб.
    2006-11-04, fr33man
    pfctl

    Подсчет трафика с помощью pf
    2006-11-02, lissyara
    gmirror

    Использование gmirror для создания программного зеркалирования дисков. Полезно, когда нет аппаратного RAID-контроллера.
    2006-10-30, lissyara
    D-Link DGE530T

    Сетевуха D-Link DGE530T не поддерживалась. Вернее - поддерживалась, но фря её определить не могла. Пришлось чутка подправить руками исходники драйвера в ядре.
    2006-10-24, lissyara
    hosting

    Настройка хостинга под apache + PHP + MySQL. Боремся со спамерами - какой-то клиент спам рассылает, а при php модулем - неизвестно кто.. Вот и приходится изгаляться.
    2006-10-23, serge
    Обновление мира ("world")

    Обновленная версия статьи в которой постарался учесть все пожелания и замечания оставленные в комментариях. Рассматривается переход с версии 6.1 на 6.2.
    2006-10-19, Abigor
    cvsupd

    cvsupd - зеркало обновлений сиходных текстов системы FreeBSD и портов
    2006-10-17, Abigor
    monit

    Настройка monit для мониторинга работы системы.
    2006-10-17, lissyara
    monitord

    Программа для наблюдения за работой сервисов на локальной машине, при необходимости (если сервис упал, или его кто-то остановил) перезапускает их. Шлёт уведомления на почту, в случае сбоев.
    2006-10-06, serge
    pdf в html

    Данный материал может пригодится для организации веб-доступа к большому архиву pdf документов. Причем исключается необходимость передачи самого pdf документа клиенту.
    2006-09-29, 100kg
    Ntpdate/Ntpd

    FreeBSD поставляется с утилитой ntpdate, которая одноразово синхронизирует наши часы, и с сервером NTP
    2006-09-20, lissyara
    bsdstats

    Программа (вернее, - shell-скрипт) собирает данные о версии OC, используемом железе и шлёт на сайт где эта статистика лежит. Цели - популяризация BSD-систем. Мне, проект показался полезным.
    2006-09-01, lissyara
    hylafax

    Очень хорошая программа, позволяющая принимать-отправлять программы под FreeBSD. Одно условие - необходим `железный` модем, или софтверный на lucent`овском чипе. Умеет слать факсы на почту, и наоборот
    2006-08-25, m`ax
    mpd – легко и просто!

    Как mpd помог мне сделать так, чтобы пользователи подключались к серверу по VPN тем самым открывая себе доступ в интернет.
    2006-08-24, bonh
    DDNS+DHCP

    DNS и DHCP два очень хороших сервера, а в связке DHCP с DNS, получается красотища да и только…
    2006-08-11, lissyara
    HDD->HDD

    Возникла необходимость поменятьхард на работающем почтовом сервере. Всё переставлять - неоправданно долго, да и там куча специфического ПО - посему надо просто перенести с одного на другой, и всё.
    2006-08-10, lissyara
    jail

    Установка и настройка "клетки" (jail) под FreeBSD. Может пригодиться для виртуального хостинга, и при необходимости запускать несколько одинаковых приложений на одной машине.
    2006-08-09, lissyara
    LANTECH 1601F

    Достался по наследству управляемый свич, почти единственный в конторе, но тока в него отвёртку уронили, во время работы. А так, по словам оставившего, хорошая, вполне рабочая железяка. Была :)
    2006-08-02, lissyara
    imapsync

    Рассмотрено использование небольшой утилиты для перенса почты с одного сервера на другой. Может быть полезна при смене почтового сервера. Работает по протоколу imap (хотя, по слухам есть и для pop3)
    2006-07-30, northern
    CP1251 на FreeBSD

    CP1251 locale для FreeBSD, монтирование дисковых разделов других файловых систем в cp1251
    2006-07-30, lissyara
    sendmail -> exim

    Кратенькая статья по миграции с sendmail на exim. Вариант с использованием системных пользователей. Особых сложностей нет, вернее даже их вообще нет. Но, раз народ задаёт вопросы, - есть неясности.
    2006-07-27, lissyara
    Marvell 88E8053

    Как прикрутить драйвер на сетевуху 88E8053 Yukon PCI-E Gigabit Ethernet Controller, на которую не оказалось родного драйвера в FreeBSD. Но - помог производитель, озаботившийся выпуском этого драйвера.
    2006-07-08, lissyara
    MySQL

    Кратенький рассказ о установке, и некоторой настройке сервера БД MySQL. Может, кому-то окажется полезным, хотя ничего особо глубокого не рассматривается.
    2006-07-05, lissyara
    D-Link DE-200TP

    Понадобилось подключить сетевую плату, которой нет в списке поддерживаемых. Зато она NE2000-совместимая. Вот под этим видом её и подключил. Точно также можно подрубать массу старых сетевых плат.
    2006-06-30, lissyara
    postfix -> exim

    Возникла необходимость поменять на одном из серверов MTA - там стоял postfix, который мне не нравиться, на exim - который мало того, что всем меня устраивает, так ещё и нравиться :)
    2006-06-20, stup
    FreeBSD & DSA

    Здесь опубликована статья по элементарной настройке авторизации с помощью механизма DSA для сервера на базе OS FreeBSD
    2006-06-19, lissyara
    defaults/rc.conf

    Полный перевод файла /etc/defaults/rc.conf - с переменными заданными по дефолту. Он используется при старте системы, для задания начальных переменных, отдельные из которых перезадаются в /etc/rc.conf
    2006-06-18, lissyara
    webalizer

    Припёрло проанализировать - кто и откуда ко мне на сайт ходит. Собстно для этого и предназначена программа, которая рассматривается в статье - очень удобно и доходчиво, с графиками.
    2006-06-18, lissyara
    exim + saslauthd + courier-imap

    почтовая система без использования MySQL. Как оказалось редкая конфигурация, в наше время, по которой мало что можно найти в инете. Используются системные пользователи из /etc/passwd
    2006-06-15, urgor
    SAMBA+AD+NT ACL

    Вы сопротивлялись переходу с Windows на использование Samba, мотивируя это отсутствием ACL в последней? Теперь самое время серьезно задуматься о развертывании Samba и FreeBSD на своих файловых сервера
    2006-06-14, lissyara
    pureftpd

    Неплохой FTP сервер, пока единственный, что мне попались, поддерживающий перекодировку имён файлов - очень удобно, если на FTP лезут из-под винды - не надо держать имена файлов, на сервере, в cp1251.
    подписка

        вверх      
    Статистика сайта
    Сейчас на сайте находится: 12 чел.
    За последние 30 мин было: 72 человек
    За сегодня было
    12869 показов,
    1678 уникальных IP
     

      Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
      Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

    © lissyara 2006-10-24 08:47 MSK

    веселые картинки развлекательные гифки интресные факты смешные видео смешные истории из соцсетей

    Время генерации страницы 3.443 секунд
    Из них PHP: 99%; SQL: 1%; Число SQL-запросов: 46 шт.
    У Вас отключено GZIP-сжатие в браузере. Размер страницы 413280