How to pass command line arguments to a shell alias?
ShellAliasShell Problem Overview
How do I pass the command line arguments to an alias? Here is a sample:
alias mkcd='mkdir $1; cd $1;'
But in this case the $xx is getting translated at the alias creating time and not at runtime. I have, however, created a workaround using a shell function (after googling a little) like below:
function mkcd(){ mkdir $1 cd $1 }
Just wanted to know if there is a way to make aliases that accept CL parameters.
BTW - I use 'bash' as my default shell.
Shell Solutions
Solution 1 - Shell
Just to reiterate what has been posted for other shells, in Bash the following works:
alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'
Running the following:
blah one two
Gives the output below:
First: one
Second: two
Solution 2 - Shell
You found the way: create a function instead of an alias. The C shell has a mechanism for doing arguments to aliases, but bash and the Korn shell don't, because the function mechanism is more flexible and offers the same capability.
Solution 3 - Shell
You cannot in ksh, but you can in csh.
alias mkcd 'mkdir \!^; cd \!^1'
In ksh, function is the way to go. But if you really really wanted to use alias:
alias mkcd='_(){ mkdir $1; cd $1; }; _'
Solution 4 - Shell
To quote the bash man page:
> There is no mechanism for using arguments in the replacement text. If arguments are needed, a shell function should be used (see FUNCTIONS below).
So it looks like you've answered your own question -- use a function instead of an alias
Solution 5 - Shell
You may also find this command useful:
mkdir dirname && cd $_
where dirname is the name of the directory you want to create
Solution 6 - Shell
The easiest way, is to use function not alias. you can still call a function at any time from the cli. In bash, you can just add function name() { command } it loads the same as an alias.
function mkcd() { mkdir $1; cd $1 ;}
Not sure about other shells
Solution 7 - Shell
I found that functions cannot be written in ~/.cshrc
file. Here in alias which takes arguments
for example, arguments passed to 'find' command
alias fl "find . -name '\!:1'"
Ex: >fl abc
where abc is the argument passed as !:1
Solution 8 - Shell
You actually can't do what you want with Bash aliases, since aliases are static. Instead, use the function you have created.
Look here for more information: http://www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-functions/. (Yes I know it's mactips.org, but it's about Bash, so don't worry.)
Solution 9 - Shell
This works in ksh:
$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa
$ pwd
/tmp
$ mkcd
$ pwd
/tmp/aaa
The "-x" option make the alias "exported" - alias is visible in subshells.
And be aware of fact that aliases defined in a script are not visible in that script (because aliases are expanded when a script is loaded, not when a line is interpreted). This can be solved with executing another script file in same shell (using dot).
Solution 10 - Shell
> Here's a simple example function using python. You can stick in ~/.bashrc
> You gotta have a space after the first left curly bracket
> The python command needs to be in double quotes to get the variable substitution
> Don't forget that semicolon at the end
function count(){ python -c "for num in xrange($1):print num";}
$ count 6
0
1
2
3
4
5
$
Solution 11 - Shell
An empty alias will execute its args:
alias DEBUG=