Bagaimana argumen yang dikutip ditangani oleh / bin / waktu

1

Saya menghitung waktu biner khusus dalam bentuk: ./prog --opt1=arg1 --opt2=arg2 --opt3="arg3"

Diperlukan opsi ketiga memiliki argumen yang dikutip. Dalam skrip saya menyimpan semua opsi:

exec=./prog
opts="--opt1=arg1 --opt2=arg2 --opt3=\"arg3\""

Ketika saya mencoba menghitung waktu program, saya mendapatkan kesalahan dengan program saya menguraikan argumen. Saya menduga itu karena ia melihat argumen terakhir sebagai tidak dikutip. Output dari /bin/time:

\bin\time -v $exec $opts

Error parsing args (dari program saya)
Command being timed: "./prog --opt1=arg1 --opt2=arg2 --opt3="arg3""

Namun ketika saya salin dan rekat, apa itu klaim perintahnya adalah, itu berjalan dengan baik:

./prog --opt1=arg1 --opt2=arg2 --opt3="arg3" --mulai baik-baik saja

apa yang /bin/time lakukan dan bagaimana cara memperbaikinya? Saya kira itu ada hubungannya dengan tanda kutip, seperti mungkin berjalan eval atau sesuatu. Saya tidak yakin apa yang harus saya lakukan.

Mike Lui
sumber

Jawaban:

0

Saya memperbaiki ini dengan mengatur seluruh perintah ke variabel, dan kemudian mengevaluasi bahwa:

$ full_cmd="/bin/time -v $exec $opts"
$ eval $full_cmd

Mike Lui
sumber
eval adalah cara yang salah untuk melakukan ini; ia memiliki reputasi yang pantas untuk menyebabkan bug yang tak terduga (dan kadang-kadang tidak dapat dipahami). Lihat BashFAQ # 50: Saya mencoba untuk menempatkan perintah dalam variabel, tetapi kasus kompleks selalu gagal! (dan banyak jawaban sebelumnya yang menghubungkannya) untuk ide yang lebih baik.
Gordon Davisson