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

如何将命令行参数传递给shell别名?,shell,alias,Shell,Alias,如何将命令行参数传递给别名?以下是一个示例: alias mkcd='mkdir $1; cd $1;' 别名mkcd='mkdir$1;cd$1;' 但在本例中,$xx是在别名创建时转换的,而不是在运行时。不过,我已经使用shell函数(在谷歌搜索了一点之后)创建了一个变通方法,如下所示: function mkcd(){ mkdir $1 cd $1 } 函数mkcd(){ mkdir$1 cd$1 } 只是想知道是否有一种方法可以生成接受CL参数的别名。 顺便说一句,我使用“bas

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

alias mkcd='mkdir $1; cd $1;' 别名mkcd='mkdir$1;cd$1;' 但在本例中,$xx是在别名创建时转换的,而不是在运行时。不过,我已经使用shell函数(在谷歌搜索了一点之后)创建了一个变通方法,如下所示:

function mkcd(){ mkdir $1 cd $1 } 函数mkcd(){ mkdir$1 cd$1 } 只是想知道是否有一种方法可以生成接受CL参数的别名。

顺便说一句,我使用“bash”作为默认shell。

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

实际上,bash别名是静态的,您无法实现自己想要的功能。相反,请使用您创建的函数


请查看此处以了解更多信息:。(是的,我知道它是mactips.org,但它是关于Bash的,所以不要担心。)

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

alias mkcd 'mkdir \!^; cd \!^1'
在ksh中,函数是一种方式。但如果您真的想使用alias:

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

要引用bash手册页,请执行以下操作:

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

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

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

我发现不能在
~/.cshrc
文件中编写函数。这里是接受参数的alias

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

alias fl "find . -name '\!:1'"     
Ex: >fl abc
其中abc是传递为的参数!:一,

下面是一个使用python的简单示例函数。你可以加入~/.bashrc
在第一个左曲括号后必须有一个空格
python命令需要在双引号中才能获得变量替换
别忘了结尾的分号

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


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

mkdir dirname&&cd$\ucode>


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

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

alias blah='function _blah(){ echo "First: $1"; echo "Second: $2"; };_blah'
运行以下命令:

blah one two
给出以下输出:

First: one
Second: two

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

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

不确定是否有其他shell

空别名将执行其参数:

alias DEBUG=

这对于OP没有用处,它的默认shell是bash。Sanjaya R的回答提到了4年前的csh别名。Sanjaya R的回答没有解释什么是
!:1
。我必须向下滚动才能看到这是一个论点。一个好的答案不会留下更多的问题,即使它不是针对OPs外壳类型的。有趣的是,我认为大家最近谈论的远程代码执行漏洞涉及到几乎完全相同的操作,但是在由原始用户输入设置的环境变量中@Floegipoky-因为它在别名中而不是在环境变量中,所以它有很大的不同。ShellShock的问题是,它在设置env var时运行。设置环境变量应该是一种安全的操作。设置上述别名时不会执行脚本,只有在运行别名时才会执行。也许应该指出,
csh
通常不是现代人想要使用的。alias-which-creates-a-function-then-executes-that-function间接寻址比较流行,但据我所知,它与正确的函数相比没有任何好处。(无论如何,函数应该正确地引用它的参数。)向下投票。很好的解决方案。bash新手提出的一些问题:函数是否必须用下划线命名(或者完全不同),或者这只是为了可读性?在定义函数时,尾随“_blah”的目的是什么?为什么在使用双引号代替单引号($1的解释不正确)时,即使在做一些不需要在$1周围加引号的事情时,它也不起作用?提前谢谢你的建议。我有一个可行的解决方案,但总是想了解更多关于它为什么有效的信息。@mynameispaulie该函数可以命名为任何名称。我使用了下划线前缀,因为这是防止名称冲突(即另一个同名函数)@mynameispaulie双引号允许
Bash
用传递给函数的参数替换
$1
$2
。单引号告诉Bash不要这样做。我看到这个别名/函数组合复制/粘贴了很多,但它似乎没有任何用处。标准的方法是使用一个合理的名称定义一次函数,而不使用别名。我看不出这比
函数blah()更可取。{echo“First:$1;echo“Second:$2”}
但是在
.bashrc
文件中创建别名时不需要函数。例如#通过用户alias service=“python-m SimpleHTTPServer$1”创建一个接受端口号的别名在.bashrc文件中进行更改后,请确保输入以下命令。~$你应该可以像这样使用它~$serve8998@kaizer1v,我在CentOS7.3 bash版本4.2.46上的观察结果是,您的建议并不像您认为的那样有效。因为您使用的是双引号,$1实际上被计算为一个空字符串,并且别名实际上是相同的
alias DEBUG=