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

Posted

技术标签:

【中文标题】bash脚本中的大写命令别名?【英文标题】:Uppercased command aliasing in bash script? 【发布时间】:2021-01-29 22:16:41 【问题描述】:

我有一个脚本,我正在尝试使其至少在某种程度上独立于平台。因为我不能指望我的用户的 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^^ 向上大小写机制是否会干扰变量赋值?看起来 shell 实际上正在尝试运行(别名)命令,这不是我想要的。

感谢任何帮助!

【问题讨论】:

别名在非交互脚本中默认不展开。 AWK=/usr/bin/awk 将字符串/usr/bin/awk 分配给变量 AWK;如果,正如您的标题和描述所述,您希望创建一个别名,那么您需要alias AWD=/usr/bin/awk;第二个问题......你提到你不能依赖PATH中的设置,但是你使用which(搜索PATH)来找到你的命令数组的位置......当PATH 完全是垃圾,which awk 回来告诉你no awk in : $PATH 顺便说一句,which may return wrong paths in bash。请改用typecommand -v Bash 有两个截然不同的、不相关的概念:变量和别名。示例别名:alias ls='ls -l' 后跟 ls。示例变量:var='ls'; $var。听起来您正在使用“别名”一词来描述变量,从而导致答案和 cmets 混淆。请参阅this question,了解如何以字符串形式分配变量。请注意,which 通过检查 PATH 来工作,因此如果您不能依赖 PATH,那么您也不能依赖 which 【参考方案1】:

以下似乎有效:

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 行使您可以在脚本中的任何位置使用这些别名

【讨论】:

以上是关于bash脚本中的大写命令别名?的主要内容,如果未能解决你的问题,请参考以下文章

bash中的别名的多个命令,当第一个是ssh时

bash别名中的Git自动完成?

在非交互式 shell 中展开别名

终端:-bash:'别名:找不到命令

bash的基础特性二

Bash shell 特点总结