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