gpt4 book ai didi

bash - 在 Bash 中循环别名

转载 作者:行者123 更新时间:2023-12-05 09:15:17 25 4
gpt4 key购买 nike

我在~/.bash_aliases 中定义了几个别名。他们用不同的环境变量设置调用相同的命令,所以我不必每次都输入这些。 别名 在交互式 shell 中工作正常。

alias cmd1='VAR=setting1 cmd $@'
alias cmd2='VAR=setting2 cmd $@'

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

#!/bin/bash
shopt -s expand_aliases
source ~/.bash_aliases
CMDs='cmd1 cmd2'
for cmd in CMDs ; do
$cmd list
done

但是,这个脚本会产生错误

"command not found"

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

最佳答案

别名不带参数。发生的事情是 $@ 在您定义别名时扩展为 nothing,因此它的行为与 alias cmd1='VAR=setting1 cmd '。 “参数”只是附加到别名的扩展。

改为定义函数:

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

cmd2 () {
VAR=setting2 cmd "$@"
}

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

CMDs='cmd1 cmd2'
source ~/.bash_aliases
for cmd in CMDs ; do
"$cmd" list
done

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

关于bash - 在 Bash 中循环别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52793262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com