Làm thế nào trích dẫn args được xử lý bởi / bin / lần


1

Tôi đang định thời gian nhị phân tùy chỉnh ở dạng: ./prog --opt1=arg1 --opt2=arg2 --opt3="arg3"

Nó yêu cầu tùy chọn thứ ba có một đối số được trích dẫn. Trong một kịch bản, tôi lưu tất cả các tùy chọn:

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

Khi tôi cố gắng đặt thời gian cho chương trình, tôi gặp lỗi với chương trình phân tích cú pháp. Tôi đoán nó bởi vì nó nhìn thấy cuộc tranh luận cuối cùng như không được trích dẫn. Đầu ra của /bin/time:

\bin\time -v $exec $opts

Error parsing args (từ chương trình của tôi)
Command being timed: "./prog --opt1=arg1 --opt2=arg2 --opt3="arg3""

Tuy nhiên, khi tôi chỉ sao chép và dán, nó yêu cầu lệnh là gì, nó chạy tốt:

./prog --opt1=arg1 --opt2=arg2 --opt3="arg3" - tốt

Tôi đang /bin/timelàm gì và làm cách nào để khắc phục điều này? Tôi đoán nó có liên quan đến các trích dẫn, như có thể nó chạy eval hoặc một cái gì đó. Tôi không biết phải làm gì về nó.

Câu trả lời:


0

Tôi đã sửa lỗi này bằng cách đặt toàn bộ lệnh thành một biến và sau đó đánh giá rằng:

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


evallà cách sai để làm điều này; nó có một danh tiếng rất xứng đáng để gây ra lỗi bất ngờ (và đôi khi không thể hiểu được). Xem BashFAQ # 50: Tôi đang cố gắng đặt một lệnh vào một biến, nhưng các trường hợp phức tạp luôn thất bại! (và nhiều câu trả lời trước đó liên kết với nó) cho ý tưởng tốt hơn.
Gordon Davisson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.