вывод iconv -l отличается при передаче в канал

#linux #iconv

#linux #iconv

Вопрос:

Я обнаружил, что iconv -l вывод в Linux отличается, когда я передаю его через канал.

 $ iconv -l
The following list contain all the coded character sets known.  This does
not necessarily mean that all combinations of these names can be used for
the FROM and TO command line parameters.  One coded character set can be
listed with several different names (aliases).

  437, 500, 500V1, 850, 851, 852, 855, 856, 857, 858, 860, 861, 862, 863, 864,
  865, 866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3,
  8859_4, 8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993,
...
  

и

 $ iconv -l | cat
437//
500//
500V1//
...
  

iconv --version дает:

 $ iconv --version
iconv (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Ulrich Drepper.
  

Почему это происходит? Где задокументировано это различие? man iconv не упоминает об этой разнице.

Ответ №1:

Это типичное поведение для многих программ. Как упоминал пользователь «rowboat», некоторые программы проверяют, будет ли вывод терминалом или нет, используя isatty функцию.

Другим примером такого поведения является ls команда, которая выводит одну строку на файл в папке вместо того, чтобы перечислять ее для терминала:

 $ ls
a.out   b.out   c.out

$ ls | cat
a.out
b.out
c.out
  

Для ls , это поведение задокументировано на странице руководства, но для iconv , похоже, нет.

Комментарии:

1. Спасибо за объяснение. Я пытаюсь понять «конвейерный» вывод. В частности, что означает «//» в конце каждой строки?

2. Я предполагаю, что это просто разделитель для псевдонимов, поскольку у меня есть записи, подобные ISO-10646/UTF-8/ .