Перенаправление ввода/вывода
Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода:
Стандартный ввод
Стандартный вывод
Стандартный вывод ошибок
По умолчанию все эти потоки ассоциированы с терминалом. Т.е. любая программа, использующая только стандартные потоки, будет ожидать ввода с клавиатуры терминала, весь вывод этой программы, включая сообщения об ошибках, будет происходить на экран терминала. 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 условие
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.