如果我们在另一个别名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但没有取得成功。
答案 0 :(得分:1)
可以将问题简化为简单的别名。以下第一次失败:
alias A=ls ; A
要推迟展开,您可以使用eval
:
alias A=df ; eval A
(在bash和tcsh中测试过)。