Учтите следующее:
$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi
По сути, я пытался объявить функции, 1
и 0
это было бы сокращением для true
и false
, но, как вы можете видеть, я столкнулся с проблемой использования числовых имен в функциях. Такое же поведение происходит с псевдонимами и двузначными именами.
Вопрос "почему"? Это предписано POSIX? или просто причудливые раковины?
command-line
bash
dash-shell
ksh
Сергей Колодяжный
источник
источник
0
находитсяtrue
в сценариях оболочки и1
являетсяfalse
(на самом деле, любой ненулевой объект рассматривается как ложный), в случае, если кто-либо, читающий это, не знает. Это назад от большинства других языков программирования.true
в оболочке. Тем не менее, в арифметическом расширении$((...))
возвращаются состояния возврата - 1 означает,true
а 0false
соответствует согласованности с синтаксисом языка Си. Попробуйте, например,bash -c 'echo $((1==1));echo $((1==2))'
То, что я пытался сделать вне этого вопроса, на самом деле было «обратным» поведением. Посмотрите последний пример моего ответа здесь, чтобы увидеть, что именно я пытался сделать. Глупая идея, но тем не менее работаетОтветы:
POSIX говорит:
И:
Таким образом, слово, начинающееся с цифры, не может быть именем функции.
источник
1L
значило? Имя функции? Илиlong int
буквальный?()
, возможно, с аргументами внутри, которое обозначает вызов рассматриваемой функции (и принимает значение, которое возвращается вызываемой функцией). Так что, если у вас есть функцияint f() { return 42; }
на C,f
она действительна в контексте указателя иf()
действительна в целочисленном контексте без указателя.Это стандарт во многих языках для предотвращения путаницы между математическими операциями и переменными или функциями или методами.
Рассматривать:
Как вы можете видеть, если числа были разрешены в качестве имен переменных или функций, последующее выполнение математических операций в программе может привести к путанице, и вам придется придумывать творческие обходные пути, если впоследствии вам понадобится выполнять математические вычисления с этими числами. Это также может привести к неожиданным результатам на некоторых языках. Представьте, что вы увеличиваете число для цикла, но одна из цифр уже является переменной, равной строке. Это немедленно бросило бы ошибку. Если вы не были первоначальным автором кода, эта ошибка может занять много времени, чтобы найти.
В двух словах, именно поэтому большинство языков не позволяют вам использовать число в качестве имени переменной, функции, метода и т. Д.
источник
$
перед расширением», но опять же, если оболочка вдохновлена другими языками, это нормально, я полагаю, плюс в арифметических расширениях((
переменные не обязательно должны иметь ведущие$
. Хорошо, я могу понять это$
, так что вот так. Но это, вероятно, вторично к другой причине «просто следовать общему соглашению»0
для имени оболочки или сценария1
,2
..., для позиционных параметров,*
для них присоединились,-
для опции включено,?
для последнего состояния выхода, и!
для PID самого последнего асинхронного задания. (Таким образом, даже в$((
))
,$
это часто необходимо.) Код, показанный здесь, чтобы продемонстрировать предлагаемое обоснование, не является сценарием для любой оболочки в стиле Борна, так как нет способа продемонстрировать это таким образом, так как он не применяется к их.В C рассмотрим выражение вроде:
Является ли
1000l
переменная или константа? Поскольку имена переменных не могут начинаться с цифры, это должна быть константа. Это делает анализ более простым и строгим (опечатки, такие как1000k
легко могут быть пойманы). Также проще иметь одно правило для переменных и имен функций, поскольку функции также могут рассматриваться как переменные. Теперь, конечно, парсеры намного сложнее и мощнее, и у нас есть такие вещи, как пользовательские литералы в C ++. Но назад, в те древние времена доисторического периода, пожертвование небольшим количеством ненужной гибкости может значительно сократить время вашей компиляции (или интерпретации) (и люди по-прежнему жалуются на время компиляции C ++).И вы можете увидеть влияние влияния C на язык оболочки, поэтому неудивительно, что оболочка Bourne (или оболочка C) и, следовательно, POSIX, ограничивают класс разрешенных имен тем же, что и класс C.
источник
&&
и||
отсутствие поддержки для ASCII NUL в строках,