Bash aliases definitely can't contain these characters: space
, tab \t
, newline \n
, /
, \
, $
, `
, =
, |
, &
, ;
, (
, )
, <
, >
, '
and "
.
The Bash Reference Manual says:
The characters /
, $
, `
, =
and any of the shell metacharacters or quoting characters listed above may not appear in an alias name.
"Shell metacharacters" are defined as
A character that, when unquoted, separates words. A metacharacter is a space
, tab
, newline
, or one of the following characters: |
, &
, ;
, (
, )
, <
, or >
.
"Quoting characters" aren't explicitly listed but they are the backslash \
and the single '
and double "
quotes.
Bash checks alias names in legal_alias_name()
which is implemented here: 1, 2, 3. Looking through the output of mksyntax.c (a C program that generates another C program) on my system, shellbreak()
will return true for these 10 characters: \t\n &();<>|
, shellxquote()
for these 4: "'\`
, and shellexp()
for $
, finally legal_alias_name()
also checks for /
.
However, there are other limitations from 1) how Bash tokenizes the alias
expression that you would have to write to define the alias and 2) how it will tokenize a command that starts with your alias. Namely, for 1), =
can't appear in an alias name, probably because alias foo=bar=baz
would be parsed as foo
= bar=baz
, not foo=bar
= baz
. For 2), from my experiments, you can define an alias with !
, the history expansion character, but if you try to use it, you'll get a command not found
error, unless the !
is at the end of the command. There's probably other characters, the safest bet is to stick to numbers, letters and the underscore.