I have a .bash_profile
and in that I have a set of aliases. Those aliases at the moment execute only a single command and it was fairly easy. I would however like to do two things with a new alias that I'm trying to create.
- CD into a directory
- Run a command from that directory
Best Answer
To execute a command with a specific working directory, one usually does
The parentheses around the
cd ...
means that the command(s) therein runs in a subshell. Changing the working directory in a subshell makes it so that the current working directory of the calling shell is not changed, i.e., after having called this command, you would still be located in the same directory where you started.Example:
This can not be turned into a generic alias as an alias can not take any arguments.
For a specific directory and utility, one could do
but for the general case, you would have to use a shell function:
or
Replacing the curly braces with parentheses around the body of the function makes the function execute in its own subshell.
This would be used as
which would run the script
script.sh
located in the directory$HOME/somedir
, with$HOME/somedir
as the working directory, orwhich would provide you with a directory listing in "long format" of the root directory.
The shell function takes its first argument and tries to change to that directory. If that works, it shifts the directory name off from the positional parameters (the command line argument list) and executes the command given by the rest of the arguments.
command
is a built-in command in the shell which simply executes its arguments as a command.All of this is needed if you want to execute a command with a changed working directory. If you just want to execute a command located elsewhere, you could obviously use
but this would run
script.sh
located in$HOME/somedir
with the current directory as the working directory.Another way of executing a script located elsewhere without changing the working directory is to add the location of the script to your
PATH
environment variable, e.g.Now
script.sh
in$HOME/somedir
will be able to be run from anywhere by just usingAgain, this does not change the working directory for the command.