我希望第二行说foo
而不是command not found
:
$ alias foo="echo bac" ; foo;
-bash: foo: command not found
$ foo
bac
$
为什么第二行不说foo
?使用以下 shell 进行测试,行为相同:
- 重击 3.2.5
- zsh 5.0.8
- 破折号 0.5.9
- 忙箱 1.25.0
我希望第二行说foo
而不是command not found
:
$ alias foo="echo bac" ; foo;
-bash: foo: command not found
$ foo
bac
$
为什么第二行不说foo
?使用以下 shell 进行测试,行为相同:
您看到的行为在Bash 参考手册(重点是我的)中进行了描述:
关于别名的定义和使用的规则有些混乱。在执行该行的任何命令之前,Bash 总是读取至少一个完整的输入行。别名在读取命令时扩展,而不是在执行命令时扩展。因此,与另一个命令出现在同一行的别名定义在读取下一行输入之前不会生效。该行别名定义之后的命令不受新别名的影响。
据推测,其他外壳也以这种方式运行。
要在 bash 的同一行中设置和使用alias
,可以使用:
eval $'alias df5=df\ndf5 -h'
(学分:Hauke Laging的解决方法+ Kusalananda的解决方法)。
命令解释:
eval
并在 alias
定义和它的用途。"The
$'...'
是一个 "C 字符串",在bash
将\n
其传递给eval
.