bash: 无法在同一行中设置和使用别名

12

我希望第二行显示foo而不是命令未找到

$ alias foo="echo bac" ; foo;
-bash: foo: command not found
$ foo
bac
$

为什么第二行不会显示foo?以下Shell测试结果都一样:

  • bash 3.2.5
  • zsh 5.0.8
  • dash 0.5.9
  • busybox 1.25.0
2个回答

10
您看到的行为在Bash参考手册中有描述(我强调):
规定别名的定义和使用有点混乱。Bash在执行该行中的任何命令之前,始终会读取至少一条完整的输入行。别名在读取命令时扩展,而不是在执行命令时扩展。因此,出现在另一个命令相同行上的别名定义直到读取下一行的输入后才生效。该行别名定义后面的命令不受新别名的影响。
其他shell可能也是这样运作的。

3

为了在bash中在同一行设置和使用alias,您可以使用以下命令:

eval $'alias df5=df\ndf5 -h'

(来源:Hauke Laging解决方法 + Kusalananda解决方法)。


命令的解释:

  • 根据bash手册中Tom Fenech所指出的,“与另一个命令在同一行上出现的别名定义直到读取下一行输入才生效”,因此我们使用eval并在alias定义和其使用之间放置一个新行。
  • 来自Kusalananda解决方法

    “$'...'是一个'C字符串',bash会在将其传递给eval之前将其中的\n扩展为字面换行符。”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接