gpt4 book ai didi

function - 是否可以在 ZSH 中动态定义函数?

转载 作者:行者123 更新时间:2023-12-03 18:44:54 25 4
gpt4 key购买 nike

我想在ZSH中动态定义一系列函数。

例如:

#!/bin/zsh
for action in status start stop restart; do
$action() {
systemctl $action $*
}
done

然而,这会产生四个相同的函数,它们都调用最后一个参数:

$ status libvirtd
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to restart 'libvirtd.service'.
...

有没有办法像这样动态定义这些函数?

最佳答案

是的,这实际上非常简单:

for action in status start stop restart
do
$action() {
systemctl $0 "$@"
}
done

这里的关键点是 $0 的使用。您原始解决方案的问题是函数定义中的“ $action ”在定义过程中没有扩展,因此在所有四个函数中,它只引用了该变量的最后一个值。因此,与其尝试使用 eval(如另一个解决方案中所建议的)来使用丑陋的技巧,最好的解决方案是使用 $0... 在 shell 脚本中,$0 扩展为当前脚本的名称,而在 shell 中函数,它扩展到当前函数的名称。这恰好是您在这里想要的!

另请注意我如何使用 "$@" (引号很重要)而不是 $* 。这适用于带空格的引用参数, $* 会破坏。

最后,对于这个用例,您可以使用“别名”而不是函数,一切都会简单得多:
for action in status start stop restart
do
alias $action="systemctl $action"
done

关于function - 是否可以在 ZSH 中动态定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56534742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com