繁体   English   中英

在Bash中循环别名

[英]Loop over aliases in Bash

我在~/.bash_aliases定义了几个aliases 他们使用不同的环境变量设置调用同一命令,因此我不必每次都键入这些命令。 aliases在交互式外壳中可以正常工作。

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

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

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

但是,此脚本会产生错误

“找不到相关命令”

对于每个alias 我已经尝试了所有种类的变体,但看不到Bash的内部原理在这里如何工作。 -欢迎有识之士!

别名不带参数。 发生了什么事是$@扩大到什么时候你定义的别名,所以它的行为完全一样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必须是有效的脚本,而不仅仅是别名的集合。)

您可以为此使用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中的指南。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM