【问题标题】:Passing function arguments to multiple commands [fish shell]将函数参数传递给多个命令 [fish shell]
【发布时间】:2021-04-21 18:45:29
【问题描述】:

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

【问题讨论】:

    标签: fish


    【解决方案1】:

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

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

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

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

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

    $argv 是一个列表变量

    从那里,我们需要知道如何使用列表变量。有两个部分涵盖了这一点。一是Functions - Lists二是如何通过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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多