问题描述
我有一个脚本,我正在尝试使其至少在某种程度上独立于平台。因为我不能指望我的用户的 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
使您可以在脚本中的任何位置使用这些别名