How to pass command line arguments to a shell alia

2019-01-01 02:17发布

问题:

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.

回答1:

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.



回答2:

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


回答3:

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; }; _\'


回答4:

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



回答5:

You may also find this command useful:

mkdir dirname && cd $_

where dirname is the name of the directory you want to create



回答6:

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.)



回答7:

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



回答8:

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).



回答9:

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



回答10:

I think you are able to do it with shell functions if you are using bash: http://www.cyberciti.biz/faq/linux-unix-pass-argument-to-alias-command/



回答11:

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
$


回答12:

An empty alias will execute its args:

alias DEBUG=


标签: shell alias