If we’re talking specifically about executable scripts, here is #bash’s (libera.chat) factoid on the matter:
Don’t use extensions for your scripts. Scripts define new commands that you can run, and commands are generally not given extensions. Do you run ls.elf? Also: bash scripts are not sh scripts (so don’t use .sh) and the extension will only cause dependencies headaches if the script gets rewritten in another language. See http://www.talisman.org/~erlkonig/documents/commandname-extensions-considered-harmful
It’s for these reasons that I keep my executable scripts named without extensions (e.g. install
).
I sometimes have non-executable scripts: they’re chmod -x
, they don’t have a shebang, and they’re explicitly made for source
-ing (e.g. library functions). For these, I give them an extension depending on what shell I wrote them for (and thus, what shell you need to use to source
them), e.g. library.bash
or library.zsh
.
Worth noting that this is GNU-specific! For macOS for example, you’d have to install GNU userland (e.g. from homebrew) to get the flag. There’s still value in using other solutions (such as
ln
), portability-wise.As an aside: I mostly think of the
ln
param orders as exactly the same ascp
andmv
:cp FROM TO mv FROM TO ln [-s] FROM TO
Maybe that could help!