vẻ như là cách khuyến khích làm bối cảnh biến gián tiếp trong bash là sử dụng eval
:gián tiếp phân công biến trong bash
var=x; val=foo
eval $var=$val
echo $x # --> foo
Vấn đề là thông thường một với eval
:
var=x; val=1$'\n'pwd
eval $var=$val # bad output here
(và vì nó được khuyến khích ở nhiều nơi, tôi tự hỏi có bao nhiêu kịch bản dễ bị tổn thương vì điều này ...)
Trong mọi trường hợp, giải pháp rõ ràng của usin g (thoát) dấu ngoặc kép không thực sự làm việc:
var=x; val=1\"$'\n'pwd\"
eval $var=\"$val\" # fail with the above
Vấn đề là bash đã gián tiếp biến tham chiếu nướng trong (với ${!foo}
), nhưng tôi không thấy bất kỳ cách như vậy để làm nhiệm vụ gián tiếp - là có cách nào lành mạnh để làm điều này?
Đối với hồ sơ, tôi đã tìm thấy một giải pháp, nhưng điều này không phải là điều mà tôi muốn xem xét "lành mạnh" ...:
eval "$var='"${val//\'/\'\"\'\"\'}"'"
Các gián tiếp trên RHS không phải là những gì tôi đang tìm kiếm. –
(* trán-slap *) Bah, tôi đã hoàn toàn bỏ lỡ lý do tại sao tôi * muốn * muốn có sự đồng cảm trên RHS. Vì câu trả lời của bạn không nói về nó chút nào, tôi sẽ chỉnh sửa nó ngay bây giờ, thay vì tự trả lời ... –
Tuyệt vời! Trong quá khứ tôi đã làm một số phức tạp 'eval eval export' vô nghĩa. Cảm ơn bạn đã bao giờ rất nhiều. Đối với các googlers, đi với câu trả lời ở trên, không phải là định dạng xuất eval eval. – bgStack15