Bash:在变量中使用别名

Jay*_*son 11 bash alias

我正在编写一个 bash 脚本,它将每个参数作为命令运行。这适用于 my 中的命令PATH,但不适用于别名。我可以在脚本中直接调用别名,但不能调用作为参数传递的别名。

问题(我假设)是别名在变量之前扩展。有没有办法从变量运行别名?

示例脚本:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done
Run Code Online (Sandbox Code Playgroud)

runall "echo test"工作,但runall "myalias"runall: line 8: myalias: command not found

Kev*_*vin 11

经过一些测试,我得出了以下结论:

  • 别名仅在交互模式下工作(添加-i到shebang)。
  • 当别名来自解释的源(在这种情况下,变量。
  • 您可以让 bash 将别名与eval $1. 请注意,eval使用变量创建的任何内容都是危险的,但由于脚本的全部内容需要任意执行,因此我不会对此进行过多处理。

从 bash 手册页:

当 shell 不是交互式时,别名不会扩展,除非使用 shopt 设置 expand_aliases shell 选项(请参阅下面的 SHELL BUILTIN COMMANDS 下的 shopt 描述)。

所以你可以添加shopt -s expand_aliases而不是-i.

还,

别名在读取命令时展开,而不是在执行时展开。

由于在读取命令之前不会扩展变量,因此不会使用别名进一步扩展它们。