Использование расширенных символов Юникода (без сомнения) полезно для многих пользователей.
Простые оболочки (ash (busybox), dash) и ksh не работают с:
tést() { echo 34; }
tést
Но bash , mksh , lksh и zsh, кажется, позволяют это.
Мне известно, что действительные имена функций POSIX используют это определение имен . Это означает, что это регулярное выражение:
[a-zA-Z_][a-zA-Z0-9_]*
Однако в первой ссылке также сказано:
Реализация может разрешить другие символы в имени функции в качестве расширения.
Вопросы:
- Это принято и задокументировано?
- Где?
- Для каких снарядов (если есть)?
Вопросы по теме:
Можно ли использовать специальные символы в имени функции оболочки?
Меня не интересует использование метасимволов (>) в именах функций.
Имена функций upstart и bash, содержащие «-».
Я не верю, что оператор (вычитание «-») должен быть частью имени.
alias
немного более снисходительным. и, таким образом, вы можете написать функцию с некоторым правильным, застегнутым именем, а затем просто определить псевдоним с более стильным именем для вызова функции. вdash
есть также некоторые вещи вы можете сделать с$PATH
и%func
.Ответы:
Поскольку документация POSIX допускает его как расширение, ничто не мешает реализации такого поведения.
Простая проверка (побежал
zsh
):показывают , что
bash
,zsh
,yash
,ksh93
(чтоksh
связано в моей системе),pdksh
и его вывод позволяет Многобайтовыестроки символов в качестве имени функции.yash
с самого начала поддерживает многобайтовые символы , поэтому неудивительно, что это сработало.Другая документация, на которую вы можете ссылаться
ksh93
:Итак, установка на
C
локаль:сделать это не удалось.
источник
posh
не стоит быть перечисленным в таком списке. Это зависит от конкретных ошибок в Linuxlibc
и не будет работать на других платформах.ksh93
использования самостоятельно скомпилированного ksh93 из оригинальных источников. Хотяksh88
кажется, что для имен функций принимаются не-7-битные буквы ASCII, толькоksh93
двоичный файл из Ubuntu, похоже, принимает их.Обратите внимание, что функции используют то же пространство имен, что и другие команды, включая команды в файловой системе, которые в большинстве систем не имеют ограничений на символы или даже байты, которые они могут содержать в своем пути.
Таким образом, хотя большинство оболочек ограничивают символы своих функций, нет реальной причины, по которой они это делают. Это означает, что в этих оболочках есть команды, которые нельзя заменить на функцию.
zsh
иrc
разрешить что-нибудь для их имен функций, включая некоторые с/
и пустую строку.zsh
даже позволяет NUL байтов.Простая команда в оболочке представляет собой список аргументов, и первый аргумент используется для получения команды для выполнения. Поэтому логично, что эти аргументы и имена функций имеют одинаковые возможные значения, а в
zsh
аргументах встроенных функций и функций может быть любая последовательность байтов.Здесь нет проблемы безопасности, так как функции, которые вы (автор сценария) определяете, являются теми, которые вы вызываете.
Возможны проблемы с безопасностью, когда на синтаксический анализ влияет среда, например, в оболочках, где действительные имена для функций зависят от локали.
источник
function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }
, и потенциально полезные вещи тоже с функциями имени--
,//
,@
или и%
т.д./
встречаются в имени? и функция не просто имя исполняемого файла - ее код. Я думаю, что простая реализация может столкнуться с множеством проблем разбора, если имена ее хранимых функций включают метасимволы.