Coding Overhead

Do the best with what you have

Перенаправления Unix pipelines

В любом приложении для 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