Mặc dù đúng là eval
luôn cần phải được tiếp cận một cách thận trọng, việc eval echo
xây dựng không phải lúc nào cũng vô nghĩa và có thể được sử dụng một cách an toàn. Gần đây tôi cần nó để có được nhiều lần mở rộng niềng răng được đánh giá theo thứ tự tôi cần chúng thực hiện.
bash
không mở rộng nhiều cú đúp từ trái sang phải, vì vậy
xargs -I_ cat _/{11..15}/{8..5}.jpg
mở rộng đến
xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg
nhưng tôi cần mở rộng cú đúp thứ hai được thực hiện trước, mang lại
xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg
Điều tốt nhất tôi có thể nghĩ ra để làm điều đó là
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Điều này hoạt động vì các dấu ngoặc đơn bảo vệ bộ dấu ngoặc đầu tiên khỏi sự mở rộng trong quá trình phân tích cú pháp của eval
dòng lệnh, khiến chúng được mở rộng bởi lớp con được gọi bởi eval
.
Có thể có một số kế hoạch xảo quyệt liên quan đến việc mở rộng niềng răng lồng nhau cho phép điều này xảy ra trong một bước, nhưng nếu có thì tôi quá già và ngu ngốc khi nhìn thấy nó. Ngoài ra còn có các loại vỏ khác bash
cho phép các cách thức gọn gàng hơn để đạt được loại điều này. Nhưng trong mọi trường hợp, việc sử dụng eval
này là an toàn vì các đối số của nó là tất cả các chuỗi cố định không chứa mở rộng tham số.