Потоки и конвейеры в Linux

Стандартные потоки: ввода/вывода/ошибок

    В Linux любая работающая программа, или процесс имеют три канала связи:
  • Канал получения данных (стандартный поток ввода, №0 или "stdin");
  • Канал вывода данных (стандартный поток вывода, №1 или "stdout");
  • Канал для вывода информации об ошибках (стандартный поток ошибок, №2 или "stderr").

Перенаправление стандартных потоков

Один символ > означает, что файл будет перезаписан. Два символа >> означает, что файл будет дополнен.

Перенаправление потока stdout в файл:
Файл будет создан или перезаписан
> file.txt
Файл будет создан или дополнен
>> file.txt
например
ls > file.txt
Объединение файлов
cat file1.txt file2.txt > file3.txt
Перенаправление потока stderr в файл:
Файл будет создан или перезаписан
2> file.txt
Файл будет создан или дополнен
2>> file.txt
например
ls 2> file.txt
Если ошибки не интересуют, можно их перенаправить в /dev/null
ls 2> /dev/null
Комбинированное перенаправление вывода. Stdout в один файл, stderr - в другой:
> file1.txt 2> file2.txt
например
ls > file1.txt 2> file2.txt
Объединение потоков stdout и stderr и перенаправление их в один файл:
&> file.txt
например
ls &> file.txt
Перенаправление потока стандартного ввода stdin:
<
например
cat <
wc < file.txt

Конвейеры

Конвейер – это последовательность команд разделенных символом |, связь их каналов стандартного вывода с каналом стандартного ввода. То есть перенаправление stdout одной команды в stdin другой команды.

Перенаправление вывода первой команды в less
ls -l /usr/bin | less
Разветвление конвейера. Взять данные из середины конвейера можно с помощью tee, например
ls -l /usr/bin | tee test5.out | less
вывод и на экран и в файл
ls -l /usr/bin | tee test5.out 
вывод ошибок в файл
ls -l /usr/bin 2>&1 | tee test5.out