将函数参数传递给多个命令 [fish shell]

Passing function arguments to multiple commands [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 错误。

好吧,首先,我认为 Too many arguments 来自将 任何 附加参数传递给 systemctl suspend。据我所知,它没有任何附加选项,是吗?即使我调用 sudo systemctl suspend help(或 anything 作为额外参数),我也会得到同样的错误。

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

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

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

首先,在 Introduction - Functions 部分,要点是:

$argv is a list variable

从那里开始,我们需要知道如何使用列表变量。有两个部分涵盖了这一点。首先Functions - Lists and second, how to access the list variable contents through indexing.

请注意,与许多语言不同,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 的有效参数。