Я рассмотрю каждый из ваших пунктов ниже:
Каналы имеют дело с двоичным кодом и не зависят от кодировки
Правильный.
Приложения на каждой стороне конвейера (, включая STDOUT/STDIN ), должны иметь консенсус в отношении формата кодирования текста
Я бы даже не стал говорить текстовое кодирование; это не обязательно должен быть текст (, хотя часто это ). Приложение, читающее из канала, должно знать, чего ожидать от приложения, записывающего в канал.
Терминал/консоль также считается одним из этих приложений и должен использовать ту же кодировку
Терминал не участвует в трубе. Если мы рассмотрим случай, когда стандартный вывод процесса записывается на терминал, то терминал будет интерпретировать эти байты. Это может быть «текст» или управляющие коды, которые сообщают терминалу, что нужно делать такие вещи, как очистка экрана или изменение положения курсора.
В качестве примера рассмотрим:
$ clear | hexdump -c
0000000 033 [ H 033 [ 2 J 033 [ 3 J
Это <esc>[H<esc>[2J<esc>[3J
; это управляющие последовательности ANSI. Терминал переводит это, чтобы очистить экран. См.https://en.wikipedia.org/wiki/ANSI_escape_codeдля получения дополнительной информации об этом.
Приложения Unix по умолчанию используют UTF -8, но это можно изменить
Опять же, это не имеет прямого отношения к трубам. Я думаю, что по умолчанию используется «C», что, как мне кажется, является просто базовым набором символов ASCII. Переменная окружения LANG
обычно управляет кодировкой символов, которую используют программы.