313

如何将命令行参数传递给别名?这是一个示例:

别名 mkcd='mkdir $1; cd $1;'

但在这种情况下,$xx 在别名创建时而不是在运行时被翻译。但是,我已经使用 shell 函数(在谷歌搜索后)创建了一个解决方法,如下所示:

函数 mkcd(){
  mkdir $1
  1美元
}

只是想知道是否有办法制作接受 CL 参数的别名。
顺便说一句 - 我使用 'bash' 作为我的默认 shell。

4

11 回答 11

320

只是为了重申已为其他 shell 发布的内容,在Bash中进行以下工作:

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'

运行以下:

blah one two

给出以下输出:

First: one
Second: two
于 2014-03-27T10:23:09.807 回答
183

您找到了方法:创建一个函数而不是别名。C shell 有一个为别名做参数的机制,但是 bash 和 Korn shell 没有,因为函数机制更灵活并且提供了相同的功能。

于 2009-06-02T19:10:29.433 回答
59

你不能在 ksh 中,但你可以在 csh 中。

alias mkcd 'mkdir \!^; cd \!^1'

在 ksh 中,函数是要走的路。但是如果你真的很想使用别名:

alias mkcd='_(){ mkdir $1; cd $1; }; _'
于 2009-06-02T19:15:32.420 回答
17

引用 bash 手册页:

没有在替换文本中使用参数的机制。如果需要参数,则应使用 shell 函数(请参阅下面的函数)。

所以看起来你已经回答了你自己的问题——使用函数而不是别名

于 2009-06-02T19:15:52.717 回答
13

您可能还会发现此命令很有用:

mkdir dirname && cd $_

其中 dirname 是您要创建的目录的名称

于 2014-03-14T19:58:23.530 回答
7

最简单的方法是使用函数而不是别名。您仍然可以随时从 cli 调用函数。在 bash 中,您只需添加 function name() { command } 它加载与别名相同。

function mkcd() { mkdir $1; cd $1 ;}

不确定其他shell

于 2017-08-20T14:58:47.913 回答
5

我发现函数不能写在~/.cshrc文件中。这里在别名中接受参数

例如,传递给“查找”命令的参数

alias fl "find . -name '\!:1'"     
Ex: >fl abc

其中 abc 是作为 !:1 传递的参数

于 2013-06-18T19:45:59.337 回答
2

你实际上不能用 Bash 别名做你想做的事,因为别名是静态的。相反,请使用您创建的函数。

在这里查看更多信息: http: //www.mactips.org/archives/2008/01/01/increase-productivity-with-bash-aliases-and-functions/。(是的,我知道它是 mactips.org,但它是关于 Bash 的,所以不用担心。)

于 2009-06-02T19:14:14.717 回答
1

这适用于 ksh:

$ alias -x mkcd="mkdir \$dirname; cd \$dirname;"
$ alias mkcd
mkcd='mkdir $dirname; cd $dirname;'
$ dirname=aaa 
$ pwd
/tmp   
$ mkcd
$ pwd
/tmp/aaa

“-x”选项使别名“导出” - 别名在子shell中可见。

请注意,在脚本中定义的别名在该脚本中不可见(因为在加载脚本时会扩展别名,而不是在解释行时)。这可以通过在同一个 shell 中执行另一个脚本文件(使用点)来解决。

于 2009-07-22T15:08:57.133 回答
-2

这是一个使用 python 的简单示例函数。你可以坚持在〜/ .bashrc
你必须在第一个左花括号后有一个空格
python命令需要用双引号引起变量替换
不要忘记最后的分号

function count(){ python -c "for num in xrange($1):print num";}

$ count 6
0
1
2
3
4
5
$
于 2013-07-15T23:51:50.783 回答
-5

空别名将执行其 args:

alias DEBUG=
于 2017-11-02T18:56:21.300 回答