Объединение функций в рыбе

225
max pleaner

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

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

3

2 ответа на вопрос

2
Kurtis Rader

Лично я бы просто определил другую аббревиатуру для объединенного падежа. Однако вы можете определить свою 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 
Это круто и спасибо. Но это не истинное объединение команд. Его не обязательно достаточно, чтобы передать второй результат через эхо. Что делать, если это интерактивный скрипт, например. max pleaner 7 лет назад 0
Невозможно объединить команды так, как вы предлагаете в любой оболочке, без использования трюка, как я опубликовал. Kurtis Rader 7 лет назад 0
О, это слишком плохо. Вот только то, что мне было интересно max pleaner 7 лет назад 0
Честно говоря, я действительно надеялся, что это будет возможно. Как и после всего этого времени терминалам все еще не хватает этой функциональности. Есть ли причина, по которой это не сделано? max pleaner 7 лет назад 0
Под терминалом я предполагаю, что вы имеете в виду shell, так как ваш терминал не имеет к этому никакого отношения. Как указал Гленн Джекман в своем ответе, zsh разрешает это, если вы включаете функцию «глобального псевдонима». Но такое поведение опасно, поэтому у рыбы нет эквивалента. Обратите внимание, что то, что zsh называет псевдонимом рыбы, называется аббревиатурой. В рыбах аббревиатуры раскрываются только в командном положении (это стандартное поведение zsh). Kurtis Rader 7 лет назад 0
Почему это опасно? Я ничего не нахожу, когда я ищу "zsh global alias опасных" max pleaner 7 лет назад 0
Глобальные псевдонимы в zsh опасны, потому что они раскрываются везде, где они появляются в командной строке, если не заключены в кавычки, а не просто в командную позицию; т.е. первый токен. Это может привести к удивительному, трудно предсказуемому и неожиданному поведению. Вот почему они не включены по умолчанию. Kurtis Rader 7 лет назад 0
1
glenn jackman

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

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

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

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

be (rdbm -n) 
Спасибо большое. Но, как и в случае с другим ответом, это не настоящее объединение команд. Что если вторая команда представляет собой интерактивный скрипт? Тогда эхо не будет работать max pleaner 7 лет назад 0

Похожие вопросы