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

Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода:

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

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

Стандартный вывод ошибок

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

Ø File – перенаправление стандартного потока вывода в файл

>> Fail – добавление в fail данных из стандартного потока вывода.

< Fail – получение стандартного потока ввода из файла в fail

P1| P2 – передача стандартного потока вывода программы P1в поток ввода P2.

N > fail – переключение потока вывода из файла с дескриптором N в файл fail

N2 > fail – тоже, но записи добавляются в файл fail.

Стандартным потокам ввода, вывода и вывода ошибок присваиваются десктипторы – числовые значения, являющиеся указателями на соответствующий поток. Они, соответственно, равны 0,1 и 2. Перенаправлять потоки можно, используя эти числовые значения.

Например, чтобы подавить вывод ошибок, можно использовать следующую запись:

$ run 2 > /dev/ nul (псевдо устройство, удаляющее все введенные в него символы)

Все команды, которые вводятся в строке приглашения Shell, относятся к одной из следующих категорий:

1. Встроенные функции

2. Функции Shell, определенные пользователем

3. Внешние программы и утилиты

Запуск встроенной функции не требует порождения нового процесса, поскольку эта функция реализована в самой программе Shell.

Важнейшие встроенные функции Shell:

: - пустая команда. Она удобна для создания бесконечных циклов:

while:

do

……

done

break [N] – производит выход из цикла for или while.

Если параметр

break [N] производит выход из цикла for или while. Если параметр указан, происходит выход из и выполненных циклов.
cd [dir] переход в каталог dir
echo[string] строка string выводиться на терминал
exec run-me выполняем программу runme
exit завершает работу интерпретатора
jobs вывод списка текущих заданий
pwd выводит имя текущего каталога
return осуществляет вывод и зфункци
set выводит список определенных переменных
test вычисляет условное выражение
times выводит суммарное время использования процессора программами
type name показывает как name будет интерпретироваться Shell

и ряд других.

Синтаксис функции определенный пользователем имеет вид:

function ( ) { command 1 command 2 ……….. } т.е. телом функции является обычный sprint shell

таким образом, пользователь может определить функцию команд­ного интерпретатора и использовать ее как встроенную функцию Shell.

Пример.

Функция mcd, которая позволяет отобразить в применении Shell имя текущего каталога.

mcd ()

{ cd $* - передача аргументов запущенного скрипта

единым словом

PS1=’pwd’

}

В командной строке Shell можно запустить сразу несколько команд:

$pwd; date.

Можно запустить программу в фоновом режиме. В этом слу­чае Shell не будет ждать завершения программы, а сразу выведет приглашение. Для этого строку команды необходимо завершить символом ‘&’.

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

cmd1 && cmd2.

В качестве примера приведу поле имени пользователя в файле паролей и в случае успеха – поле его имени в файле групп:

$grep sergey/etc/paсswd && grep sergey/etc/group.

Можно назначить выполнение команды только в случае не­удачного завершения предыдущей. Для этого команды следует раз­делить двумя символами “|”:

$cmd1 || echo Команда завершилась неудачно.

Язык Shell позволяет осуществлять ветвление программы с помощью оператора if.

Синтаксис этого оператора следующий:

if условие

Перенаправление ввода/вывода - student2.ru then

command1 Эти команды будут выполнены если

command2 истинно условие.

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

fi

Язык программирования Shell имеет также несколько опера­торов цикла:

1) while условие

do

command1

command2

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

done

2) until условие

do

command1

command2

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

done

3) for var in список

do

command1

command2

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

done

С помощью оператора while команды command1, command2 и т.д. будут выполняться пока условие не станет ложным.

С помощью оператора until команды command1, command2 и т.д. будут выполняться пока условие не станет истинным.

Оператор for обеспечивает выполнение цикла столько раз, сколько слов в списке. При этом переменная var последовательно принимает значения, равные словам из списка. Список может фор­мироваться различными способами, например, как вывод некоторой команды.

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

cat > text.sh

далее нужно записать команды файла, нажав в конце каждой строчки клавишу «ENTER», а затем Ctrl-D, чтобы закончить текст.

Можно создать скрипт с помощью текстового редактора

$VI text.sh

Созданный командный файл можно вызвать на выполнение как процедуру командного интерпретатора, командой sh с аргумен­том – именем скрипта.

$ sh text.sh

Команда sh вызовет файл и выполнит его команды.

Этот скрипт можно выполнить иначе: нужно объявить его вы­полняемым с помощью команды изменения прав доступа chmod:

$ chmod u+x text.sh

Теперь можно выполнить команды файла text.sh как обычную программу:

$ text.sh

еще один вариант – начать текст скрипта со строки:

#!/bin/sh.

Наши рекомендации