3

У рыбной раковины у меня две функции:

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 должно быть необходимым (или какие есть альтернативы), но я не могу поставить круглые скобки в качестве всего содержимого функции.

2 ответа2

2

Лично я бы просто определил другую аббревиатуру для объединенного падежа. Однако вы можете определить свою функцию 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
1

У zsh есть функция "глобального псевдонима", где псевдоним подставляется в любом месте строки. Но рыба заменяет только первое слово в командной строке.

Вы могли бы сделать это:

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

Тогда вам придется набрать

be (rdbm -n)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .