Cú pháp bash '<(nội dung tệp)' được gọi là gì?


25

Câu trả lời này trên Security StackExchange sử dụng cú pháp bash thú vị để tạo một tệp trong dòng:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

Bit này đặc biệt thú vị:

<(openssl ecparam -name secp384r1)

Chỉ chạy:

echo <(openssl ecparam -name secp384r1)

Tôi trở lại /dev/fd/63

Vì vậy, điều này dường như để làm một mô tả tập tin tạm thời với nội dung của tập tin.

Cái này gọi là gì?


3
Lưu ý rằng "tệp" kết quả thực sự là một ống có tên và một số chương trình không hỗ trợ chúng làm đối số tệp. Ví dụ: git diff --no-index file1 <(cat file2)sẽ thất bại với : error: /dev/fd/63: unsupported file type. Bạn cũng có thể thấy error: readlink("/dev/fd/63"): No such file or directorynếu việc triển khai tạo ra một liên kết tượng trưng cho đường ống (vì một số lý do xuất hiện dưới dạng liên kết bị hỏng đối với tôi).
Kelvin

Câu trả lời:


35

Nó được gọi là thay thế quá trình và là một tính năng của bash, zsh và ksh (và có thể cả những người khác, tôi không biết). Nó không phải là POSIX và bạn không nên sử dụng nó trong mã di động, nhưng nó rất hữu ích.

Đây là phần có liên quan của hướng dẫn bash:

3.5.6 Thay thế quy trình

Quá trình thay thế được hỗ trợ trên các hệ thống hỗ trợ các đường dẫn có tên (FIFO) hoặc phương thức / dev / fd để đặt tên các tệp đang mở. Nó có hình thức

  <(list) 

hoặc là

  >(list) 

Danh sách quy trình được chạy với đầu vào hoặc đầu ra của nó được kết nối với một tệp FIFO hoặc một số tệp trong / dev / fd. Tên của tệp này được truyền dưới dạng đối số cho lệnh hiện tại là kết quả của việc mở rộng. Nếu biểu mẫu> (danh sách) được sử dụng, ghi vào tệp sẽ cung cấp đầu vào cho danh sách. Nếu biểu mẫu <(danh sách) được sử dụng, tệp được truyền dưới dạng đối số sẽ được đọc để lấy đầu ra của danh sách. Lưu ý rằng không có khoảng trắng nào có thể xuất hiện giữa dấu ngoặc đơn <hoặc> và dấu ngoặc trái, nếu không cấu trúc sẽ được hiểu là chuyển hướng.

Khi có sẵn, quá trình thay thế được thực hiện đồng thời với mở rộng tham số và biến, thay thế lệnh và mở rộng số học.

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.