Управление вводом и выводом в сценариях

Автор: Admin

Дата:2013-01-17

Ввод и вывод в Linux

0 |  STDIN      |  ввод
1 |  STDOUT  |  вывод
2 |  STDERR   |  вывод сообщений об ошибках.

STDIN - можно представить как ввод информации с клавиатуры с последующим отображение на экран STDOUT.

Все это по своей сути так же является файлами в ОС Linux и если использовать (<), (>), (>>) то в результате получим, что эти символы берут информацию с файла.
# cat < test1
# ifconfig > test2


Применение stdout для очистки файла без его удаления.

# cat /dev/null > Files1

STDERR - Выводит сообщения об ошибках и по умолчанию он выводит их на экран монитора.

Перенаправление STDERR Осуществляется при помощи

cat test3 2> test4 - так например здесь должно быть выведено все из файла test3 в файл test4, однако задана двойка означающая то, что выводятся только сообщения об ошибках. В том случае если файла test3 не существует, будет выведено сообщение в файл test4 "ls: test3: Нет такого файла или каталог"

И так мы поняли, что двойка выводит сообщения об ошибке в файл, а единица может выводит данные в файл.

Теперь

# ls -al 1test 2 test test test2 2> 12test 1> 11test

в файле 12test у нас собраны ошибки
в файле 11test у нас собраны данные из команды ls.

Вывод в один и тот же файл осуществляется при помощи символа "&>"
# ls -al 1test 2 test test test2 &> 13test

Перенаправления в сценариях

Теперь пора пришла разобраться с перенаправлениями в сценариях.

# vi std.sh
#!/bin/bash
echo "Это ошибка" >&2
echo "Это STDOUT"


# sh std.sh
В результате, простого запуска, на экране отобразится все что идет за echo

А вот при таком варианте в файл err.txt запишутся ошибки.
sh std.sh 2> err.txt

Перенаправление при помощи "EXEC"
Создадим сценарий и проверим его работу.

# vi exec.sh
#!/bin/bash
exec 1> exec.txt
echo "бла бла бла 1"
echo "бла бла бла 2"
echo "хватит"


В результате при помощи команды exec произвел вывод в файл exec.txt, а вариант перенапрвления оказался в самом сценарии.

Здесь так же имеются способы манипуляции выводом.
# vi exec1.sh
#!/bin/bash
exec 2> ERRexec.txt
exec 1> exec1.txt
echo "бла бла бла 1"
echo "бла бла бла 2"
echo "хватит"
echo "Ошибки" >&2


Перенаправление ввода.

Пример 1:

#!/bin/bash
exec 0< name
count=1
while read line
do
        echo "Line #$count: $line"
        count=$[ $count + 1 ]
done

Пример 2:

#!/bin/bash
echo "Введите числа после чего произойдет умножение"
exec 0< var
#count=1
if
read -t 3 -p  "Введите первое число число: " var
read -t 3 -p "Введите второе число: " var1
then
var2=$[ $var * $var1 ]
echo $var2
else
echo "Извините вы долго вводили данные"
fi

Создается файл var и заполняется двумя цыфрами, после чего данные берутся из файла и происходит умножение.

Как мы поняли из вышеописанного то:
0 - STDIN
1 - STDOUT
2 - STDERR
Однако, кроме первых трех, можно иметь до девяти дескрипторов файла.

В дальнейшем эти дескрипторы файла можно использовать для себя.
vi exec3.sh
#!/bin/bash
exec 3> testfiles3
exec 4> testfiles4
echo "вывод на монитор"
echo "вывод в testfiles3" >&3
echo "вывод в testfiles4" >&4


# vi exec5.sh

#!/bin/bash
exec 5<&0
exec 0< name
count=1
while read line
do
        echo "Line #$count: $line"
        count=$[ $count + 1 ]
done
exec 0<&5

Можно создавать десрипторы файла для одновременного чтения и записи

#/bin/bash
exec 6<> test6


Закрывать дескрипторы файла до оконьчания сценария.

exec 7>&-

Количество просмотров: 2445

Комментарии к статье:

Добавить комментарий

Введите сумму с картинки

© Plutonit.ru - Администрирование, настройка Linux и Windows 2009 - 2017