检查这个脚本:
#!/bin/bash
if true;then
alias WeirdTest='uptime';shopt -s expand_aliases
WeirdTest
fi
WeirdTest
Run Code Online (Sandbox Code Playgroud)
第一次WeirdTest
执行它说“找不到命令”。
Gil*_*il' 10
这是 bash 的一个限制。引用手册:
有关别名的定义和使用的规则有些令人困惑。
Bash 在读取命令时扩展别名。从这个意义上说,一个命令由完整的命令(整个if … fi
块是一个复合命令)和完整的行组成(因此,如果您编写… fi; WeirdTest
而不是在 之后放置换行符fi
,则第二次出现的WierdTest
也不会被扩展)。在您的脚本中,当if
读取命令时,WeirdTest
别名还不存在。
一种可能的解决方法是定义一个函数:
if …; then
WeirdTest () { uptime; }
WeirdTest
fi
WeirdTest
Run Code Online (Sandbox Code Playgroud)
如果您想使用别名以便它可以调用同名的外部命令,您可以通过在函数command
前添加来实现。
WeirdTest () { command WeirdTest --extra-option "$@"; }
Run Code Online (Sandbox Code Playgroud)