
В ходе моего тестирования (в Bash и Z Shell) я не обнаружил проблем с определением функций, псевдонимов или исполняемых скриптов оболочки, в имени которых есть дефисы, но я не уверен, что это будет нормально во всех оболочках и во всех вариантах использования.
Причина, по которой я хотел бы это сделать, заключается в том, что дефис проще вводить, чем подчеркивание, и, следовательно, это быстрее и удобнее.
Одна из причин, по которой я не решаюсь поверить, что это не проблема, заключается в том, что в некоторых языках (например, Ruby) дефис будет интерпретироваться как знак минуса даже без пробелов вокруг него. Меня не удивит, если что-то подобное может произойти в некоторых оболочках, где дефис интерпретируется как сигнал опции даже без пробела.
Еще одна причина, по которой я немного подозреваю, заключается в том, что мой текстовый редактор портит подсветку синтаксиса для функций с дефисами. (Но, конечно, вполне возможно, что это просто ошибка в его конфигурации подсветки синтаксиса для скриптов оболочки.)
Есть ли причины избегать дефисов?
решение1
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 (только на основе ash) также не поддерживает дефисы в именах функций:
$ a-b() { date; }
-sh: Syntax error: Bad function name
Резюме поддержки дефиса в Shell
Известно, что следующие оболочки поддерживают дефисы в именах функций:
- pdksh и производные, bash, zsh
- некоторые производные ash, такие как sh FreeBSD (с 2010) или NetBSD (с 2016 года.
- busybox sh, когда выбранная во время компиляции оболочка — это
hush
вместоash
. - csh и tcsh (в своих псевдонимах эти оболочки не поддерживают функции). У этих оболочек в любом случае радикально другой синтаксис, так что нет никакой надежды на кросс-шелл-совместимость с ними.
- rc и производные (опять же с радикально другим синтаксисом)
- рыба (опять же с радикально иным синтаксисом)
Известны следующие оболочкинетдля поддержки дефисов в именах функций:
- оболочка Bourne и производные от нее, такие как ksh88 и bosh (в оболочке Bourne функции и переменные совместно использовали одно и то же пространство имен, переменная и функция не могли иметь одно и то же имя).
- ksh93, yash, оригинальный ash и некоторые его производные (busybox ash (выбор по умолчанию для sh), dash)
Выводы
- Дефисы нестандартны. Избегайте их, если вам нужна совместимость между оболочками.
- Используйте подчеркивания вместо дефисов: подчеркивания принимаются везде.
решение2
Я знаю, что это действительно поздно, но, возможно, вы сможете обойти эту проблему, сделав подчеркивание более доступным.
xmodmap -e "keycode 20 = underscore minus"
Это поменяет подчеркивание на дефис (минус).
Итак, теперь вы удерживаете клавишу Shift для ввода дефиса, но подчеркивание набирается без нажатия клавиши Shift.
Ваш код клавиши может быть другим, однако, я думаю, это зависит от вашей клавиатуры; у меня это 20. Просто дайте мне знать, если вам нужна помощь в поиске нужного вам кода клавиши.