如果我们在另一个别名 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 但没有成功。