在函数内执行传递的别名?

Mr.*_*ama 14 bash

背景:

我正在尝试创建一个在设定的时间间隔内运行命令的函数,因为我无法访问"监视"程序.简化为最基本的,我正在尝试编写的函数runit() { $1; }.

什么有效:

当我传递非别名的东西时,这工作正常和花花公子.例如,runit "ls -l"工作正常.我从ls -l命令中获得了完整的输出.

什么行不通:

当我传给别名时,问题就开始了.例如,设置alias ll="ls -l"然后调用runit "ll"将导致-bash: ll: command not found.

我尝试过的事情:

当我对别名进行硬编码时runit() { ll; },它工作得很好并且给了我期望的东西.


我觉得我可能会忽视某些东西,但我无法将手指放在它上面.
为什么硬编码别名工作正常,但将其传递给函数会失败?
有没有办法完成我想要做的事情?

che*_*ner 8

bash别名的man page页面讨论(强调我的):

读取命令时会扩展别名,而不会在执行时扩展别名.因此,在读取下一行输入之前,与另一个命令出现在同一行上的别名定义不会生效.该行上别名定义后面的命令不受新别名的影响.执行函数时,此行为也是一个问题. 读取函数定义时会扩展别名,而不是在执行函数时扩展别名,因为函数定义本身就是复合命令.因此,在执行该函数之后,函数中定义的别名才可用.为安全起见,请始终将别名定义放在单独的行中,并且不要在复合命令中使用别名.

您可以使用type命令在函数中观察此效果:

$ run_it () { ll; }
$ type run_it
Run Code Online (Sandbox Code Playgroud)

你应该看到函数的主体包含一个调用ls -l,而不是ll.

别名部分的最后一句:

对于几乎所有目的,别名都被shell函数取代.

我对该行的解释是:如果您认为要使用别名,请先尝试编写函数.除非功能明显无法满足您的需要,否则请勿使用别名.


小智 7

你可以这样使用eval

$ runit() { eval $1; }
$ alias ll="ls -l"
$ runit "ll"
Run Code Online (Sandbox Code Playgroud)

eval$1在执行之前扩展任何别名。