Tôi hiểu mở rộng niềng răng là gì, nhưng tôi không biết cách sử dụng nó tốt nhất.
Khi nào bạn sử dụng nó?
Xin hãy dạy tôi một số ví dụ thuận tiện và đáng chú ý nếu bạn có mẹo riêng.
Tôi hiểu mở rộng niềng răng là gì, nhưng tôi không biết cách sử dụng nó tốt nhất.
Khi nào bạn sử dụng nó?
Xin hãy dạy tôi một số ví dụ thuận tiện và đáng chú ý nếu bạn có mẹo riêng.
Câu trả lời:
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.txt
và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
program
nhận được ba từ : "-f file1" "-f file2" "-f file3"
, thay vì 6 : "-f" "file1" "-f" "file2" "-f" "file3"
.
for
vò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.
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.
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}
.
subdir1
và subdir2
theo nghĩa phi nghĩa đen. Thay thế subdir1
bằng cat
và subdir2
với dog
ví dụ.
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
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
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ư perl
hoặ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/sh
vỏ (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]
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 file1
tồn tại nhưng file2
khô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").
program -f file1 -f file2 -f file3
, bạn có thể làmprogram "-f file"{1..3}