Link Search Menu Expand Document
14 Августа 2021 г.

Linux. Потоки ввода-вывода

Содержание
  1. Потоки ввода-вывода
  2. Примеры использования

Потоки ввода-вывода

В 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

Возник вопрос или предложение пиши на почту alexsey_89@bk.ru или в Телеграмм канал

Дата публикации: 14 Августа 2021 г.