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

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

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

Например при выполнении скрипта:

 

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  

 

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

 

           $ cat<<mark

> These words will be printed

> the cat command until the "mark"

> 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 { +, -, \*, /, *, =, \>, \>=, \<, \<=,!= } expression

 

Это очень полезная команда для выполнения арифметических операций в шелл скриптах. Например:

 

           x=10

       expr $x + 5

 

           y=`expr $x – 10`

 

       if expr $x \<= $y

       then

                   echo “$x is less or equal than $y”

       fi

Команда set

Эта команда используется во многих модификациях. Основное назначение – это устанавливать значение параметров. Если Вы просто запустите эту команду без аргументов то увидите все параметры вашего окружения, большинство из которых было установлено при входе в систему из файла.profile.

 

Наример команда:

 

       set bob brr kab ram

 

установит параметры $1, $2, $3, $4 следующим образом $1=”bob”, $2=”brr”, $3=”kab”, $4=”ram”. Команда set имеет множество опций, полный список которых можно получить обратившись к man-странице (man set).

Команда trap

Команда trap ожидает приход сигналов посланных шелу (от внешних процессов или сигнал от шела вследствии неуспешного запуска программы) и выполняет их обработку.

 

       trap [ command_list ] [ s1 …]

 

Когда trap получает сигнал s1 (сигналы s2 …) она выполняет список заранее предопределенных в command_list команд. Если s1 равен 0, то команды запускаются когда шелл заканчивает свою работу. Команда trap запущенная без аргументов выдает на печать список команд ассоциированных с каждым из номеров сигналов. Ниже приведен краткий список наиболее часто используеиых сигналов.

 

Номер сигнала Описание Возможность перехвата
1 сигнал перезапуска Есть
2 Прерывание процесса Есть (если процесс не в фоне)
3 Сигнал выхода Есть (если процесс не в фоне)
6 Сигнал завершения Есть
9 “Убиение” процесса Не може быть перехвачен в принцыпе
14 Сигнал таймера Нет
15 Програмный сигнал завершения процесса Есть

 

Попытка перехватить 11-й сигнал (memory fault) приводит к ошибке. Сигнал с номером 9 не может быть перехвачен т.к. он не перехватывается в принципе.

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

 

trap “echo ‘removing temporaty file’ rm /tmp/temp” 0 1 2 3 15

 

Команда pwd

 

Эта команда показывает текущую рабочую директорию.

 

Команда type

type [ prog_name …]

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

 

Команда times

 

Эта команда выдает информацию о времени выполнения процесса запущеного из шелла.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: