Bash:在变量中使用别名

Bash:在变量中使用别名

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

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

示例脚本:

#!/bin/bash
# File: runall

shopt -s expand_aliases
source ~/.aliases

while (( "$#" )); do
    $1
    shift
done

runall "echo test"有效,但runall "myalias"给出runall: line 8: myalias: command not found

答案1

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

  • 别名仅在交互模式下有效(添加-i到 shebang)。
  • 当别名来自解释源(在本例中为变量)时,不会对其进行求值。
  • 您可以让 bash 使用带有 的别名eval $1。请注意,eval使用变量创建的任何内容都是危险的,但由于脚本的整个要点需要任意执行,因此我不会对此做太大的事情。

从 bash 手册页:

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

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

还,

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

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

答案2

我遇到了类似的问题,并设法通过将别名转换为函数来解决我的问题,如上所述这个网站,这对我有用。

例如

alias lsd="ls -lash"

function lsd() { ls -lash; }

相关内容