在 Bash 中循环别名

sm8*_*8ps 1 bash alias

我aliases在~/.bash_aliases. 他们使用不同的环境变量设置调用相同的命令,所以我不必每次都输入这些。在aliases做工精细的交互式shell。

alias cmd1='VAR=setting1 cmd $@'
alias cmd2='VAR=setting2 cmd $@'
Run Code Online (Sandbox Code Playgroud)

现在我想将所有这些命令变体一起调用,每个变体都带有选项“list”。为此,我在 Bash 中设置了以下脚本:

#!/bin/bash
shopt -s expand_aliases
source ~/.bash_aliases
CMDs='cmd1 cmd2'
for cmd in CMDs ; do
    $cmd list
done
Run Code Online (Sandbox Code Playgroud)

但是,此脚本会产生错误

“找不到相关命令”

对于每个alias调用。我已经尝试了各种变体,但没有看到 Bash 的内部结构在这里是如何工作的。-- 欢迎任何见解!

che*_*ner 5

别名不接受参数。发生的情况是,当您定义别名时,它不会$@扩展到任何内容,因此它的行为与alias cmd1='VAR=setting1 cmd '. “参数”只是简单地附加到别名的扩展。

改为定义函数:

cmd1 () {
    VAR=setting1 cmd "$@"
}

cmd2 () {
    VAR=setting2 cmd "$@"
}
Run Code Online (Sandbox Code Playgroud)

此外,别名扩展发生在参数扩展之前,这解释了您看到的错误。一旦$cmd扩展为cmd1,bash就不会尝试扩展cmd1为别名;它只是将它视为它找不到的命令的名称。一旦应用了所有扩展,就会进行函数查找,因此您的循环

CMDs='cmd1 cmd2'
source ~/.bash_aliases
for cmd in CMDs ; do
  "$cmd" list
done
Run Code Online (Sandbox Code Playgroud)

现在将工作。cmd1被发现是一个函数,因此list作为它的参数执行。(您可能希望将函数存储在具有不同名称的文件中,但这并不重要。尽管名称如此,但它.bash_aliases必须是一个有效的脚本,而不仅仅是别名的集合。)