Восклицательный знак в названии функции bash - мне следует? - PullRequest
2 голосов
/ 11 января 2012

Я пишу сценарий bash, и в имени функции очень удобно использовать восклицательный знак.

Пример:

function hello! {
    echo goodbye
}
function hello {
    echo hello
}

И это работает!

После просмотра спецификации я нашел это:

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

Мне кажется, что я нарушаю правила здесь.Это неправильно?Будет ли это что-то испортить в будущем?Что на самом деле происходит?

Ответы [ 4 ]

5 голосов
/ 11 января 2012

Поскольку это нарушает спецификацию Bash, я бы сказал, что вы используете ошибку в Bash, поэтому ваш код может не работать, когда ошибка исправлена.Бросьте !

4 голосов
/ 11 января 2012

Из-за острого любопытства, почему так удобно использовать восклицательный знак в названии вашей функции?

Как правило, по причинам переносимости вы не можете использовать взрыв; только потому, что интерпретатор в этой конкретной ОС принимает его, если вам нужно развернуть этот сценарий в другом месте, другие интерпретаторы слегка отличающихся версий / версий могут быть не такими приемлемыми.

3 голосов
/ 11 января 2012

Я не уверен насчет последствий в этом случае, но если в спецификации что-то ясно сказано, я бы сказал что-нибудь, кроме неопределенного поведения, и его следует избегать.

2 голосов
/ 11 января 2012

Это не очень хорошая идея для использования! в имени функции, если вы хотите, чтобы ваш код был переносимым. bash --posix или вызов bash как «sh», оба отклоняют «hello!» как имя функции. Но я подозреваю, что bash молча разрешает аберрантные имена функций («hello?», «Hello-» и «hello /» также работают, если назвать несколько), потому что одним из важных применений функций является возможность пользователю переопределять обычные команды и эти команды ( например, ls, rm и т. д.) может содержать любые символы, разрешенные файловой системой.

Обратите внимание, что "привет!" как переменная имя не работает.

...