Рефераты. Администрирование локальных сетей p> * ) echo “invalid option” ;;

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

Команда . (точка)

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

. scriptname

Команда eval eval [arg ...]

Аргументы читаються и соединяются в одну команду. Затем эта команда выполняется шеллом и статус выхода команды возвращается как результат команды eval. Если аргументы в команде отсутствуют или пустые то команда возвращает нулевой статус.
В качестве примера рассмотрим два скрипта:

d=’date &’ ; $d и d=’eval date &’ ; $d

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

Использование метасимволов.

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

for i in `ls a*` do cp $i /tmp echo “$i was copied” done

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

for i in a* do cp $i /tmp echo “$i was copied” done

результат будет один и тот же.

2.3.1 Некоторые специальные команды

Разделители && и ||

Это условные разделители. При разделении двух команд с помощью && вторая команда выполнится лишь в том случае когда первая завершится успешно. При разделении команд с помощью || вторая выполнится лишь тогда когда первая закончилась неуспешно (код возврата не равен нулю).
Например при выполнении скрипта:

test –d /usr/tools && cd /usr/tools

test –d /usr/tools || echo “directory doesn’t exist”

вход в директорию /usr/tools будет произведен только при ее наличии, в противном случае будет выдано сообщение о ее отсутствии.

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


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

name () { list; }

где name – это имя функции, а list – список команд из которых состоит тело функции. Ниже приведен пример функции возвращающей 0 если аргумент переданный ей является директорией и 1 в противном случае.

dir_test () { if [ -d $1 ] then echo “$1 is a directory” return 0 else echo “$1 is not directory” return 1 fi;

}

вызов функции осуществляется следующим образом

name [ parameter … ]

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

dir_test /usr/bin/sh


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


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

word is found

> mark

These words will be printed the cat command until the "mark" word is found

$

Если перед строчкой word стоит минус то все символы табуляции в начале строк будут вырезаны.

Другой часто используемой конструкцией при перенаправлении ввода-вывода является:

& цифра

При этом задействуется файловый дискриптор ассоциированый с указаной цифрой. В большинстве программ со стандартным вводом связан дискриптор 0, со стандартным выводом дискриптор 1, и со стандартным потоком ошибок дискриптор 2. Все программы которые работают друг с другом через пайпы по умолчанию пользуються дискрипторами 0 и 1. Наиболее часто используемые перенаправления это 1>&2 и 2>&1. Рассмотрим следующий пример из которого станет понятен смысл этих конструкций:

$ ls /no/such/file > out

/no/such/file not found

$ cat out

$

$ ls /no/such/file >out 2>&1

$ cat out

/no/such/file not found

$

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

Команда exec exec [arg …]

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

$ ksh

$ ps

PID TTY TIME COMMAND

2125 pts/0 0:00 ksh

2094 pts/0 0:00 sh

2126 pts/0 0:00 ps

$

$ exec ksh

$ ps

PID TTY TIME COMMAND

2127 pts/0 0:00 ps

2094 pts/0 0:00 ksh

$

Команда expr expr expression { +, -, *, /, *, =, >, >=, = operand2 )

|Операци|Описание |
|я | |
|> |Больше |
|< |Меньше |
|>= |Больше или равно |
|> |Правый битовый сдвиг |
| file Append commands to file.
>@ file Record-all debugger commands & output to file.
>>@ file Append all debugger commands & output to file.

">>" is equivalent to ">" for the next four commands.
> Show status of current recording file.
>@ Show status of current record-all file.
>(t | f | c) Turn recording on (t), or off (f), or close the recording file (c).
>@(t | f | c) Turn record-all on (t), or off (f), or close the record-all file (c).

Misc: ss file Save (breakpoint, macro, assertion) state. tc Toggle case sensitivity in searches.

Repeat previous command.
~ Repeat previous command.
! [command-line] Execute shell (with or without commands). q Quit debugger.
$addr Unary operator, address of object.
$sizeof Unary operator, size of object.
$in Unary boolean operator, execution in procedure.
# [text] A comment.
I Print debugger status.
M [(t | c) [expr [; expr ...]]] Print or set (text or core) maps. tM Toggle between default and modifiable core maps.

VARIABLES

