Mở rộng cú đúp: chạy một số lệnh thay vì mở rộng trên một dòng?


11

Khi bạn sử dụng mở rộng cú đúp trong bash, một cái gì đó như

echo {a,b,c}

trở thành

echo a b c

Thay vào đó, có cách nào để mở rộng nó thành 3 lệnh riêng biệt, một lệnh cho mỗi lần mở rộng không?

Vậy nên:

echo {a,b,c}

sẽ trở thành

echo a
echo b
echo c

Câu trả lời:


12

Đây chỉ là một câu hỏi "bởi vì tôi muốn biết", hoặc có một trường hợp sử dụng thực sự cho nó? Chúng tôi có thể đi qua một số môn thể dục dụng cụ để hoàn thành nó:

$ eval echo\ {a,b,c}\;
a
b
c

Nhưng tôi sẽ săn lùng bất cứ ai đưa các loại lệnh khó hiểu này vào các tập lệnh hệ thống của chúng tôi.

Tại sao không đi cho rõ ràng thay thế:

$ for X in {a,b,c}; do echo $X; done

Bạn thậm chí có thể đi cả con lợn và đặt một vài dòng mới và thụt lề một chút để bạn luôn có thể hiểu những gì bạn đang cố gắng làm.


4
@peth - Tôi cho rằng đây là một ví dụ đơn giản. Nếu nó thực sự đơn giản như một danh sách, thì bạn đã đúng. Nếu đó là một cái gì đó giống như vậy file-{r,b,g}{m,n,o}{x,y.z}.foothì tốt hơn là sử dụng hình thức ngắn hơn là liệt kê tất cả 27 giá trị.
unpythonic

@peth - Tôi nghĩ đó là một câu hỏi tiếp theo tốt.
unpythonic

Tôi đã muốn biết điều này từ lâu, cảm ơn! :)
Sirex

1
Chà, trường hợp sử dụng là các chương trình không chấp nhận nhiều hơn một tệp (ví dụ), do đó, việc mở rộng sẽ không hoạt động. Do đó, thật tuyệt khi có thể dễ dàng chạy chương trình nhiều lần. Các forcông việc này, nhưng nó vẫn gõ nhiều hơn: P
houbysoft

Tôi đã sử dụng nó để dọn dẹp nhiều nhánh git:eval git branch -d \{ branch-a, branch-b }\;
Kit

3

Dựa trên câu trả lời được chọn của Mark Mann , tôi có thể rút ra thêm ví dụ này, hoạt động rất tuyệt:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

Những gì đang hiển thị, là khi bạn đang sử dụng nhiều lần mở rộng niềng răng trong một dòng, ví dụ ban đầu của Mark sẽ in riêng từng biến thể. Thay vào đó, tôi muốn sử dụng câu trả lời của anh ấy để di chuyển / đổi tên nhiều tập tin. Để đảm bảo rằng đầu ra khớp với định dạng mà mvthông thường mong đợi ( mv oldfilename newfilename), tôi đã thoát khỏi lần xuất hiện thứ hai của mở rộng dấu ngoặc, để nó không được đánh giá cho đến khieval lệnh ban đầu được thực thi.

Khi đầu ra ở trên xuất hiện như mong đợi, tôi đã có thể chạy lệnh sau:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

Rất cám ơn Mark cho câu trả lời ban đầu của mình. Hãy bỏ phiếu cho câu trả lời của anh ấy nếu bạn thích câu trả lời của anh ấy cho phép tôi làm :-)


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.