我已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
穷人的功能。别名并不是真正的命令,它们更多的是文本替换。alias
es 可用于具有函数的更高级 shell,作为无法使用函数的情况的黑客工具,例如:
alias forever='while true; do'
或者
alias fail='{ echo >&2 FAIL; return 1; }'
这不适用于函数。但在这里,这不是其中之一。
alias pi='pip install -U'
没有定义一个pi
命令,它定义了一个pi
别名。在这里,碰巧的是,在扩展时,最终会变成一个简单命令的开头,但在需要命令的所有情况下,别名都不会扩展。特别是,它们不会在像zargs
这里这样的函数中扩展(嗯,它们是,但是在函数调用时定义,而不是调用,那是我们的forever
或fail
上面的别名可能有用)。并且它们在某些不合适的情况下进行了扩展(例如在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"
拆分为echo
and"foo bar"
而不是echo
, "foo
and bar"
),e
执行扩展(例如echo $(uname)
扩展为echo Linux
),Q
删除引号,这将在更多情况下提供更好的近似值。