我正在编写一个 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; }