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?
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.
Komentar yang paling membantu
Perhatikan bahwa saat ini Anda dapat menggunakan
string escape
, yaitueval (string escape -- $argv)
.