问题描述
我查看了 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
错误。
解决方法
首先,我认为 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
。