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

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

set -xv

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

set +xv

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

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

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

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

# keycommandecho $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 может быть вложенным, при этом командная строка просматривается несколько раз.

11.Файловая система в UNIX


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



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