переписав его содержимое.
Пример 5 Направить результаты в файл, переписав его содержимое.
$ date
Пн 12 июл 2021 08:02:24 MSK
$ cat >f30.txt
Hello
$ date >| f30.txt
$ cat f30.txt
Пн 12 июл 2021 08:03:13 MSK
2.9 Переадресация ввода-вывода с использованием дескрипторов файлов.
Файловый дескриптор целое число,которое указывает доступ к файлу.
Стандартный ввод stdin дескриптор 0.
Стандартный вывод stdout дескриптор 1.
Стандартный вывод ошибок stderr дескриптор 2. Клавиатура stdin файл.
Экран stdout файл. Файловый дескриптор привязан к индефикатору процесса.
Пример
# sleep 1000 &
[2] 5021
# cd /proc/5021/fd ; ls
0 1 2
cmd >&n Направить результат команды в файл с
дескриптором n.
Пример 1 # дескриптор 1 стандартный вывод.
$ date >&1
Вт июн 11 22:05:51 MSK 2019
cmd >& Закрыть стандартный вывод
$ date >&-
date: ошибка записи: Неправильный дескриптор файла.
cmd<&n Взять входные данные для указанной команды из файла с заданным дескриптором n.
$ cat >file1<&0
privet
$ cat file1
privet
cmdm<&n Входные данные из файла с дескриптором m
поступают из файла с дескриптором n.
$ cat >file1 2<&0
privet 4 # Набираем с клавиатуры
$ cat file1
privet 4
cmd<& Закрыть стандартный ввод.
$ pwd<&-
/home/max1
$
cmd<&n Направить содержимое файла с заданным дескриптором n в стандартный ввод,получив сначала копию, а затем закрыв оригинал.
cmd>&n- Направить содержимое файла с заданным дескриптором n в стандартный вывод,получив сначала копию,а затем закрыв оригинал.
Пример Напишем следующий скрипт
$ cat f2.sh
#!/bin/sh
read str <&0
echo "$str" | festival tts language russian
Запускаем скрипт
$ sh f2.sh Набираем в терминале фразу
Привет друзья. Нажимаем Enter и слышим
«Привет друзья»
Пример 2
$ cat f5.txt
Hello my friend
$ read str <f5.txt |echo "$str" >&1-
Hello my friend
Использование команды exec с дескрипторами.
exec 0
Создадим под root myfile с двумя командами.
# cat >myfile
pwd; date
Выполнить команды из файла вместо стандартного ввода.
# exec 0<myfile
# pwd; date
/root
exec 1
cat myscript1.sh
#!/bin/sh
exec 1>outfile
0echo "This a test"
$ cat ./outfile
This is a test
exec 3
$ cat myscript3.sh
#!/bin/sh
exec 3> myfile
echo "Privet" >&3
cat ./myfile
$sh myscript.sh
Privet
Примечание возможно использование команды exec c дескрипторами 0-9.
2.10 Многократная переадресация ввода-вывода.
Направить стандартный вывод ошибок в заданный
файл cmd 2>file Пример 1
$ ls -l /root/ 2>ls_er; cat ls_er
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Направить стандартный вывод ошибок и данных в
заданный файл.
cmd >file 2>&1 Пример 2
$ ls -l f1.txt; ls -l /root/ 2>&1 >ls1
rw-rw-r 1 max1 max1 6 мая 9 07:21 f1.txt
ls: невозможно открыть каталог '/root/': Отказано в доступе.
$ cat ls1
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Присоединить стандартный вывод данных и
ошибок к содержимому данного файла
cmd&>> file Пример 3
$ ls -l f1.txt; ls -l /root/ &>> ls2
rw-rw-r 1 max1 max1 6 мая 9 07:21 f1.txt
$ ls -l f1.txt; ls -l /root/ &>> ls2
rw-rw-r 1 max1 max1 6 мая 9 07:21 f1.txt
max1@hp:~$ cat ls2
ls: невозможно открыть каталог '/root/': Отказано в доступе.
ls: невозможно открыть каталог '/root/': Отказано в доступе.
ls: невозможно открыть каталог '/root/': Отказано в доступе.
Направить стандартный данных в заданный file1,
стандартный вывод ошибок в указанный file2
Направить стандартный вывод данных и ошибок в
стандартный вывод, так и в заданные файлы.
сmd 2 >&1 |tee файлы или cmd |& tee файлы
Пример 4
$ pwd; ls -l /root/ 2>&1 |tee ls3
/home/max1
ls: невозможно открыть каталог '/root/': Отказано
в доступе.
$ cat ls3
ls: невозможно открыть каталог '/root/':Отказано
в доступе.
2.11 Сохранение дескрипторов файлов в переменных.
Допускается указывать имя переменной вместо
числового обозначения дескриптора.
Пример. Нахождение дескриптора файла.
$ exec 4>file;echo "OK">&4; cat ./file
OK
max@hp:/dev/fd$ ls
0 1 2 255 4
max@hp:/dev/fd$ cat 4
OK
Пример использования дескрипторов числом более 9
$ mv f1.txt f1
$ echo f1 {f1fd}>xyz
f1
$ echo $f1fd
11
$ cd /dev/fd
max@hp:/dev/fd$ ls
0 1 11 2 255 4
max@hp:/dev/fd$ echo "Privet">&11
max@hp:/dev/fd$ cat 11
Privet Дескриптор файла,сохраненный в переменной оболочки может быть использован в сценарии.
2.12 Специальные имена файлов.
/dev/stdin Дубликат дескриптора файла 0
/dev/stdout Дубликат дескриптора файла 1
/dev/stderr Дубликат дескриптора файла 2
/dev/fd/<n> Дубликат дескриптора файла <n>
/dev/tcp/<host>/<port> или /dev/udp/<host>/<port>
Оболочка Bash устанавливает соединение с указанным хостом через заданный порт, используя полученный в итоге дескриптор файла при переадресации ввода-вывода.
~/Документы$ find -print >filelist 2>no_access
Обнаруживаемые файлы направляются в файл filelist, а сообщения об ошибках в файл no_access
Проверка
~/Документы$ cat filelist
.
./Posix1.doc
./script
./script/sc01.sh
./no_access # новый файл
./rus2.doc
./filelist # новый файл
./otchet.doc
Глава 3.Функции.
Функция совокупность команд, выполняемых в
сценарии оболочки.
Синтаксис функции имя (){ код-тело функции
} [ виды переадресации]
Обращение к функции происходит по имени. При выполнении функции не создается нового процесса. Она выполняется в среде соответствующего процесса. Аргументы функции становятся ее позиционными параметрами; имя функции ее нулевой параметр. Прервать выполнение функции можно оператором "return [n]", где (необязательное) "n" код возврата.