0

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

4

1 回答 1

1

这个问题可以简化为一个简单的别名。以下也是第一次失败:

alias A=ls ; A

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

alias A=df ; eval A

(在 bash 和 tcsh 中测试)。

于 2013-05-09T10:48:33.750 回答