views:

527

answers:

4

I am trying to use aliases in a non-interactive bash shell. I have defined my aliases in ~/.bashrc and I have set the variable BASH_ENV=~/startUpFile . The contents of the startUpFile are source ~/.bashrc

I can see that my aliases are recognized, when I execute the "alias" command. However, if I try to use an alias defined in ~/.bashrc, Bash can't recognized it. It gives me the unknown command error.

With the TCSH shell it is pretty easy to do this because the ~/.cshrc file is always read.

Any ideas how I can do this with a Bash shell?

+1  A: 

You have to

shopt -s expand_aliases

in the file pointed to in your BASH_ENV

Vinko Vrsalovic
Yeah that can be done, but it still does not work for me.
Nishith
You need expand_aliases
Vinko Vrsalovic
Thanks, it works now
Nishith
+5  A: 

.bashrc is only processed by interactive shells.

In addition, aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt. Unless, of course, POSIX mode is invoked by calling the shell with the name sh instead of bash.

People who use aliases a lot often source their .bashrc at the end of their profile so that the aliases are there even for non-interactive shells. This might not be the best way, but it is pretty common.

It's things like this that lead me to believe that in the 21st century we should abandon shell scripts in favor of a full-blown language like Python. It's a lot more predictable.

Michael Dillon
python makes for an abysmal interactive language. You can't cut/paste random bits of code unless the whitespace is exactly what you need.tclsh makes for a darn decent shell though -- it has built-in the ability to exec shell commands if the command you type isn't a known tcl command. Plus, it's very nature makes interactive use feasible.However, as much as a fan of Tcl that I am, I still prefer good ol' bash for interactive use. It's a pity tksh never quite reached escape velocity.
Bryan Oakley
The /etc/profile trick will only work for non-interactive shells being supplied the --login option
Vinko Vrsalovic
You are right, Python makes an abysmal interactive language. You should use bash. But if you have to write a script, do it in Python. Since it is an object-oriented language, you reuse bits of code by writing them as classes, methods and functions. Scripting is the same as programming so use a powerful programming language like Python. But for interaction, for two or three command pipelines, bash is fine.
Michael Dillon
Opinion alert! Opinion alert! (Not that there is inherently anything wrong with Python -- save it being dynamically typed O.o -- but Ruby and Perl (and who knows what else) are also good contenders in that market)
pst
+2  A: 

The command shopt -s expand_aliases will allow alias expansion in non-interactive shells.

Jim Lewis
Thanks Michael and Jim, it works now.
Nishith
A: 

This doesn't work.

asdf