Перейти к содержимому

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

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

341 просмотр
max pleaner спросил 9 лет назад
M 133

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 

Это круто и спасибо. Но это не истинное объединение команд. Его не обязательно достаточно, чтобы передать второй результат через эхо. Что делать, если это интерактивный скрипт, например.

max pleaner · 9 лет назад · 0

Невозможно объединить команды так, как вы предлагаете в любой оболочке, без использования трюка, как я опубликовал.

Kurtis Rader · 9 лет назад · 0

О, это слишком плохо. Вот только то, что мне было интересно

max pleaner · 9 лет назад · 0

Честно говоря, я действительно надеялся, что это будет возможно. Как и после всего этого времени терминалам все еще не хватает этой функциональности. Есть ли причина, по которой это не сделано?

max pleaner · 9 лет назад · 0

Под терминалом я предполагаю, что вы имеете в виду shell, так как ваш терминал не имеет к этому никакого отношения. Как указал Гленн Джекман в своем ответе, zsh разрешает это, если вы включаете функцию «глобального псевдонима». Но такое поведение опасно, поэтому у рыбы нет эквивалента. Обратите внимание, что то, что zsh называет псевдонимом рыбы, называется аббревиатурой. В рыбах аббревиатуры раскрываются только в командном положении (это стандартное поведение zsh).

Kurtis Rader · 9 лет назад · 0

Почему это опасно? Я ничего не нахожу, когда я ищу "zsh global alias опасных"

max pleaner · 9 лет назад · 0

Глобальные псевдонимы в zsh опасны, потому что они раскрываются везде, где они появляются в командной строке, если не заключены в кавычки, а не просто в командную позицию; т.е. первый токен. Это может привести к удивительному, трудно предсказуемому и неожиданному поведению. Вот почему они не включены по умолчанию.

Kurtis Rader · 9 лет назад · 0
Kurtis Rader ответил 9 лет назад
K 590
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) 

Спасибо большое. Но, как и в случае с другим ответом, это не настоящее объединение команд. Что если вторая команда представляет собой интерактивный скрипт? Тогда эхо не будет работать

max pleaner · 9 лет назад · 0
glenn jackman ответил 9 лет назад
G 15 551