如何将命令行参数传递给Shell别名?


288

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

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

但是在这种情况下,$ xx在别名创建时而不是在运行时转换。但是,我已经使用shell函数(在进行了少许搜索之后)创建了一种变通方法,如下所示:

函数mkcd(){
  mkdir $ 1
  cd $ 1
}

只是想知道是否有一种方法可以使别名接受CL参数。
顺便说一句-我使用“ bash”作为默认外壳。



2
O / T,但是作为执行mkcd函数的一种替代方法,您可以编写mkdir mydirectoryname && cd $_
默阿拉

Answers:


174

您找到了方法:创建函数而不是别名。C外壳具有用于对别名进行参数处理的机制,而bash和Korn外壳则没有,因为函数机制更灵活并且提供相同的功能。


但是,在.bashrc文件中创建别名时不需要功能。例如,#创建一个别名,该别名将由用户别名serve =“ python -m SimpleHTTPServer $ 1”占用端口号。在.bashrc文件中进行更改后,请确保输入以下命令。〜$ source .bashrc您应该可以像这样使用它~~
serv

8
@ kaizer1v,我对CentOS7.3 bash版本4.2.46的观察是,您的建议没有按您认为的那样起作用。因为您使用的是双引号,所以实际上将$ 1评估为一个空字符串,并且该别名实际上与别名serve =“ python -m SimpleHTTPServer”相同,因此在该别名之后传递的所有内容也会在命令行中传递。如果您尝试使用此设置-x; 别名serve =“ python -m SimpleHTTPServer $ 1&”,您将看到错误/问题。您的参数和alias命令都作为单独的命令运行。
PatS

279

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

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

运行以下命令:

blah one two

给出以下输出:

First: one
Second: two

4
很好的解决方案。bash新手提出的一些问题:该函数是否必须用下划线命名(或完全不同),还是仅出于可读性?在定义函数时,尾随“; _blah”的目的是什么?为什么使用双引号代替单引号($ 1无法正确解释),即使执行不需要在$ 1周围加引号的操作,为什么也不起作用?在此先感谢您的建议。我有一个可行的解决方案,但始终想了解更多有关其工作原理的信息。
mynameispaulie 2014年

4
@mynameispaulie该函数可以命名为任何东西。我使用了下划线前缀,因为这是防止名称冲突的常见技巧(例如,另一个具有相同名称的函数)
Thomas Bratt 2014年

6
@mynameispaulie双引号允许Bash替换$1$2带有传递给函数的参数。单引号告诉Bash不要这样做。
Thomas Bratt 2014年

5
我看到这个别名/功能组合经常被复制/粘贴,但是似乎没有任何用处。标准方法是使用一个理智的名称一次定义函数,并且不使用别名。
三人房

16
我不明白这是怎么优于function blah(){ echo "First: $1"; echo "Second: $2"; }
勒内Nyffenegger

57

您不能在ksh中使用,但可以在csh中使用。

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

在ksh中,函数是必经之路。但是,如果您真的想使用别名:

alias mkcd='_(){ mkdir $1; cd $1; }; _'

有趣的是,我认为每个人最近都在谈论的远程执行代码漏洞几乎完全是在做同样的事情,但是环境变量是由原始用户输入设置的。 openwall.com/lists/oss-security/2014/09/24/11
Floegipoky

@Floegipoky-因为它是别名而不是env var,所以它有很大的不同。ShellShock的问题在于,它会在设置env var时运行。设置环境变量应该是安全的操作。设置上述别名时,只有运行别名时,才会执行脚本。
Sanjaya R 2014年

也许应该指出,csh现代人通常不应该使用它。创建函数然后执行该函数的别名相对比较流行,但据我所知,它比适当的函数没有任何好处。(无论如何,函数应该正确地引用其参数。)
三胞胎2016年

17

引用bash手册页:

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

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



5

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

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

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

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


4
对于默认外壳为bash的OP而言,这没什么用。Sanjaya R的答案在4年前提到了csh别名。
基思·汤普森

1
Sanjaya R的答案没有说明!:1含义。我必须向下滚动才能看到这里是论点。一个好的答案不会留下更多的问题,即使它不是针对OPs shell类型的。
searchengine27

4

最简单的方法是使用函数而不是别名。您仍然可以随时从cli调用函数。在bash中,您可以仅添加函数名(){命令},该函数的加载方式与别名相同。

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

不确定其他外壳



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中执行另一个脚本文件(使用点)来解决。



-2

这是一个使用python的简单示例函数。您可以使用〜/ .bashrc。
第一个左花括号后必须有一个空格
。python命令必须用双引号引起来,以获取变量替换。
不要忘了最后的分号

函数count(){python -c“ for xrange($ 1)中的num:print num”;}

$ count 6
0
1
2
3
4
5
$

-4

空别名将执行其args:

alias DEBUG=

12
我的代表发现您是SO(Stack Overflow)的新手。请不要对您的答案投反对票。它被否决了,因为它实际上没有回答OP(原始海报)要求回答的问题。坚持下去,继续努力。另外,在回答问题时,请尝试包括一个简单的示例,说明您的答案如何工作并显示输出。这将帮助其他人了解您的答案如何工作。
PatS
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.