是否有某种方法可以使别名扩展在 Bash 上的 if...fi 中起作用?

Aqu*_*wer 6 bash alias

检查这个脚本:

#!/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)