Чи є проблеми з дефісами у функціях, псевдонімах та виконавчих файлах?


25

Під час мого тестування (у Bash та Z Shell) я не бачив проблем із визначенням функцій чи псевдонімів або виконуваних скриптів оболонки, які мають дефіси в імені, але я не впевнений, що це буде добре у всіх оболонках та у всіх випадках використання .

Я хотів би зробити це через те, що дефіс набирати простіше, ніж підкреслення, а тому швидше і плавніше.

Однією з причин, що я вагаюся вважати, що це не проблема - це те, що в деяких мовах (наприклад, Рубі) дефіс трактується як знак мінусу навіть без пробілів навколо нього. Мене не здивувало б, якщо щось подібне може трапитися в деяких оболонках, де дефіс трактується як варіант передачі сигналу навіть без місця.

Ще одна причина, з якою я трохи підозріла, - це те, що мій текстовий редактор викручує виділення синтаксису для функцій з дефісами. (Звичайно, цілком можливо, що це лише помилка в конфігурації підсвічування синтаксису для скриптів оболонки.)

Чи є якась причина уникати дефісів?

Відповіді:


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

Наступні оболонки, як відомо, підтримують дефіси у назвах функцій:

  • кш, баш, зш

Наступні оболонки, як відомо, не підтримують дефіси у назвах функцій:

  • зола (busbox), csh, tcsh, тире

Висновки

  • Дефіси нестандартні. Тримайтеся подалі від них, якщо ви хочете сумісність між оболонками.
  • Використовуйте підкреслення замість дефісів: підкреслення прийнято скрізь.

2
Імена з -ними - це зло. Я дивлюся на тебе, CSS. :)
PM 2Ring

Спасибі. Я перевірив пізніше cshі tcshвони не підтримують перенесення або, але Korn оболонки зробив. Це трохи смішно, що я використовував і a-b()як своє ім'я функції.
іконоборство

@iconoclast Я додав результати ваших тестів на оболонку у відповідь. Спасибі.
John1024

@ PM2Ring їх простіше набрати, ніж імена з підкресленнями. Виключаючи традиції чи рішення щодо впровадження систем, які їх не дозволяють, на який принцип ви можете вказати, щоб підтримати твердження, що вони злі?
іконоборство

1
@iconoclast Імена з дефісами неможливо багатьма мовами, оскільки дефіс тлумачиться як знак мінус, тому якщо така мова потребує взаємодії з мовою, яка підтримує імена з дефісами, ви отримаєте безладну ситуацію, коли особи з дефісними іменами змушені іншою мовою мають іншу назву.
PM 2Ring

3

Я знаю, що це справді пізно, але, можливо, ви можете вирішити свою проблему, щоб зробити підкреслення більш доступним.

xmodmap -e "keycode  20 =  underscore minus"

Це переключить підкреслення з дефісом (мінус).

Отже, ви тримаєте за зміну дефіс, але підкреслення вводиться без зсуву.

Ваш клавіатурний код може бути різним, проте, я думаю, це залежить від вашої клавіатури; моєму трапляється 20. Просто дайте мені знати, якщо вам потрібна допомога в пошуку того, який ключ-код потрібно використовувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.