Fish-shell: eval $ argv descomprime los argumentos

Creado en 7 ene. 2017  ·  3Comentarios  ·  Fuente: fish-shell/fish-shell

  • [x] ¿Ha comprobado si ocurre algún problema con el
  • [x] ¿Ha probado el pescado sin personalizaciones de terceros (marque sh -c 'env HOME=$(mktemp -d) fish' ) ?

versión de pescado instalada ( fish --version ) : 2.4.0

OS / terminal utilizado : OSX 10.12.2 (16C67) / iTerm2 Build 3.0.13

Digamos que tengo un script simple que solo genera sus argumentos. Podría verse algo como esto:

#!/usr/bin/env ruby
p ARGV

y su ejecución se ve así:

> ./myscript.rb foo 'hello world'
["foo", "hello world"]

Observe cómo "hola mundo" se agrupa como un argumento frente a "hola" y "mundo" son argumentos separados.

Ahora, quiero escribir una función de pescado que me permita ejecutar cualquier comando de pescado arbitrario (incluidos los alias) con algunas vars ENV configuradas.

Este es mi primer intento de tal función.

function debug
  set -xg DEBUG 1
  eval $argv
  set -e DEBUG
end

Esto es lo que sucede cuando ejecuto mi script desde arriba a través de esta función:

> debug ./myscript.rb foo 'hello world'
["foo", "hello", "world"]

Observe que el único argumento de "hola mundo" se convirtió en "hola" y "mundo", que no es lo que quería.

También probé el siguiente enfoque:

env DEBUG=1 fish -c "$argv"

Lo que produjo el mismo resultado.

¿Hay alguna forma de hacer que la función $argv preserve la agrupación "hola mundo"? ¿Qué me estoy perdiendo?

question

Comentario más útil

Tenga en cuenta que actualmente puede usar string escape , es decir, eval (string escape -- $argv) .

Todos 3 comentarios

Este es un problema con eval , no con "$ argv" en particular.

eval analiza sus argumentos como si fueran dados en la línea de comandos, y no le importa cómo se dividen los argumentos.

Hemos tenido un problema con esto antes, pero el consenso fue que no podemos cambiar eval ahora, y que podría complicar otras cosas.

Lo que estamos tratando de hacer saber es en # 154 - hacer command y aceptar variables.

Eso significaría que podría agregar command $argv , y lo ejecutaría como espera.

Tenga en cuenta que actualmente puede usar string escape , es decir, eval (string escape -- $argv) .

Gracias. (string escape -- $argv) funcionó.

¿Fue útil esta página
0 / 5 - 0 calificaciones