在 Fish 中组合函数

在 Fish 中组合函数

在 Fish shell 中我有两个功能:

function be
  bundle exec $argv
end

function rdbm
  rake db:migrate
end

我通常将它们一起使用,bundle exec rake db:migrate但并非总是如此,所以我想将它们分开。

问题是我无法使用我当前定义的别名来执行此操作:

be rdbm扩展了第一个函数(be)但rdbm作为文字字符串(未扩展)传递。

我也尝试过abbr

abbr be 'bundle exec'
abbr rdbm 'rake db:migrate'

但只有第一个会扩大。

我发现可以从其他函数调用函数:

function be_rdbm
  echo (be rake db:migrate)
end

但这并没有将这两个功能分离,因为第二个功能没有被使用。

顺便说一句,我想知道最后一个例子是否可以改进。我不明白为什么这echo是必要的(或者有什么替代方案),但我不能把括号作为函数的全部内容。

答案1

就我个人而言,我只想为组合情况定义另一个缩写。但是,您可以rdbms按如下方式定义函数,以便将其与 be 函数组合在一起be (rdbm)

function rdbm
    if status --is-command-substitution
        echo rake db:migrate
    else
        rake db:migrate
    end
end

您还可以修改您的函数,以便在与上一个更改一起使用时be只需键入:be rdbm

function be
    if test "$argv" = "rdbm"
        bundle exec (rdbm)
    else
        bundle exec $argv
    end
end

答案2

zsh 具有“全局别名”功能,别名可以替换行中的任何位置。但 fish 仅替换命令行中的第一个单词。

你可以这样做:

function rdbm
  if [ (count $argv) = 1 ]; and [ $argv[1] = "-n" ]
    echo "rake db:migrate"
  else
    rake db:migrate
  end
end

然后你必须输入

be (rdbm -n)

相关内容