Tại sao mèo Mèo {foo} không phải là đầu ra của foo, nhưng mèo Mèo {foo, bar} thì sao?


12

Tôi đã cố gắng nối các tệp văn bản trong các thư mục con và đã thử:

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1}/book.txt > out$var

Tuy nhiên điều này đã không trả lại bất cứ điều gì. Vì vậy, đã thử thêm một 'thư mục con' không tồn tại

cat ./{mainfolder1,mainfolder2,mainfolder3}/{subfolder1,subfolder2}/book.txt > out$var

Và lần này nó đã được thực hiện, nối các tệp thành công. Tại sao điều này xảy ra?


2
Sử dụng echothay vì catđể xem dòng lệnh bạn nhận được. (Hoặc sử dụng set -xđể gỡ lỗi.)
Peter Cordes

Câu trả lời:


22

Theo định nghĩa, mở rộng dấu ngoặc trong GNU Bash yêu cầu một biểu thức chuỗi hoặc một chuỗi các giá trị được phân tách bằng dấu phẩy:

Các mẫu được niềng răng mở rộng có dạng một phần mở đầu tùy chọn, theo sau là một chuỗi các chuỗi được phân tách bằng dấu phẩy hoặc một biểu thức chuỗi giữa một cặp dấu ngoặc, theo sau là một phần tái bút tùy chọn.

Bạn có thể đọc hướng dẫn để biết chi tiết.

Một vài mẫu đơn giản:

echo {subfolder1}
{subfolder1}

echo {subfolder1,subfolder2}
subfolder1 subfolder2

echo subfolder{1}
subfolder{1}

echo subfolder{1..2}
subfolder1 subfolder2

21

{subfolder1}đánh giá {subfolder1}, vì không có lựa chọn thay thế. Sử dụng subfolder1thay thế.


2
Lưu ý rằng nó khác với trong csh(nơi mở rộng niềng răng đến), tcshhoặc fish.
Stéphane Chazelas

1

Niềng răng sẽ chỉ mở rộng nếu chúng có các chuỗi được phân tách hôn mê, ví dụ {abc, def} hoặc phạm vi, ví dụ {a..e} được chỉ định giữa chúng.

Trong trường hợp của bạn, bạn chỉ có thể viết thư mục con1 mà không cần đặt nó trong dấu ngoặc nhọn vì không cần điều đó

cat ./{mainfolder1,mainfolder2,mainfolder3}/subfolder1/book.txt > out$var

Thật không may, /path/{a,}/filenamemở rộng ra hai chuỗi /path/a/filename/path//filename, có thể không mong muốn.
Kusalananda

cảm ơn @Kusalananda đã cải chính tôi, vâng, bash sẽ đưa ra cảnh báo "chuyển hướng mơ hồ"
Neo_Returns

Không, bạn nhận được ambiguous redirect nếu bạn cố chuyển hướng vào một tệp được cung cấp bởi một biến không được trích dẫn không có giá trị, ví dụ echo 'hello' >$idontexist.
Kusalananda

1
... hoặc nếu tên tệp trong chuyển hướng được mở rộng thành nhiều từ. Giống như > *.txtvới nhiều .txttệp, hoặc > $filenếu $filechứa khoảng trắng. Nhưng tất nhiên không có gì mơ hồ trong việc đưa ra catnhiều lập luận
ilkkachu
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.