如何扩展 bash 别名

bra*_*zzi 12 grep bash alias

如何在 Bash 中创建一个实际扩展另一个同名别名的别名?

为什么:

我以前也GREP_OPTIONS设定.bashrc到这样的事情:

GREP_OPTIONS="-I --exclude=\*~"
Run Code Online (Sandbox Code Playgroud)

我还有一个脚本(让我们说,setup-java.sh),我会在处理一些 Java 项目之前调用它。它将包含以下行:

GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Run Code Online (Sandbox Code Playgroud)

如果我也使用 Sass,那么我会调用setup-sass.sh其中包含以下行:

GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Run Code Online (Sandbox Code Playgroud)

GREP_OPTIONS已弃用,显然标准解决方案是创建别名或某些脚本...

bra*_*zzi 14

Bash 将别名的值存储在一个名为 的数组中 BASH_ALIASES

$ alias foo=bar
$ echo ${BASH_ALIASES[foo]}
bar
Run Code Online (Sandbox Code Playgroud)

通过参数扩展, 我们可以获得最后一组别名(如果存在)或默认值:

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~"
Run Code Online (Sandbox Code Playgroud)

现在只需这样做setup-java.sh

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~  --exclude-dir=classes"
Run Code Online (Sandbox Code Playgroud)

...最后是setup-sass.sh

alias grep="${BASH_ALIASES[grep]:-grep} -I --exclude=\*~ --exclude-dir=\*/.sass-cache"
Run Code Online (Sandbox Code Playgroud)

如果调用了三行,我们得到了我们想要的:

$ echo ${BASH_ALIASES[grep]:-grep}
grep -I --exclude=\*~ -I --exclude=\*~ --exclude-dir=classes -I --exclude=\*~ --exclude-dir=\*/.sass-cache
Run Code Online (Sandbox Code Playgroud)


mik*_*erv 13

aliases 如果以空格结尾,则链接。

alias print='printf %s\\n ' hey='"hello, fine fellow" '
print hey
Run Code Online (Sandbox Code Playgroud)
hello, fine fellow
Run Code Online (Sandbox Code Playgroud)

如果您足够疯狂,您可以通过这种方式编写整个脚本。无论如何,如果您想扩展别名,那么只需确保要扩展的别名以空格结尾,然后再添加另一个。

alias grep='printf "%s " -I --exclude=\*~ '    \
      exdir=' --exclude-dir=classes '          \
      exsass='--exclude-dir=\*/.sass-cache '
grep exdir exsass exdir exsass
Run Code Online (Sandbox Code Playgroud)
-I --exclude=*~ --exclude-dir=classes --exclude-dir=*/.sass-cache --exclude-dir=classes --exclude-dir=*/.sass-cache
Run Code Online (Sandbox Code Playgroud)

  • 这美得令人毛骨悚然。 (7认同)
  • @Wildcard: `fnmatch(){ alias fnmatch='case $1 in '; 而 "${1:+:}" 2>&-; 做 eval 'fnmatch 模式列表;; esac'; 转移; 完毕; 取消别名 fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"`。使用 `aliases` 可以让你更直接、更安全地使用模式的扩展。当从函数内部调用时,您确实需要带有“eval”的第二个上下文,但只要“模式”和“列表”名称由您控制,它本质上就不是不安全的。他们只能在大多数情况下破坏,即使它们不是,除非某些攻击者故意正确地结束您的“案例”。 (2认同)
  • @Wildcard - 我并不完全提倡这样的使用,但确实可以,而且你必须至少有点疯狂才能尝试。 (2认同)