Есть ли проблемы с дефисами в функциях, псевдонимах и исполняемых файлах?

25

В моем тестировании (в Bash и Z Shell) я не видел проблем с определением функций или псевдонимов или исполняемых сценариев оболочки, в имени которых есть дефисы, но я не уверен, что это будет хорошо во всех оболочках и во всех случаях использования. ,

Причина, по которой я хотел бы сделать это, заключается в том, что дефис легче набирать, чем подчеркивание, и, следовательно, быстрее и плавнее.

Одна причина, по которой я не решаюсь полагать, что это не проблема, заключается в том, что в некоторых языках (например, в Ruby) дефис будет интерпретироваться как знак минус, даже без пробелов вокруг него. Меня не удивит, если что-то подобное может произойти в некоторых оболочках, где дефис интерпретируется как сигнал опции, даже без пробела.

Другая причина, по которой я немного подозрительна, заключается в том, что мой текстовый редактор испортил подсветку синтаксиса для функций с дефисами. (Но, конечно, вполне возможно, что это просто ошибка в конфигурации подсветки синтаксиса для сценариев оболочки.)

Есть ли причина избегать дефисов?

иконоборец
источник

Ответы:

32

POSIX и дефисы: нет гарантии

В соответствии со стандартом POSIX, имя функции должно быть допустимым именем, а имя может состоять из:

3.231 Имя
В языке команд оболочки - слово, состоящее исключительно из символов подчеркивания, цифр и алфавита из переносимого набора символов. Первый символ имени не является цифрой.

Кроме того, псевдоним должен быть допустимым псевдонимом , который может состоять из:

3.10 Псевдоним Имя
В языке команд оболочки - слово, состоящее исключительно из символов подчеркивания, цифр и алфавитов из переносимого набора символов и любого из следующих символов: '!', '%', ',', '@'.

Реализации могут разрешать другие символы в псевдонимах в качестве расширения. (Акцент мой.)

Дефис не указан среди символов, которые должны быть разрешены в любом случае. Таким образом, если они используются, мобильность не гарантируется.

Примеры оболочек, которые не поддерживают дефисы

dashявляется оболочкой по умолчанию ( /bin/sh) в семействе debian-ubuntu, и она не поддерживает дефисы в именах функций:

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

Интересно, что он поддерживает дефисы в псевдонимах, хотя, как отмечалось выше, это характеристика реализации , а не требование:

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

Оболочка busybox (оболочка Almquist) также не поддерживает дефисы в именах функций:

$ a-b() { date; }
-sh: Syntax error: Bad function name

Сводка поддержки дефисов Shell

Известно, что следующие оболочки поддерживают дефисы в именах функций:

  • кш, баш, зш

Известно, что следующие оболочки не поддерживают дефисы в именах функций:

  • пепел (busybox), csh, tcsh, тире

Выводы

  • Дефисы нестандартны. Держитесь подальше от них, если вы хотите совместимость между оболочками.
  • Используйте подчеркивания вместо дефисов: подчеркивания принимаются везде.
John1024
источник
2
Имена -в них злые. Я смотрю на тебя, CSS. :)
PM 2Ring
Спасибо. Я проверил позже cshи tcshони не поддерживают переносы либо, но Korn оболочки сделал. Немного забавно, что я также использовал a-b()название своей функции.
иконоборчество
@iconoclast Я добавил результаты ваших тестов оболочки в ответ. Спасибо.
John1024
@ PM2Ring их легче набирать, чем имена с подчеркиванием. Исключая традиции или решения о внедрении систем, которые их не допускают, на какой принцип вы можете указать, чтобы поддержать утверждение, что они злые?
иконоборчество
1
@iconoclast Имена с дефисами невозможны во многих языках, поскольку дефис интерпретируется как знак минус, поэтому, если такой язык должен взаимодействовать с языком, который поддерживает имена с дефисами, возникает беспорядочная ситуация, когда сущности с дефисными именами вынуждены иметь другое имя на другом языке.
PM 2Ring
3

Я знаю, что уже поздно, но, возможно, вы можете обойти свою проблему, сделав подчеркивание более доступным.

xmodmap -e "keycode  20 =  underscore minus"

Это переключит подчеркивание с дефиса (минус).

Итак, теперь вы держите shift для дефиса, но подчеркивание печатается без shift.

Ваш код ключа может отличаться, однако, я думаю, это зависит от вашей клавиатуры; у меня их 20. Просто дайте мне знать, если вам нужна помощь в поиске того, какой код ключа вам нужно использовать.

TuxForLife
источник