
В любом приложении для Unix-подобных ОС всегда существуют 3 файловых дескриптора:
- stdin(0)
- stdout(1)
- stderr(2)
В скобках указаны их номера.
Конвееры чаще всего используются в shell-скриптах для перенаправления вывода одного приложения на вход другому. Простой пример:
$ ls -la | grep test
Здесь создастся два параллельных процесса, один выведет содержимое текущей директории в stdout, а второй отфильтрует и выведет строки, полученные через stdin. С помощью символа конвеера |
происходит перенаправление stdout первого процесса в stdin второго. Таким образом grep
на вход получит результат вывода ls
.
Следует учитывать, что символ конвеера не перенаправляет stderr. Для его перенаправления нужно воспользоваться следующей конструкцией:
$ <команда> 2>&1
Как уже упоминалось, stderr имеет номер 2. Данной конструкцией мы перенаправляем файловый дескриптор с номером 2 (stderr) в файловый дескриптор под номером 1 (stdout). Для перенаправления в файл можно сразу указать его имя:
$ <команда> > <имя файла>
$ <команда> 2> <имя файла>
И наконец, чтобы одновременно перенаправить stdout и stderr:
$ <команда> > <имя файла> 2>&1