bash脚本中的大写命令别名?

问题描述

我有一个脚本,我正在尝试使其至少在某种程度上独立于平台。因为我不能指望我的用户的 PATH 或 shell 别名(已知其中一些人创建了与对 shell 有意义的“保留词”匹配的别名),所以我已经开始使用大写为所有非内置 shell 命令设置别名等价物。当我半手动完成时,这很好用,例如

AWK=/usr/bin/awk
DATE=/bin/date
GREP=/bin/grep

,但当我通过遍历命令数组在函数中尝试时效果不佳:

createaliases() {
    COMMANDS=(awk chmod date echo git mkdir)
    WHICH=/usr/bin/which

    for command in ${COMMANDS[@]}; do
        ${command^^}=$($WHICH ${command})
    done
}

,它会产生 AWK=/usr/bin/awk: No such file or directory 之类的错误。我尝试使用 string^^ up-casing 机制是否会干扰变量赋值?看起来shell实际上是在尝试运行(别名)命令,这不是我想要的。

感谢任何帮助!

解决方法

以下似乎有效:

shopt -s expand_aliases
createAliases() {
    COMMANDS=(awk chmod date echo git mkdir)
    WHICH=/usr/bin/which

    for command in ${COMMANDS[@]}; do
        alias ${command^^}=$($WHICH ${command})
    done
}

使用 alias 前缀分配实际上注册了所需的别名。

根据 https://www.thegeekdiary.com/how-to-make-alias-command-work-in-bash-script-or-bashrc-file/

,行 shopt -s expand_aliases 使您可以在脚本中的任何位置使用这些别名