将函数参数传递给多个命令 [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
的有效参数。
我查看了 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
的有效参数。