Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash中循环别名_Bash_Alias - Fatal编程技术网

在Bash中循环别名

在Bash中循环别名,bash,alias,Bash,Alias,我在~/.bash_别名中定义了几个别名。它们使用不同的环境变量设置调用相同的命令,因此我不必每次都键入这些。别名在交互式壳中工作良好 alias cmd1='VAR=setting1 cmd $@' alias cmd2='VAR=setting2 cmd $@' 现在我想一起调用所有这些命令变量,每个变量都有选项列表。为此,我在Bash中设置了以下脚本: #!/bin/bash shopt -s expand_aliases source ~/.bash_aliases CMDs='cmd

我在~/.bash_别名中定义了几个别名。它们使用不同的环境变量设置调用相同的命令,因此我不必每次都键入这些。别名在交互式壳中工作良好

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
但是,此脚本会产生错误

找不到命令


对于调用的每个别名。我已经尝试了各种变体,但没有看到Bash的内部是如何工作的欢迎有任何见解

别名不接受参数。所发生的情况是,定义别名时,$@将扩展为零,因此其行为与alias cmd1='VAR=setting1 cmd'完全相同。这些参数只是附加到别名的扩展中

改为定义函数:

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\u别名必须是有效的脚本,而不仅仅是别名的集合。

别名不接受参数。所发生的情况是,定义别名时,$@将扩展为零,因此其行为与alias cmd1='VAR=setting1 cmd'完全相同。这些参数只是附加到别名的扩展中

改为定义函数:

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\u别名必须是有效的脚本,而不仅仅是别名的集合。

您可以使用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进行以下操作:

#!/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

注意力评估是一种野兽,非常不安全。查看指南。

非常感谢您分享您的知识,切普纳!我认为缺少的信息是,别名扩展发生在参数扩展之前。您非常详细的解决方案非常有意义。非常感谢您分享您的知识,切普纳!我认为缺少的信息是,别名扩展发生在参数扩展之前。您非常详细的解决方案非常有意义。感谢您分享此补充解决方案,@A.H。因为它看起来非常简单,我感谢您再次提醒我注意。感谢您分享此补充解决方案,@A.H.因为它看起来非常简单,我感谢你的提醒。谢谢你帮我格式化我的帖子@Cyrus!谢谢你帮我格式化我的帖子,@Cyrus!