Fish-shell: eval $ argv membatalkan parsing argumen

Dibuat pada 7 Jan 2017  ·  3Komentar  ·  Sumber: fish-shell/fish-shell

  • [x] Sudahkah Anda memeriksa apakah terjadi masalah dengan ikan 2.4.0 ?
  • [x] Mencoba ikan tanpa penyesuaian pihak ketiga (periksa sh -c 'env HOME=$(mktemp -d) fish' ) ?

versi ikan terpasang ( fish --version ) : 2.4.0

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

Katakanlah saya memiliki skrip sederhana yang hanya mengeluarkan argumennya. Ini bisa terlihat seperti ini:

#!/usr/bin/env ruby
p ARGV

dan pelaksanaannya terlihat seperti ini:

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

Perhatikan bagaimana "halo dunia" dikelompokkan sebagai satu argumen vs "halo" dan "dunia" menjadi argumen yang terpisah.

Sekarang, saya ingin menulis fungsi ikan yang memungkinkan saya menjalankan perintah ikan sembarang (termasuk alias) dengan beberapa vars ENV yang disiapkan.

Ini adalah percobaan pertama saya untuk fungsi tersebut

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

Inilah yang terjadi ketika saya menjalankan skrip saya dari atas melalui fungsi ini:

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

Perhatikan bahwa argumen tunggal "halo dunia" berubah menjadi "halo" dan "dunia", yang bukan itu yang saya inginkan.

Saya juga mencoba pendekatan berikut:

env DEBUG=1 fish -c "$argv"

Yang menghasilkan hasil yang sama.

Apakah ada cara untuk membuat fungsi $argv mempertahankan pengelompokan "hello world"? Apa yang saya lewatkan?

question

Komentar yang paling membantu

Perhatikan bahwa saat ini Anda dapat menggunakan string escape , yaitu eval (string escape -- $argv) .

Semua 3 komentar

Ini adalah masalah dengan eval , bukan "$ argv" pada khususnya.

eval mem-parsing argumennya seolah-olah diberikan pada baris perintah, dan tidak peduli tentang bagaimana argumen dipisahkan.

Kami pernah mengalami masalah tentang ini sebelumnya, tetapi konsensusnya adalah kami tidak dapat mengubah eval sekarang, dan itu mungkin membuat hal-hal lain menjadi lebih rumit.

Apa yang kita coba ketahui ada di # 154 - dapatkan command dan variabel terima semacam itu.

Itu berarti Anda dapat menambahkan command $argv , dan itu akan berjalan seperti yang Anda harapkan.

Perhatikan bahwa saat ini Anda dapat menggunakan string escape , yaitu eval (string escape -- $argv) .

Terima kasih. (string escape -- $argv) bekerja.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat