How to run an alias in a shell script?
I have an executable file mpiexec
, whose full path is ~/petsc-3.2-p6/petsc-arch/bin/mpiexec
. Since I want to execute this command in different directories (without having to retype the entire path), I setup an alias in my home .bashrc
file:
alias petsc="~/petsc-3.2-p6/petsc-arch/bin/mpiexec"
which allows me to execute this mpiexec
file at the command prompt easily by typing:
petsc myexecutable
I tried to write a shell script file, named script
, using my new alias petsc
as a command. After giving my shell script the appropriate permissions (using chmod
), I tried to run the script. However, it gave me the following error:
./script: line 1: petsc: command not found
I know that I could just write the full path to the mpiexec
file, but it is cumbersome to write the full path everytime that I want to write a new script. Is there a way that I can use my alias petsc
inside the script file? Is there a way I can edit my .bashrc
or .bash_profile
to make this happen?
Some options:
In your shell script use the full path rather then an alias.
-
In your shell script, set a variable, different syntax
petsc='/home/your_user/petsc-3.2-p6/petsc-arch/bin/mpiexec' $petsc myexecutable
-
Use a function in your script. Probably better if
petsc
is complexfunction petsc () { command 1 command 2 } petsc myexecutable
-
Source your aliases
shopt -s expand_aliases source /home/your_user/.bashrc
You probably do not want to source your .bashrc
, so IMO one of the first 3 would be better.
Aliases are deprecated in favor of shell functions. From the bash manual page:
For almost every purpose, aliases are superseded by shell functions.
To create a function and export it to subshells, put the following in your ~/.bashrc
:
petsc() {
~/petsc-3.2-p6/petsc-arch/bin/mpiexec "$@"
}
export -f petsc
Then you can freely call your command from your shell scripts.
In bash 4 you can use special variable: $BASH_ALIASES
.
For example:
$ alias foo="echo test"
$ echo ${BASH_ALIASES[foo]}
echo test
$ echo `${BASH_ALIASES[foo]}` bar
test bar
Alternatively define as variable then use command substitution or eval
.
So for example, instead of defining the alias such as:
alias foo="echo test"
define it as:
foo="echo test"
instead. Then execute it by either:
find . -type f -exec sh -c "eval $foo" \;
or:
find . -type f -exec sh -c "echo `$foo`" \;
ALIASES
...
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 the real answer to this question, for those looking to use actual aliases in shell scripts instead of alternatives to them, is:
#!/bin/bash
shopt -s expand_aliases
alias foo=bar
foo whatever
As for why I'd want to do this: Due to unusual circumstances, I need to trick a Dockerfile into thinking it's a shell script.