In my testing (in Bash and Z Shell), I saw no problems with defining functions or aliases or executable shell scripts which have hyphens in the name, but I’m not confident that this will be okay in all shells and in all use cases.
The reason I would like to do this is that a hyphen is easier to type than an underscore, and therefore faster and smoother.
One reason I’m hesitant to trust that it’s not a problem is that in some languages (Ruby for example) the hyphen would be interpreted as a minus sign even without spaces around it. It wouldn’t surprise me if something like this might happen in some shells, where the hyphen is interpreted as signaling an option even without a space.
Another reason I’m a little suspicious is that my text editor screws up the syntax highlighting for functions with hyphens. (But of course it’s entirely possible that that’s just a bug in its syntax highlighting configuration for shell scripts.)
Is there any reason to avoid hyphens?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
POSIX and Hyphens: No Guarantee
According to the POSIX standard, a function name must be a valid name and a name can consist of:
3.231 Name
In the shell command language, a word consisting solely of
underscores, digits, and alphabetics from the portable character set.
The first character of a name is not a digit.
Additionally, an alias must be a valid alias name, which can consist of:
3.10 Alias Name
In the shell command language, a word consisting solely of underscores,
digits, and alphabetics from the portable character set and any of the
following characters: ‘!’, ‘%’, ‘,’, ‘@’.Implementations may allow other characters within alias names as an
extension. (Emphasis mine.)
A hyphen is not listed among the characters that must be allowed in either case. So, if they are used, portability is not guaranteed.
Examples of Shells That Do Not Support Hyphens
dash is the default shell (/bin/sh) on the debian-ubuntu family and it does not support hyphens in function names:
$ a-b() { date; }
dash: 1: Syntax error: Bad function name
Interestingly enough, it does support hyphens in aliases, though, as noted above, this is an implementation characteristic, not a requirement:
$ a_b() { printf "hello %sn" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world
The busybox shell (Almquist shell) also does not support hyphens in function names:
$ a-b() { date; }
-sh: Syntax error: Bad function name
Summary of Hyphen Support by Shell
The following shells are known to support hyphens in function names:
- ksh, bash, zsh
The following shells are known not to support hyphens in function names:
- ash (busybox), csh, tcsh, dash
Conclusions
- Hyphens are non-standard. Stay away from them if you want cross-shell compatibility.
- Use underscores instead of hyphens: underscores are accepted everywhere.
Method 2
I know this is really late, but perhaps you can work around your issue of making the underscore more accessible.
xmodmap -e "keycode 20 = underscore minus"
This will switch underscore with hyphen (minus).
So now, you hold shift for hyphen, but an underscore is typed without shift.
Your keycode may be different, however, I think it depends on your keyboard; mine happens to be 20. Just let me know if you need help finding what keycode you need to use.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0