在 Bash 中循环别名
Loop over aliases in Bash
我在 ~/.bash_aliases
中定义了几个 aliases
。他们用不同的环境变量设置调用相同的命令,所以我不必每次都输入这些。 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 '
完全相同。 "arguments" 只是附加到别名的扩展。
改为定义函数:
cmd1 () {
VAR=setting1 cmd "$@"
}
cmd2 () {
VAR=setting2 cmd "$@"
}
此外,别名扩展发生在 之前 参数扩展,这解释了您看到的错误。一旦 $cmd
扩展为 cmd1
,bash
不会尝试将 cmd1
扩展为别名;它只是将其视为无法找到的命令的名称。一旦应用了所有扩展,就会发生函数查找,因此您的循环
CMDs='cmd1 cmd2'
source ~/.bash_aliases
for cmd in CMDs ; do
"$cmd" list
done
现在可以使用了。 cmd1
被发现是一个函数,因此以 list
作为参数执行。 (您可能希望将函数存储在具有不同名称的文件中,但这并不重要。尽管有名称,.bash_aliases
只需要是一个有效的脚本,而不仅仅是别名的集合。)
您可以为此使用 eval
:
#!/bin/bash
shopt -s expand_aliases
alias xxx="printf '%s\n'"
alias yyy="echo"
for cmd in xxx yyy
do
eval $cmd foo bar bla
done
注意 eval
是个野兽,非常没有安全感。查看 Bash FAQ 048 指南。
我在 ~/.bash_aliases
中定义了几个 aliases
。他们用不同的环境变量设置调用相同的命令,所以我不必每次都输入这些。 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 '
完全相同。 "arguments" 只是附加到别名的扩展。
改为定义函数:
cmd1 () {
VAR=setting1 cmd "$@"
}
cmd2 () {
VAR=setting2 cmd "$@"
}
此外,别名扩展发生在 之前 参数扩展,这解释了您看到的错误。一旦 $cmd
扩展为 cmd1
,bash
不会尝试将 cmd1
扩展为别名;它只是将其视为无法找到的命令的名称。一旦应用了所有扩展,就会发生函数查找,因此您的循环
CMDs='cmd1 cmd2'
source ~/.bash_aliases
for cmd in CMDs ; do
"$cmd" list
done
现在可以使用了。 cmd1
被发现是一个函数,因此以 list
作为参数执行。 (您可能希望将函数存储在具有不同名称的文件中,但这并不重要。尽管有名称,.bash_aliases
只需要是一个有效的脚本,而不仅仅是别名的集合。)
您可以为此使用 eval
:
#!/bin/bash
shopt -s expand_aliases
alias xxx="printf '%s\n'"
alias yyy="echo"
for cmd in xxx yyy
do
eval $cmd foo bar bla
done
注意 eval
是个野兽,非常没有安全感。查看 Bash FAQ 048 指南。