Как подавить проверку ключа хоста с помощью ssh-agent

Спасибо Стивену за подсказку попробовать архив. Предлагаемое решение могло сработать в тот день, когда он его опубликовал, но сегодня этого не произошло, в нем говорилось, что срок действия этого выпуска истек. Но я попробовал Debian-6.0, чтобы создать такой файл:

deb http://archive.debian.org/debian Debian-6.0 main contrib non-free
#deb http://archive.debian.org/debian squeeze-lts main contrib non-free
4
16.09.2018, 12:12
3 ответа

Реализация GNU uniq, обнаруженная в Ubuntu, с -c, не сообщает количество смежных идентичных строк, а сообщает количество смежных строк, которые сортируются одинаково¹.

В большинстве международных локалей в системах GNU есть ошибка, заключающаяся в том, что многие совершенно не связанные между собой символы были определены с одним и тем же порядком сортировки, потому что их порядок сортировки вообще не определен. Большинство других операционных систем следят за тем, чтобы все символы имели разный порядок сортировки.

$ expr ܐ = ܒ
1
Оператор

(expr=для нечисловых аргументов возвращает 1, если операнды сортируются одинаково, и 0 в противном случае ).

То же самое с ar_SY.UTF-8или en_GB.UTF-8.

Что вам нужно, так это языковой стандарт, в котором для этих символов задан другой порядок сортировки. Если бы в Ubuntu были локали для сирийского языка, можно было бы ожидать, что этим символам будет присвоен другой порядок сортировки, но в Ubuntu таких локалей нет.

Список поддерживаемых локалей можно посмотреть в выводе locale -a. Вы можете включить больше локалей, запустив dpkg-reconfigure localesкак root. Вы также можете определить дополнительные локали вручную, используя localedefна основе файлов определений в /usr/share/i18n/locales, но вы не найдете там данных для сирийского языка.

Обратите внимание, что в:

LC_COLLATE=syr_SY.utf8 cat file.txt | sort | uniq -c

Вы устанавливаете только переменную LC _COLLATE для команды cat(, которая не влияет на способ вывода содержимого файла, catне заботится о сортировке и даже кодировка символов, так как это не текстовая утилита ). Вы бы хотели установить его как для sort, так и для uniq. Вы также можете установить LC_CTYPEна локаль с кодировкой UTF -8.

Поскольку в вашей системе нет локали syr_SY.utf8, это то же самое, что использовать локаль C(в качестве локали по умолчанию ).

На самом деле, здесь локаль C или C.UTF -8, вероятно, является локалью, которую вы хотели бы использовать.

В тех местах,порядок сортировки основан на кодовой точке, кодовой точке Unicode для C.UTF -8, байтовом значении для C, но в конечном итоге это то же самое, что и кодировка символов UTF -8, имеющая это свойство.

$ LC_ALL=C expr ܐ = ܒ
0
$ LC_ALL=C.UTF-8 expr ܐ = ܒ
0

Так и с:

(export LANG=ar_SY.UTF-8 LC_COLLATE=C.UTF-8 LANGUAGE=syr:ar:en
 unset LC_ALL
 sort <file | uniq -c)

У вас будет LC _CTYPE с UTF -8 в качестве набора символов, порядок сопоставления на основе кодовой точки и другие настройки, относящиеся к вашему региону, например, сообщения об ошибках на сирийском или арабском языках, если Сообщения GNU coreutils sortили uniqбыли переведены на те языки, (которые еще не были ).

Если вас не волнуют эти другие настройки, их так же просто (и более портативно )использовать:

<file LC_ALL=C sort | LC_ALL=C uniq -c

Или

(export LC_ALL=C; <file sort | uniq -c)

как уже показал @isaac.


¹ обратите внимание, что POSIX-совместимые реализации uniqне предназначены для сравнения строк с использованием алгоритма сопоставления локали, а вместо этого выполняют сравнение байтов -и -байтов на равенство. Это было дополнительно разъяснено в редакции стандарта 2018 года (, см. соответствующую ошибку группы Остина). Но GNU uniqв настоящее время использует strcoll(), даже под POSIXLY_CORRECT; у него также есть опция -iдля случая -нечувствительного сравнения, которое по иронии судьбы не использует информацию о локали и правильно работает только с вводом ASCII

