如何在 Bash 中创建一个实际上扩展另一个同名别名的别名?
为什么:
我曾经GREP_OPTIONS
做过.bashrc
这样的事情:
GREP_OPTIONS="-I --exclude=\*~"
我还有一个脚本(比方说,setup-java.sh
),在处理一些 Java 项目之前我会调用它。它将包含以下行:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
如果我也使用 Sass,那么我会调用setup-sass.sh
其中包含以下行:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
但GREP_OPTIONS
已弃用显然标准解决方案是创建一个别名或一些脚本......
答案1
Bash 将别名的值存储在一个名为
BASH_ALIASES
:
$ alias foo=bar
$ echo ${BASH_ALIASES[foo]}
bar
和参数扩展 我们可以获取最后设置的别名(如果存在)或默认值:
alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~"
现在只需执行以下操作setup-java.sh
:
alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~ --exclude-dir=classes"
...最后setup-sass.sh
:
alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~ --exclude-dir=\*/.sass-cache"
如果调用这三行,我们就会得到我们想要的:
$ echo ${BASH_ALIASES[grep]:-grep}
grep -I --exclude=\*~ -I --exclude=\*~ --exclude-dir=classes -I --exclude=\*~ --exclude-dir=\*/.sass-cache
答案2
aliases
如果您以空格结束它们,则链。
alias print='printf %s\\n ' hey='"hello, fine fellow" '
print hey
hello, fine fellow
如果你足够疯狂,你可以用这种方式编写整个脚本。无论如何,如果您想扩展别名,只需确保要扩展的别名以空格结尾,然后再添加另一个即可。
alias grep='printf "%s " -I --exclude=\*~ ' \
exdir=' --exclude-dir=classes ' \
exsass='--exclude-dir=\*/.sass-cache '
grep exdir exsass exdir exsass
-I --exclude=*~ --exclude-dir=classes --exclude-dir=*/.sass-cache --exclude-dir=classes --exclude-dir=*/.sass-cache
答案3
在这里,函数是比可扩展别名更好的选择。
grep_options=( )
grep() {
exec /usr/bin/grep "${grep_options[@]}" ${GREP_OPTIONS} "$@"
}
这样,您就有两个选项可以向环境添加选项:
修改
grep_options
数组;这正确支持带有空格、文字全局字符和其他极端情况的选项:grep_options+=( --exclude-dir=classes --exclude-dir='*/.sass-cache' )
使用传统的
GREP_OPTIONS
标量变量,尽管它有缺陷(参见Bash 常见问题解答#50了解其中一些):GREP_OPTIONS+=' --exclude-dir=classes '
也就是说,如果您希望您的选项由 shell 外部调用的实例反映grep
,那么别名和函数都不起作用。相反,您需要将包装脚本放置在比实际grep
命令更早的路径中。例如:
# in ~/.bash_profile
[[ -e ~/bin ]] && PATH=$HOME/bin:$PATH
...并且,在~/bin/grep
:
#!/bin/bash
# load overrides to grep_options on GREP_OPTIONS from local dotfiles
source ~/.bash_profile
source ~/.bashrc
# ...and use them:
exec /usr/bin/grep "${grep_options[@]}" ${GREP_OPTIONS} "$@"