我查看了 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
错误。
答案 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
。