在另一个别名中新定义的别名,第一次执行将失败

时间:2013-05-09 10:44:51

标签: bash shell alias csh

如果我们在另一个别名A中定义和使用别名B,则第一次执行A将失败。例如,

alias A='alias B="which ls"; B;'

第一次执行看起来像(在bash中)

bash: B: command not found

上面的例子是一个简化的结构。在实践中,我们可能会隐含地满足这种用法。

原因可能是:当我们执行别名A时,所有扩展都在执行之前执行,但是当我们第一次执行A时B未定义。

那么有没有办法让第一次执行成功?

我遇到的情况比上面情况复杂。我的别名看起来像(在tcsh中)

  
    

别名A'cmd1; CMD2; B -v arg_of_B; CMD3; CMD4;'

  

其中,B是cmd2定义的别名。另外,B的定义看起来像(在tcsh中)

  
    

别名B'source /path/to/script.csh'

  

因此使用eval推迟B的执行可能不起作用,因为eval会派一个新的shell来执行命令。使这个更复杂的另一个因素是别名后面的参数。我尝试使用exec但没有取得成功。

1 个答案:

答案 0 :(得分:1)

可以将问题简化为简单的别名。以下第一次失败:

alias A=ls ; A

要推迟展开,您可以使用eval

alias A=df ; eval A

(在bash和tcsh中测试过)。