Fish-shell: eval $ argv analysiert die Argumente nicht

Erstellt am 7. Jan. 2017  ·  3Kommentare  ·  Quelle: fish-shell/fish-shell

  • [x] Haben Sie überprüft, ob bei Fisch 2.4.0 ein Problem auftritt?
  • [x] Versuchte Fische ohne Anpassungen von Drittanbietern (überprüfen Sie 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?

question

Hilfreichster Kommentar

Beachten Sie, dass Sie derzeit string escape , dh eval (string escape -- $argv) .

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen