如何在别名中使用通配符 *

How to use wildcard * in alias

# first examle
> alias gostyle="goimports -w $(find . -type f -name '*.go' -not -path './vendor/*')"
> alias gostyle
gostyle=$'goimports -w / gofiles /'

# second example
> alias gostyle="goimports -w $(find . -type f -name 'main.go' -not -path './vendor/*')"
> alias gostyle
gostyle='goimports -w ./main.go'

为什么在第一个例子中我的命令前面有$。 我如何在别名中使用通配符 *。 为什么我使用第一个别名时权限被拒绝

因为您使用的是双引号而不是单引号,所以 $(find ...) 在您定义别名时执行一次。您最终得到一个带有硬编码文件列表的别名。

简单的解决方法是使用单引号而不是双引号(显然您需要将嵌入的单引号更改为双引号,或者进行不同的重构);但更好的解决方案是使用函数而不是别名。除了与旧石器时代 Unix 的点文件向后兼容之外,基本上没有充分的理由使用别名。

gostyle () {
    goimports -w $(find . -type f -name '*.go' -not -path './vendor/*') "$@"
}

(不幸的是,我不熟悉 goimports;也许它的参数需要用双引号引起来,或者您应该为 find 产生的每个结果添加一个 -w . 或者你真的想要

gostyle () {
    find . -type f -name '*.go' -not -path './vendor/*' -print0 |
    xargs -0 goimports -w "$@"
}

您可能希望或不希望包括的地方 "$@"。)