首页 > 解决方案 > 将函数参数传递给多个命令 [fish shell]

问题描述

我检查了fish文档,但没有找到我需要的东西(或者如果我找到了,我不明白)。

我做了一个功能,fish在一段时间后暂停我的电脑:

function ss --d 'sleeps the pc after specified time' 
    sleep $argv && systemctl suspend
end

然后我打字ss 20s,它会在 20 秒内关闭电脑。

但是如果我想将标志传递给systemctl suspend? 我还需要$argv在函数中的那个命令之后吗?

我确实尝试了类似的东西,但我得到了一个Too many arguments错误。

标签: fish

解决方案


首先,我认为Too many arguments来自将任何额外的参数传递给systemctl suspend. 据我所知,它没有任何其他选项,是吗?即使我打电话sudo systemctl suspend help(或任何作为额外参数的东西),我也会得到同样的错误。

但是至于如何构造一个函数来处理将不同的参数传递给多个命令......

你在第二点上是对的。文档涵盖了它,但我绝对理解新用户可能很难知道他们在寻找什么。fish即使在使用了一年多之后,再次阅读文档时,我仍然会发现“对我来说很新”的东西。

希望通过指出相关信息,它会更有意义。别担心,我也会给你“答案”,但我想确保你具备理解它所需的背景。

首先,在简介 - 功能部分,关键要点是:

$argv 是一个列表变量

从那里,我们需要知道如何使用列表变量。有两个部分涵盖了这一点。第一个函数 - 列表,第二个,如何通过索引访问列表变量内容。

请注意,与许多语言不同,fish索引从 1 开始。因此,您的sleep参数(您传入的第一个数字将是$argv[1]。当然,第二个,$argv[2]等等。因此,如果您只需要两个参数,这就是您所需要的。

但是,如果您希望将“所有其余参数”(无论有多少)传递给systemctl suspend,那就有点棘手了。那将是$argv[2..-1],这意味着“通过最后一个参数的第二个参数”。

所以应该是:

function ss --d 'sleeps the pc after specified time' 
    sleep $argv[1] && systemctl suspend $argv[2..-1]
end

当然,这再次假设您suspend首先要传递一个有效的参数。


推荐阅读