如何扩展 bash 别名

如何扩展 bash 别名

如何在 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} "$@"

相关内容