Проблема с экранированием параметризованных аргументов

С помощью perl вывести символ в кодовой таблице локали:

perl -Mopen=locale -le 'print chr($_) for 0x13000 .. 0x130ff'

Для некоторых кодовых таблиц (не UTF-8) я видел, что perl делает это неправильно. В качестве альтернативы вы можете сделать:

perl -e 'print pack("L>2", $_, 10) for 0x13000 .. 0x130FF' |
  iconv -f UCS-4BE

чтобы системный iconv выполнил перевод (в случае с египетскими иероглифами я не ожидаю, что многие кодовые таблицы помимо UTF-8 будут поддерживать их в любом случае). Это было бы эквивалентно тому, что zsh/bash для своих $'\UXXXXXX'.

Для вывода их в UTF-8 независимо от кодовой таблицы локали:

perl -CO -le 'print chr($_) for 0x13000 .. 0x130ff'

Ваш

perl -C -le 'print chr 0x130F0'

будет работать, пока кодовая таблица локали равна UTF-8 (проверьте вывод locale charmap).

Он выведет символ. Теперь вам также нужен шрифт с этим EGYPTIAN HIEROGLYPH E026 символом, и ваш эмулятор терминала, настроенный на использование этого шрифта, если вы хотите, чтобы он там отображался.

В Debian и производных посмотрите на пакет fonts-ancient-scripts.

2
10.05.2017, 02:28
1 ответ

Вы не можете вернуться от ./mycommand.sh $MYOPT к значению MYOPT.Вот почему вы не нашли способ сделать это: это невозможно. mycommand.sh не получает достаточно информации для восстановления исходного значения.

Например, если значение MYOPT равно *, то mycommand.sh вызывается со списком имен файлов в текущем каталоге. У него нет возможности узнать, как был составлен этот список.

Если вы знаете, что значение MYOPT соответствует определенным правилам, вы сможете восстановить его. Простая версия этих правил такова:

  • Значение не содержит ни одного из символов \[*? или табуляции или новой строки.
  • Значение не начинается и не заканчивается пробелом и не содержит последовательных пробелов.

При этих предположениях "$*" в mycommand.sh даст вам значение MYOPT. Но имейте в виду, что это не может работать в целом.

Правильным решением будет исправить вашу среду. На языке оболочки $MYOPT не означает «взять значение MYOPT», это означает «взять значение MYOPT, разделить его в соответствии с значение IFS и обрабатывать каждую результирующую часть как подстановочный шаблон, который расширяется, если он соответствует хотя бы одному файлу». Способ написать «взять значение MYOPT» — это "$MYOPT", или, в более общем смысле, использовать $MYOPT в двойных кавычках.

2
27.01.2020, 22:10

Теги

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