var Search current procedure and globals. class::var Search class for variable.
[[class]::]proc:[class::]var Search procedure for variable.
[[class]::]proc:depth:[class::]var Search procedure at depth on stack.
:var or ::var Search for global variable only.
. Shorthand for last thing you looked at.
$var Define or use special variable.
$result Return value of last cmd line procedure call.
$signal Current child process signal number.
$lang Current language for expression evaluation.
$depth Default stack depth for local variables.
$print Display mode for character data.
$line Current source line number.
$malloc Debugger memory allocation (bytes).
$step Instr. count in non-debug before free-run.
$cplusplus C++ feature control flags.
$regname Hardware registers.
$fpa Treat fpa sequence as one instruction.(S300 only)
$fpa_reg Address register for fpa sequences.
(S300 only)

LOCATIONS

line source line & code address (if any)
#label " file[:line] "
[file:]proc[:proc[...]][:line|#label] "
[class]::proc[:line|#label] " proc#line code address (if any)
[class]::proc#line " name@shared_lib Address of name in shared library

FORMATS

A format has the form [count]formchar[size]. formchar's are: a String at address.
(b | B) Byte in decimal (either way).
(c | C) (Wide) character.
(d | D) (Long) decimal.
(e | E) E floating point notation (as double).
(f | F) F floating point notation (as double).
(g | G) G floating point notation (as double). i Machine instruction (disassembly).
(k | K) Formatted structure display (with base classes). n "Normal" format, based on type.
(o | O) (Long) octal. p Print name of procedure containing address.
(r | R) Print template of object (with base classes). s String from pointer.
S Formatted structure display.
(t | T) Print type of object (with base classes).
(u | U) (Long) unsigned decimal.
(w | W) Wide character string (at address).
(x | X) (Long) hexadecimal.
(z | Z) (Long) binary.

Size can be a number or one of the following: b 1 byte (char) s 2 bytes (short) l 4 bytes (long)
D 8 bytes (double - floating point formats only)
L 16 bytes (long double - floating point only)

Системные вызовы и взаимодействие с UNIX.

В этой главе речь пойдет о процессах. Скомпилированная программа хранится на диске как обычный нетекстовый файл. Когда она будет загружена в память компьютера и начнет выполняться - она станет процессом.
UNIX - многозадачная система (мультипрограммная). Это означает, что одновременно может быть запущено много процессов. Процессор выполняет их в режиме разделения времени - выделяя по очереди квант времени одному процессу, затем другому, третьему... В результате создается впечатление параллельного выполнения всех процессов (на многопроцессорных машинах параллельность истинная). Процессам, ожидающим некоторого события, время процессора не выделяется. Более того, "спящий" процесс может быть временно откачан (т.е. скопирован из памяти машины) на диск, чтобы освободить память для других процессов. Когда "спящий" процесс дождется события, он будет
"разбужен" системой, переведен в ранг "готовых к выполнению" и, если был откачан будет возвращен с диска в память (но, может быть, на другое место в памяти!). Эта процедура носит название "своппинг" (swapping).
Можно запустить несколько процессов, выполняющих программу из одного и того же файла; при этом все они будут (если только специально не было предусмотрено иначе) независимыми друг от друга. Так, у каждого пользователя, работающего в системе, имеется свой собственный процесс- интерпретатор команд (своя копия), выполняющий программу из файла /bin/csh
(или /bin/sh).
Процесс представляет собой изолированный "мир", общающийся с другими
"мирами" во Вселенной при помощи: a) Аргументов функции main: void main(int argc, char *argv[], char *envp[]);
Если мы наберем команду

$ a.out a1 a2 a3 то функция main программы из файла a.out вызовется с argc = 4 /* количество аргументов */ argv[0] = "a.out" argv[1] = "a1" argv[2] = "a2" argv[3] = "a3" argv[4] = NULL
По соглашению argv[0] содержит имя выполняемого файла из которого загружена эта программа*. b) Так называемого "окружения" (или "среды") char *envp[], продублированного также в предопределенной переменной extern char **environ;
Окружение состоит из строк вида

"ИМЯПЕРЕМЕННОЙ=значение"
Массив этих строк завершается NULL (как и argv). Для получения значения переменной с именем ИМЯ существует стандартная функция char *getenv( char *ИМЯ );
Она выдает либо значение, либо NULL если переменной с таким именем нет. c) Открытых файлов. По умолчанию (неявно) всегда открыты 3 канала:

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.