Khi nào bạn sử dụng niềng răng mở rộng?


Câu trả lời:


52

Mở rộng cú đúp rất hữu ích nếu bạn có tên đường dẫn dài. Tôi sử dụng nó như một cách nhanh chóng để sao lưu một tập tin :

cp /a/really/long/path/to/some/file.txt{,.bak}

sẽ sao chép /a/really/long/path/to/some/file.txtvào/a/really/long/path/to/some/file.txt.bak

Bạn cũng có thể sử dụng nó theo trình tự . Tôi đã từng làm như vậy để tải xuống rất nhiều trang từ web:

wget http://domain.com/book/page{1..5}.html

hoặc là

for i in {1..100}
do
   #do something 100 times
done

8
Điều này có thể được sử dụng để sao chép đối số là tốt. Giả sử bạn có một số chương trình yêu cầu đối số '-f' cho mọi tệp để hoạt động. thay vì làm program -f file1 -f file2 -f file3, bạn có thể làmprogram "-f file"{1..3}
Patrick

Đây là một sự xấu hổ. Tôi chỉ phát hiện ra nó nhưng làm điều dự phòng trên những con đường cực dài trong nhiều năm mà không biết rhis. Cảm ơn.
smonff

2
@Patrick: Điều đó thất bại vì programnhận được ba từ : "-f file1" "-f file2" "-f file3", thay vì 6 : "-f" "file1" "-f" "file2" "-f" "file3".
musiphil

@dogbane: Sử dụng mở rộng để sử dụng trong một forvòng lặp là một chút vô nghĩa, vì bạn có thể viết for ((i=1; i<=100; i++))và nó hiệu quả hơn.
musiphil

30

Mở rộng dấu ngoặc rất tiện dụng khi tạo cấu trúc thư mục lớn:

mkdir -p dir1/{subdir1,subdir2}/{subsubdir1,subsubdir2}

Điều này sẽ cung cấp cho bạn

find dir1 -type d
dir1
dir1/subdir1
dir1/subdir1/subsubdir1
dir1/subdir1/subsubdir2
dir1/subdir2
dir1/subdir2/subsubdir1
dir1/subdir2/subsubdir2

Bạn thậm chí có thể tiến thêm một bước và đưa mở rộng niềng răng vào mở rộng niềng răng:

mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}

Điều này sẽ cung cấp cho bạn cấu trúc thư mục giống như ví dụ trên.


3
Nesting là tốt, nhưng ví dụ lồng của bạn ( mkdir -p dir1/{subdir{1,2}}/{subsubdir{1,2}}) không thực sự phục vụ bất kỳ mục đích nào. Bạn có thể vừa mới làm điều này : mkdir -p dir1/subdir{1,2}/subsubdir{1,2}.
iconoclast

@iconoclast, nó không phục vụ mục đích nếu bạn diễn giải subdir1subdir2theo nghĩa phi nghĩa đen. Thay thế subdir1bằng catsubdir2với dogví dụ.
ephsmith

2
@ephsmith: nếu bạn diễn giải "subir1" là viết tắt của "cat" và "subir2" cho "dog", thì ví dụ lồng nhau sẽ thất bại, vì nó sử dụng subir {1,2} và không có chuỗi nào bạn có thể thay thế "Subir" với điều đó sẽ làm cho subir {1,2} return {cat, dog}.
iconoclast

21

Tôi sử dụng nó khi tôi muốn giảm gõ:

geany /path/to/file1 /path/to/file2
# versus
geany /path/to/file{1,2}

Một vi dụ khac:

wajig install libpam0g-dev libiw-dev libdb-dev
# versus
wajig install lib{pam0g,iw,db}-dev

12

Tôi sử dụng nó để so sánh đầu ra thử nghiệm thực tế với đầu ra thử nghiệm mong muốn trong quá trình phát triển. Nếu thử nghiệm # 41 không thành công, thật dễ dàng để xem sự khác biệt giữa đầu ra thử nghiệm (trong tệp tests.output / 041) và đầu ra mong muốn (trong tệp tests.out / 041):

$ diff tests.{out,output}/041

10

Một số trường hợp thường xuyên đối với tôi là:

Để đổi tên:

mv myText.{txt,tex}

hoặc là

mv myText.tex{,.old}

hoặc là

cp myText.tex{,.backup}

(Mặc dù việc sử dụng kiểm soát phiên bản cho 2 tác vụ gần đây ít lộn xộn hơn.)

Để so sánh (đã được đề cập):

diff path{1,2}/a.txt

3

Có một số câu trả lời tuyệt vời ở đây, nhưng không ai trong số họ đề cập đến khi không sử dụng mở rộng niềng răng. Giống như những người trả lời khác, tôi sử dụng mở rộng cú đúp trên dòng lệnh khá nhiều. Tôi cũng sử dụng nó trong các bí danh và chức năng của mình vì tôi có thể mong đợi một lớp vỏ thông minh.

Tôi không sử dụng nó trong các tập lệnh shell của mình (trừ khi có một số lý do khác các tập lệnh nên bash hoặc zsh, mặc dù trong những trường hợp đó, tốt nhất bạn nên nâng cấp lên một ngôn ngữ kịch bản "thực" như perlhoặc python). Mở rộng cú đúp không thể di động vì nó không nằm trong tiêu chuẩn vỏ POSIX. Thậm chí nếu nó hoạt động trong bạn /bin/sh- công việc kịch bản ed vỏ, nó sẽ không hoạt động trên các hệ thống với tước hơn /bin/shvỏ (ví dụ dash).

Trong trường hợp có sự khác biệt của một chữ số, bạn không cần mở rộng dấu ngoặc; một lớp nhân vật sẽ đủ:

Bashism:

diff file{1,2}

Di động:

diff file[12]

3
Một sự khác biệt là file{1,2}sẽ luôn mở rộng sang file1 file2, trong khi file[12]chỉ mở rộng sang tên tệp hiện có: tức là nếu file1tồn tại nhưng file2không, chỉ file[12]mở rộng ra file1. Bản []mở rộng thực sự là một phiên bản ?mở rộng bị hạn chế (và chúng được gọi là "mở rộng tên đường dẫn").
musiphil

Chính xác, mở rộng dấu ngoặc không phải là vỏ toàn cầu (hay còn gọi là mở rộng tên đường dẫn). Đó là một lời kêu gọi tốt chưa thực sự được đề cập: mở rộng niềng răng tốt hơn trong việc lưu ý các đường dẫn vắng mặt bất ngờ. Bạn cũng có thể toàn cầu bên trong mở rộng cú đúp.
Adam Katz
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.