Why doesn't my Bash script recognize aliases?
If you look into the bash manpage you find:
Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS below).
So put a
shopt -s expand_aliases
in your script.
Make sure to source your aliases file after setting this in your script.
shopt -s expand_aliases
source ~/.bash_aliases
First of all, as ddeimeke said, aliases by default are not expanded in non-interactive shells.
Second, .bashrc
is not read by non-interactive shells unless you set the BASH_ENV
environment variable.
But most importantly: don't do that! Please? One day you will move that script somewhere where the necessary aliases are not set and it will break again.
Instead set and use variables as shortcuts in your script:
#!/bin/bash
CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh
for file in "$@"
do
$CMDA "$file"
$CMDB "$file"
done
Aliases can't be exported so they're not available in shell scripts in which they aren't defined. In other words, if you define them in ~/.bashrc
they're not available to your_script.sh
(unless you source ~/.bashrc
in the script, which I wouldn't recommend but there are ways to do this properly).
However, functions can be exported and would be available to shell scripts that are run from an environment in which they are defined. This can be done by placing this in your bashrc:
foo() { echo "Hello World!" } export -f foo
As the Bash manual says, "For almost every purpose, shell functions are preferred over aliases."