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

时间:2021-04-21 18:45:29

标签: fish

我查看了 fish 文档,但没有找到我需要的内容(或者如果找到了,我也不明白)。

我在 fish 中做了一个函数,它会在一段时间后挂起我的电脑:

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

然后我输入 ss 20s,它会在 20 秒内关闭 PC。

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

我确实尝试过类似的操作,但出现了 Too many arguments 错误。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

<块引用>

$argv 是一个列表变量

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

请注意,与许多语言不同,fish 索引从 1 开始。因此您的 sleep 参数(您传入的第一个数字将是 $argv[1]。第二个,{{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