9
27.01.2020, 20:46

Первый наборLC_CTYPE:

$ export LC_CTYPE=syr_SY.utf8
$ <infile sort |uniq -c
      2 ܐܒܘܢ
      1 ܢܗܘܐ
2
27.01.2020, 20:46

Простое (простое )переносное решение:

$ ( LC_ALL=C sort syriac.txt | LC_ALL=C uniq -c )
      2 ܐܒܘܢ
      1 ܢܗܘܐ

Для тех из вас, у кого нет шрифта для отображения сирийского письма:

$ ( LC_ALL=C sort syriac.txt | LC_ALL=C uniq -c ) | xxd
00000000: 2020 2020 2020 3220 dc90 dc92 dc98 dca2        2........
00000010: 0a20 2020 2020 2031 20dc a2dc 97dc 98dc .      1.......
00000020: 900a                                    ..

РЕДАКТИРОВАТЬ Это ближе к взлому, чем к реальному решению. Он работает, заставляя sortи uniqобрабатывать каждую строку со значениями отдельных байтов вместо порядка сопоставления, заданного таблицей локалей. Эквивалентная локаль для использования (как UTF -8 «порядок сортировки кодовых точек» оказывается тем же порядком, что и «порядок сортировки байтовых значений» )C.UTF-8.

Это работает в большинстве систем AFAICT.

Эквивалентное решение:

$ ( export LC_COLLATE=C.UTF-8; <syriac.txt sort | uniq -c )

Основная проблема заключается в том, что символы сирийского языка (кодовые точки Юникода U+0700–U+074F сирийского языка и U+0860 -U+086F сирийского дополнения)еще не установлен порядок сортировки по сопоставлению.

Это проблема с файлами определения локали внутри/usr/share/i18n/locales(debian/ubuntu )и даже не указана как возможный язык в less /usr/share/i18n/SUPPORTED. Это означает, что информация для этого языка должна быть передана в Debian i18n и встроена в допустимые файлы локали.

Обычно, Название локали обычно имеет форму ‘ll _CC’. Здесь «ll» — двухбуквенный -код языка по ISO 639, а «CC» — двухбуквенный -код страны по ISO 3166. И сирийский (западный вариант )сырж .

Но сирийский язык имеет трехбуквенный код, уже присвоенный в ISO 639 -2 и Официальный список 639 -2 кодов

Код страны (ISO 3166 )обычно представляет собой двухбуквенный код и, вероятно, должен быть SY. Список кодов стран ISO 3166 .

Простой установки одной или всех переменных среды, связанных с локалью, недостаточно, и это может привести к сбою (, как это происходит в вашем случае ), поскольку все таблицы отсутствуют.В этих таблицах задаются названия месяцев, дней недели, формулы года, формат времени, формат валюты, язык сообщений об ошибках (, если доступен перевод )и т. д. Пожалуйста, прочтите:Какой язык выбрать и каковы последствия этого?

Когда кодовые точки Unicode не имеют явно определенного порядка сортировки, они могут стать все равно :неопределенными. Вот что здесь происходит.

Мы можем перечислить кодовые точки из вашего файла (только для того, чтобы использовать один пример точки )с:

$ echo $(cat syriac.txt | grep -oP '\X' | sort)
ܐ ܒ ܘ ܢ ܢ ܗ ܘ ܐ ܐ ܒ ܘ ܢ 

но если мы попытаемся получить только уникальные значения, все будет стерто:

$ echo $(cat syriac.txt | grep -oP '\X' | sort -u )
ܐ

это потому, что все символы имеют одинаковое значение сопоставления (вес):

$ a=ܐ
$ b=ܒ
$ [[ $a == [=$b=] ]] && echo yes
yes

означает, что значение var aнаходится в той же позиции сопоставления [=…=], что и значение var b.

Вместо этого здесь перечислены неповторяющиеся -символы:

$ echo $(cat syriac.txt | grep -oP '\X' | LC_COLLATE=C.UTF-8 sort -u )
ܐ ܒ ܗ ܘ ܢ
6
27.01.2020, 20:46

Теги

Похожие вопросы