2009-06-02 173 views
203

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

 
alias mkcd='mkdir $1; cd $1;' 

但是,在这种情况下,$ XX是在别名得到翻译创建时间,而不是在运行时。我有,但是,创建使用shell功能的解决方法(使用Google后略)象下面这样:

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

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

+1

的可能的复制[制作一击别名需要一个参数?](https://开头计算器.com/questions/7131670/make-a-bash-alias-that-takes-a-parameter) – tripleee 2017-07-11 03:38:05

回答

136

你找到了办法:创建一个函数,而不是别名。 C shell有一个用于处理别名参数的机制,但bash和Korn shell不这样做,因为函数机制更加灵活并且提供了相同的功能。

+0

但是,在`.bashrc`文件中创建别名时不需要函数。 例如 #创建别名由用户 别名服务需要的端口数=“蟒蛇-m SimpleHTTPServer $ 1” 使在.bashrc文件的更改后,请确保您输入以下命令。 〜$源的.bashrc 您应该能够使用像这样 〜$ 8998发球@ – kaizer1v 2017-11-10 03:46:43

+2

kaizer1v,我在CentOS7.3 bash的版本4.2.46的观察是,当你认为你的建议不工作它确实如此。因为你使用的是双引号,所以$ 1实际上被评估为一个空字符串,并且别名实际上与别名serve =“python -m SimpleHTTPServer”相同,所以无论你在别名之后传递哪个别名,都是在命令行上传递的。如果你尝试这个设置-x;别名serve =“python -m SimpleHTTPServer $ 1&”你会看到错误/问题。你的参数和别名命令都作为单独的命令运行。 – PatS 2018-02-13 17:33:08

48

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

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

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

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

作为一个有趣的方面说明,我认为每个人最近讨论的远程代码执行漏洞都涉及到几乎完全相同的事情,但是在由原始用户输入设置的环境变量中。 http://www.openwall.com/lists/oss-security/2014/09/24/11 – Floegipoky 2014-09-25 13:41:14

+0

@Floegipoky - 因为它在一个别名而不是一个env var,它的本质是不同的。 ShellShock问题在于它在env var设置时运行。设置一个env var应该是一个安全的操作。只有在运行别名时才会执行设置上述别名时的脚本。 – 2014-09-26 17:11:17

+0

这也适用于bash – 2016-01-26 14:07:06

15

引述bash手册页:

没有为置换文本中使用参数的机制。如果需要 参数,壳函数应使用(见功能以下 )。

所以看起来你已经回答了你自己的问题 - 使用功能,而不是一个别名

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

我发现功能无法在〜/ .cshrc文件写入..下面这需要参数

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

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

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

+2

这对OP的默认shell是bash没有用处。而Sanjaya R的回答在4年前提到了csh别名。 – 2013-06-18 19:50:53

0

下面是一个简单的使用python的示例函数。你能坚持在〜/ .bashrc
你得有第一个左花括号
python命令需要在双引号来获取变量替换后空格
不要忘记分号结束

函数count(){蟒蛇-c “在x范围($ 1)NUM:打印张数”;}

$ count 6 
0 
1 
2 
3 
4 
5 
$ 
8

您也可以找到这个命令非常有用:

mkdir dirname && cd $_

,其中目录名是你要创建的目录的名称

191

只是为了重申一下已经公布的其他炮弹,在猛砸了以下工作:

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

运行如下:

blah one two 

给出如下输出:

First: one 
Second: two 
1

最简单的方法是使用函数不别名。你仍然可以在任何时候从cli调用一个函数。在bash中,你可以添加函数名称(){命令}它加载相同的别名。

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

不清楚其他炮弹

-2

一个空的别名将执行其ARGS:

alias DEBUG= 
相关问题