Linux. Потоки ввода-вывода
Содержание
Потоки ввода-вывода
В Linux для каждой запущенной программы или приложения создается 3 файл дескриптора, с номерами 0,1,2.
- Дескриптор 0 - stdin стандартный поток для ввода данных в приложение.
- Дескриптор 1 - stdout стандартный поток для вывода данных из приложения.
- Дескриптор 2 - stderr используется для вывода данных сообщающих об ошибках.
В терминале PTS
устройство открывается на этих файловых дескрипторах.
Теперь все стандартные потоки ведут на это устройство.
Проверим это. Найдем потоки и узнаем куда они ведут:
ls -la /dev/std*
lrwxrwxrwx 1 root root 15 авг 14 13:20 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 авг 14 13:20 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 авг 14 13:20 /dev/stdout -> /proc/self/fd/1
Это символические ссылки на псевдофайловую систему proc
в подкаталог self/fd
, где находятся ссылки на дескрипторы каждого
открытого файла.
Посмотрим на эти файлы:
ls -la /proc/self/fd
total 0
dr-x------ 2 alex alex 0 авг 14 09:33 .
dr-xr-xr-x 9 alex alex 0 авг 14 09:33 ..
lrwx------ 1 alex alex 64 авг 14 09:33 0 -> /dev/pts/1
lrwx------ 1 alex alex 64 авг 14 09:33 1 -> /dev/pts/1
lrwx------ 1 alex alex 64 авг 14 09:33 2 -> /dev/pts/1
lr-x------ 1 alex alex 64 авг 14 09:33 3 -> /proc/4354/fd
Как видим потоки ведут на устройство, которое находится по пути /dev/pts/1
.
/dev/pts/* - класс устройств представляющие эмуляторы терминалов, которые мы запускаем в консоли в
системах с графической оболочкой. Файлы /dev/pts/N
создаются динамически и запускаются на одном терминале.
У нас сейчас открыт терминал /dev/pts/1
, откроем еще один /dev/pts/2
и введем команду echo "Test message" > /dev/pts/1
.
Посмотрим на вывод в терминале /dev/pts/1
.
Тем самым мы перенаправили вывод команды echo
в PTS устройство первого окна, как это делает любая программа работающая в
том терминале.
В примере выше символ >
значит перенаправить стандартный поток вывода команды echo
в устройство /dev/pts/1
.
С такой же легкостью потоки можно перенаправлять в файлы или в другую программу. Также файл может быть как источник
данных для другой программы.
Примеры использования
- Содержимое каталога в файл
ls /usr/bin/ > list # Фаил будет полностью перезаписан.
ls /usr/bin/ 1> list
ls /usr/bin/ >> list # Данные будут дописаны в конец файла.
- Содержимое файла подать на вход программе, как входные данные
cat < list
cat 0< list
- Объединение нескольких файлов с помощью команды
cat
Сперва нужно создать файлы. Можно воспользоваться командой touch file{1..10}
и создать 10 пустых файлов.
Но воспользуемся командой tee
.
echo "Hello" | tee file{1..10} > /dev/null
Создаться 10 файлов file*
с одинаковым содержимым. Объединим их в один используя команду cat
:
cat file* > full # Чтобы не перечислять все файлы указал *
В итоге будет создан файл full
со всеми строками из всех перечисленных файлов.
- Перенаправление потока ошибок в файл
ls notfile 2>file0
ls notfile 2>>file0 # Допишем в конец файла file0.
- Перенаправить поток ошибок и поток вывода в файл
Бывают ситуации когда нужно перенаправить сразу два потока 2 и 1 в один файл
ls ~ notfile &>file0
ls ~ notfile &>>file0 # Допишем в конец
ls ~ notfile >&file0
Или поочередно в разные файлы, например так
ls ~ notfile 2> error 1> correct
ls ~ notfile 2>> error 1>> correct
- Сортировка строк из файла
Задача отсортировать список в файле и сохранить его в другой файл
sort < inputfile > sortfile
Здесь на вход команде sort
подаем неотсортированный список. Результат сохраняем в файл sortfile
- Загрузка дампа базы данных
mysql -uroot -h82.82.82.82 -p database < database.sql