zargs 可以运行别名吗?

zargs 可以运行别名吗?

我已pip install -U别名为pi.我想运行:

zargs ~/scripts/python/**/requirements.txt -- pi -r

有什么办法可以做到这一点吗?

我也尝试过这个丑陋的选择:

zargs ~/scripts/python/**/requirements.txt -- ${aliases[pi]} -r

但它说(eval):2: command not found: pip install -U

我想 zargs 应该能够做这些事情,因为它是 zsh 内置的。

答案1

别名是csh穷人的功能。别名并不是真正的命令,它们更多的是文本替换。aliases 可用于具有函数的更高级 shell,作为无法使用函数的情况的黑客工具,例如:

alias forever='while true; do'

或者

alias fail='{ echo >&2 FAIL; return 1; }'

这不适用于函数。但在这里,这不是其中之一。

alias pi='pip install -U'

没有定义一个pi 命令,它定义了一个pi 别名。在这里,碰巧的是,在扩展时,最终会变成一个简单命令的开头,但在需要命令的所有情况下,别名都不会扩展。特别是,它们不会在像zargs这里这样的函数中扩展(嗯,它们是,但是在函数调用时定义,而不是调用,那是我们的foreverfail上面的别名可能有用)。并且它们在某些不合适的情况下进行了扩展(例如在pi() { ...; })。

全局别名不是解决方案,全局别名仍然不是命令,它们仍然会文本替换,但在更多情况下会扩展。

之后

alias -g pi='pip install -U'

现在,pi单词无论出现在哪里都会被扩展。例如,echo pi会输出pip install -U.

在这里,如果你想定义一个pi命令,你可以使用一个函数:

pi() pip install -U "$@"

那个将被调用zargs

和你的pi 简单的别名,你仍然可以这样做:

zargs ~/scripts/python/**/requirements.txt -- ${=aliases[pi]} -r

也就是说,$IFS对别名的定义调用 -splitting。或者更进一步:

zargs ~/scripts/python/**/requirements.txt -- "${(@Q)${(ze)aliases[pi]}}" -r    

z考虑引用的同时进行拆分(例如echo "foo bar"拆分为echoand"foo bar"而不是echo, "fooand bar"),e执行扩展(例如echo $(uname)扩展为echo Linux),Q删除引号,这将在更多情况下提供更好的近似值。

相关内容