sh -c 'env HOME=$(mktemp -d) fish'
) ?Fischversion installiert ( fish --version
) : 2.4.0
Verwendetes Betriebssystem / Terminal : OSX 10.12.2 (16C67) / iTerm2 Build 3.0.13
Angenommen, ich habe ein einfaches Skript, das nur seine Argumente ausgibt. Es könnte ungefähr so aussehen:
#!/usr/bin/env ruby
p ARGV
und seine Ausführung sieht so aus:
> ./myscript.rb foo 'hello world'
["foo", "hello world"]
Beachten Sie, wie "Hallo Welt" als ein Argument gruppiert wird, während "Hallo" und "Welt" separate Argumente sind.
Jetzt möchte ich eine Fischfunktion schreiben, mit der ich einen beliebigen Fischbefehl (einschließlich Aliase) mit einigen eingerichteten ENV-Variablen ausführen kann.
Dies ist mein erster Versuch einer solchen Funktion
function debug
set -xg DEBUG 1
eval $argv
set -e DEBUG
end
Folgendes passiert, wenn ich mein Skript über diese Funktion von oben ausführe:
> debug ./myscript.rb foo 'hello world'
["foo", "hello", "world"]
Beachten Sie, dass aus einem einzigen "Hallo Welt" -Argument "Hallo" und "Welt" wurde, was ich nicht wollte.
Ich habe auch den folgenden Ansatz versucht:
env DEBUG=1 fish -c "$argv"
Welches das gleiche Ergebnis ergab.
Gibt es eine Möglichkeit, die $argv
-Funktion der Funktion so zu gestalten, dass die Gruppierung "Hallo Welt" erhalten bleibt? Was vermisse ich?
Dies ist ein Problem mit eval
, nicht insbesondere mit "$ argv".
eval
analysiert seine Argumente so, als ob sie in der Befehlszeile angegeben würden, und es ist ihm egal, wie die Argumente aufgeteilt werden.
Wir hatten schon einmal ein Problem damit, aber der Konsens war, dass wir die Bewertung jetzt nicht ändern können und dass dies andere Dinge schwieriger machen könnte.
Was wir versuchen zu wissen, ist in # 154 - machen Sie command
und akzeptieren Sie Variablen.
Das würde bedeuten, dass Sie command $argv
hinzufügen könnten, und es würde so laufen, wie Sie es erwarten.
Beachten Sie, dass Sie derzeit string escape
, dh eval (string escape -- $argv)
.
Vielen Dank. (string escape -- $argv)
funktioniert.
Hilfreichster Kommentar
Beachten Sie, dass Sie derzeit
string escape
, dheval (string escape -- $argv)
.