【问题标题】:String inclusion in Fish Shell鱼壳中的字符串包含
【发布时间】:2013-06-08 16:53:37
【问题描述】:

我查看了 Stack Overflow 上所有类似的问题,并在他们的文档中尝试了很多东西。我目前的尝试如下。

我想要完成的是基于计算机用户的不同行为。我有一台工作计算机和一台家用计算机,当我在命令行中输入“代码”时,我希望工作计算机转到不同的目录,而不是我在家里输入它时想要的目录。我试过这个(我的工作用户名是 afk,家是 sfk):

function code
    set result (dirh)
    if [contains "sfk" $result]
        cd ~/rails
    else if [contains "afk" $result]
        cd ~/code
    else
        echo $result
    end
end

目前,这是在抱怨“未知命令包含 Users/sfk/.config/fish/”(当我输入这个时,我的 PWD 是 Users/sfk/.config/fish/)。我认为可能 contains 仅用于列表,但文档对此并不是特别清楚?知道我该怎么做吗?

编辑

刚刚尝试过,虽然它不再出错,但它最终出现在 else 情况下,它不应该,导致我的用户是 sfk,它包含在 dirh 字符串中:

function code
    set result (dirh)
    if test (contains "sfk" $result)
        cd ~/rails
    else if test (contains "afk" $result)
        cd ~/code
    else
        echo $result
    end
end

【问题讨论】:

  • 我不明白?如果您有 2 个不同的用户,那么为什么不简单地创建 2 个单独的 code 函数?
  • 冗长的答案 - 因为我 90% 的鱼功能是相同的,我在 github 上有它们,所以我可以在两台计算机之间同步任何新的鱼功能,所以它们的行为相同,但这个功能不同在它们之间,所以与其尝试让 .gitignored 文件具有特定于计算机的功能,我希望只是让功能根据计算机用户名表现不同
  • 您是否考虑过设置全局环境变量来指定您需要的文件夹路径,即在您的主文件.configrc 中创建并将其加载到您的fish.config 中。这种方法会更加普遍。
  • 我没有,这有效。谢谢!

标签: fish


【解决方案1】:

正如上面在 cmets 中所说,这是针对这个特定用例的最佳解决方案。但要回答这个问题,以防有人想做其他事情。

contains 是对的,它与列表项完全匹配。您可以改用 switch 函数。支持通配符匹配。

function code
    set -l result (dirh)

    switch $result
        case '*sfk*'
            cd ~/rails
        case '*afk*'
            cd ~/code
        case '*'
            echo $result
    end
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2016-03-16
    • 1970-01-01
    • 2020-05-10
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多