在 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)