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
。请改用type
或command -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脚本中的大写命令别名?的主要内容,如果未能解决你的问题,请参考以下文章