Funktionen in Fisch kombinieren

371
max pleaner

In Fish Shell habe ich zwei Funktionen:

function be bundle exec $argv end  function rdbm rake db:migrate end 

Ich benutze sie normalerweise zusammen, dh bundle exec rake db:migratenicht immer, also möchte ich sie getrennt halten.

Das Problem ist, dass ich dies mit den von mir definierten Aliasnamen nicht machen kann:

Sagen Sie, dass be rdbmdie erste Funktion ( be) erweitert wird, aber rdbmals Literalzeichenfolge übergeben wird (nicht erweitert).

Ich habe auch versucht abbr:

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

Aber nur der erste dehnt sich aus.

Ich habe herausgefunden, dass es möglich ist, Funktionen von anderen Funktionen aufzurufen:

function be_rdbm echo (be rake db:migrate) end 

Dies entkoppelt jedoch nicht die beiden Funktionen, da die zweite nicht verwendet wird.

Übrigens würde ich gerne wissen, ob das letzte Beispiel verbessert werden kann. Ich verstehe nicht, warum das echonotwendig sein sollte (oder welche Alternativen es gibt), aber ich kann die Klammer nicht als gesamten Inhalt der Funktion bezeichnen.

3

2 Antworten auf die Frage

2
Kurtis Rader

Persönlich würde ich einfach eine andere Abkürzung für den kombinierten Fall definieren. Sie können Ihre rdbmsFunktion jedoch wie folgt definieren, damit Sie sie mit Ihrer Funktion als kombinieren können be (rdbm):

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

Sie können Ihre beFunktion auch so ändern, dass Sie be rdbmbei der vorherigen Änderung nur die Eingabe vornehmen können:

function be if test "$argv" = "rdbm" bundle exec (rdbm) else bundle exec $argv end end 
Das ist cool und danke. Es ist jedoch keine echte Verkettung der Befehle. Es reicht nicht unbedingt aus, das zweite Ergebnis durch Echo zu leiten. Was ist, wenn es beispielsweise ein interaktives Skript ist? max pleaner vor 7 Jahren 0
Es ist unmöglich, Befehle auf die Weise zu verketten, die Sie in einer Shell vorschlagen, ohne einen Trick zu verwenden, den ich veröffentlicht habe. Kurtis Rader vor 7 Jahren 0
Oh, das ist zu schade. Genau das habe ich mich gefragt max pleaner vor 7 Jahren 0
Um ehrlich zu sein, hoffte ich wirklich, dass das möglich wäre. Nach wie vor fehlt den Terminals diese Funktionalität. Gibt es einen Grund, warum es nicht getan wurde? max pleaner vor 7 Jahren 0
Unter "Terminal" gehe ich davon aus, dass Sie meine Shell meinen, da Ihr Terminal damit nichts zu tun hat. Wie Glenn Jackman in seiner Antwort darauf hinweist, erlaubt zsh dies, wenn Sie die Funktion "globaler Alias" aktivieren. Dieses Verhalten ist jedoch gefährlich, so dass Fische keine Entsprechung haben. Beachten Sie, dass das, was zsh einen Aliasfisch nennt, Abkürzung heißt. In Fish werden Abkürzungen nur in der Befehlsposition erweitert (dies ist das Standardverhalten von zsh). Kurtis Rader vor 7 Jahren 0
Warum ist es gefährlich? Ich finde nichts, wenn ich nach "zsh global alias dangerous" suche max pleaner vor 7 Jahren 0
Globale Aliase in zsh sind gefährlich, da sie überall dort ausgedehnt werden, wo sie in der Befehlszeile erscheinen, wenn sie nicht in Anführungszeichen gesetzt werden und nicht nur an der Befehlsposition. dh das erste Zeichen. Dies kann zu einem überraschenden, schwer vorhersagbaren und unerwarteten Verhalten führen. Deshalb sind sie standardmäßig nicht aktiviert. Kurtis Rader vor 7 Jahren 0
1
glenn jackman

zsh hat eine "globale Alias" -Funktion, bei der der Alias ​​an einer beliebigen Stelle der Zeile ersetzt wird. Fisch ersetzt jedoch nur das erste Wort in der Befehlszeile.

Sie könnten das tun:

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

Dann müsstest du tippen

be (rdbm -n) 
Vielen Dank. Aber wie bei der anderen Antwort ist dies keine echte Verkettung von Befehlen. Was ist, wenn der zweite Befehl ein interaktives Skript ist? Dann funktioniert das Echo nicht max pleaner vor 7 Jahren 0