Почему 'Классы символов' должны быть предпочтены по 'Диапазонам символов' В Shell (Bash)?

Странный, то, что я не понимаю, - то, почему Ваш второй пример возвращается к оболочке (и я не могу воспроизвести это).

Когда Вы работаете ssh -S none -fNR 13018:localhost:22 example.com | cat, процесс ssh остается в фоновом режиме. Это все еще имеет конец записи открытого канала. Так cat еще не видел конец файла на его стандартном входе, и поэтому это продолжает читать.

Нажатие Ctrl+C уничтожает cat процесс (это - единственная часть задания, которое это все еще выполняет, начиная с процесса ssh в фоновом режиме, переместился к своей собственной группе процесса, и передний план ssh процесс завершается, как только это разветвлено). Если фон ssh процесс пытался записать в свой стандартный вывод (который он не будет, из-за -N), запись была бы фай с EPIPE (ssh блоки SIGPIPE). cat процесс также вышел бы при уничтожении фона ssh процесс.

5
17.04.2013, 14:47
3 ответа

Согласно bash страница справочника, LC_COLLATE переменная среды влияет на диапазоны символов, точно согласно ответу Hauke Laging:

LC_COLLATE Эта переменная определяет порядок сопоставления, используемый при сортировке результатов расширения пути, и определяет поведение выражений диапазона, классов эквивалентности и сортирующих последовательностей в рамках расширения пути и сопоставления с образцом.

С другой стороны, LC_CTYPE классы символов влияния:

LC_CTYPE Эта переменная определяет интерпретацию символов и поведение классов символов в рамках расширения пути и сопоставления с образцом.

То, что это означает, - то, что оба случая потенциально проблематичны, если Вы думаете на английском, слева направо, Латинском алфавите, арабско-разрядном контексте.

Если Вы являетесь действительно надлежащими, и/или пишете сценарий для среды мультилокали, вероятно, лучше удостовериться, что Вы знаете то, что Ваши переменные локали - при соответствии файлам, или быть уверенными, что Вы кодируете абсолютно универсальным способом.

Очень трудно предвидеть некоторые ситуации, хотя, если Вы не изучили лингвистику.

Однако я не знаю об использующей латынь локали, которая изменяет порядок букв, таким образом [a-z] работал бы. Существуют расширения Латинского алфавита, которые сопоставляют лигатуры и diacriticals по-другому. Однако вот немного эксперимента:

<!-- language: lang-bash -->
mkdir /tmp/test
cd /tmp/test
export LC_CTYPE=de_DE.UTF-8
export LC_COLLATE=de_DE.UTF-8
touch Grüßen
ls G* # This says ‘Grüßen’
ls *[a-z]en # This says nothing!
ls *[a-zß]en # This says ‘Grüßen’
ls Gr[a-z]*en # This says nothing!

Это интересно: по крайней мере, для немецкого языка, ни diacriticals как ü, ни лигатуры как ß не свернуты в латинские символы. (или что, или я испортил изменение локали!)

Это может быть плохо для Вас, конечно, при попытке найти имена файлов, которые начинаются с буквы, используют [a-z]* и примените его к файлу, который запускается с ‘Ä’.

4
27.01.2020, 20:39
  • 1
    Даже после чтения двух ответов, одна вещь не ясна: Почему Классы символов по Диапазонам символов? Почему предпочтение, точно? –  its_me 17.04.2013, 16:35
  • 2
    Поскольку Alexios подразумевает (+1), я думал бы случаи локали где [a-z] повороты включать более или менее, чем a-z будут очень необычными - проблема - то, что a-z не является всеми буквенными символами во многих локалях. Таким образом, если Вы ищете слова, [: альфа:] класс символов обеспечивает большое преимущество: это портативно через локали, который [a-z], очевидно, не является. –  goldilocks 17.04.2013, 16:56
  • 3
    @Alexios: если где-нибудь вдоль строки Вы не используете de_DE.UTF-8 (процесс, файловая система, и т.д.), но что-то как de_DE.ISO-8859-1 Вы получите свои нечетные результаты. Я использую кодирование ISO, и я добираюсь Grüßen когда ls Gr[a-z]*en –  Bananguin 17.04.2013, 17:38
  • 4
    @TheoneManis, потому что они могут вести себя неожиданными способами, если Вы используете Unicode. Более неожиданный, чем диапазоны символов, который является. Если Вы не используете диапазоны символов с кодовыми точками Unicode, больше, чем U+007F, я предполагаю. Это может быть до персонального предпочтения автора (воспринятое меньшее из двух зла личным опытом). –  Alexios 18.04.2013, 22:45

"Другие языки", вот именно. Различные локали могут иметь различные порядки сортировки. Таким образом в теории может случиться так, что a-z не является тем же с другой локалью. Диапазоны становятся трудными это, Вы хотите соответствовать всему. Что является первым, что последний символ?

Люди openSUSE таким образом параноик об этом при проверке имен пользователей / пароли, что они делают это этот путь: [abcdefghi...]

Я никогда не думал о цифрах на других языках / наборы символов. Интересный момент.

1
27.01.2020, 20:39
  • 1
    Даже после чтения двух ответов, я не уверен в этом - Почему Классы символов по Диапазонам символов? Почему предпочтение, точно? –  its_me 17.04.2013, 16:36
  • 2
    я должен признать, что не знал, что классы символов затронуты также локалью. И если [: цифра:] может быть что-то, что Вы никогда не видели к тому времени, что, вероятно, имеет смысл предпочитать [0-9]. Возможно, эти правила зависят от того, что точно каждый делает. –  Hauke Laging 17.04.2013, 16:53

По крайней мере, при использовании удара 4.2 на OS X, локали UTF-8, кажется, используют порядок сопоставления ASCII, но локали ISO 8859-1 не делают в некоторых контекстах:

$ LC_ALL=en_US.UTF-8 tr A-C 1-9 <<< B
2
$ LC_ALL=en_US.ISO8859-1 tr A-C 1-9 <<< B
6
$ LC_ALL=en_US.UTF-8 grep [A-Z] <<< ä
$ LC_ALL=en_US.ISO8859-1 grep [A-Z] <<< ä
ä

В некоторых средах локали UTF-8 также используют различные заказы сопоставления.

[: верхний:] и [: ниже:] также включают символы неASCII во многие локали. Если Вы только хотите соответствовать символам ASCII, используйте что-то вроде этого:

LC_ALL=C tr a-zA-Z n-za-mN-ZA-M

Если бы LC_ALL был установлен на что-то еще, LC_COLLATE=C или LANG=C не работали бы.

0
27.01.2020, 20:39

Теги

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