我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 的内部结构在这里是如何工作的。-- 欢迎任何见解!
别名不接受参数。发生的情况是,当您定义别名时,它不会$@扩展到任何内容,因此它的行为与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必须是一个有效的脚本,而不仅仅是别名的集合。)