Hi, I think it's time that we officially specify in the manual of Bash that we allow other characters besides [[:alnum:]_] when declaring function names in non-POSIX mode.
In the Bash manual, the only thing we specify about the definition of shell functions under POSIX mode is "When in posix mode, name may not be the name of one of the POSIX special builtins." It doesn't say anything about the characters we allow when not in POSIX mode. Reference code: static int execute_intern_function (name, funcdef) WORD_DESC *name; FUNCTION_DEF *funcdef; { SHELL_VAR *var; if (check_identifier (name, posixly_correct) == 0) { if (posixly_correct && interactive_shell == 0) { last_command_exit_value = EX_BADUSAGE; jump_to_top_level (ERREXIT); } return (EXECUTION_FAILURE); } ... bind_function (name->word, funcdef->command); return (EXECUTION_SUCCESS); } /* Make sure that WORD is a valid shell identifier, i.e. does not contain a dollar sign, nor is quoted in any way. Nor does it consist of all digits. If CHECK_WORD is non-zero, the word is checked to ensure that it consists of only letters, digits, and underscores. */ int check_identifier (word, check_word) WORD_DESC *word; int check_word; { if ((word->flags & (W_HASDOLLAR|W_QUOTED)) || all_digits (word->word)) { internal_error (_("`%s': not a valid identifier"), word->word); return (0); } else if (check_word && legal_identifier (word->word) == 0) { internal_error (_("`%s': not a valid identifier"), word->word); return (0); } else return (1); } /* Return 1 if this token is a legal shell `identifier'; that is, it consists solely of letters, digits, and underscores, and does not begin with a digit. */ int legal_identifier (name) char *name; { register char *s; unsigned char c; if (!name || !(c = *name) || (legal_variable_starter (c) == 0)) return (0); for (s = name + 1; (c = *s) != 0; s++) { if (legal_variable_char (c) == 0) return (0); } return (1); } #define legal_variable_starter(c) (ISALPHA(c) || (c == '_')) #define legal_variable_char(c) (ISALNUM(c) || c == '_') -- konsolebox