tốc ký cho nội dung của nhiều tệp vào stdin của tập lệnh


20

Giả sử tôi có một tập lệnh được gọi script, đọc từ đó stdinvà đưa ra một số kết quả ra màn hình.

Nếu tôi muốn cung cấp cho nó nội dung của một tệp, tôi sẽ gõ:

$ ./script < file1.txt

Nhưng điều gì sẽ xảy ra nếu tôi muốn cung cấp nội dung của nhiều tệp cho tập lệnh theo cùng một cách, liệu có khả thi không? Điều tốt nhất tôi nghĩ ra cho đến nay là:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

Mà sử dụng hai lệnh và tạo một tệp tạm thời. Có cách nào để làm điều tương tự nhưng bỏ qua việc tạo tệp kết hợp không?


Chuyển sang zshvà bạn sẽ có thể chạy cmd <file1 <file2 ... <fileN;)
don_crissti

Câu trả lời:


20

Bạn có thể sử dụng catvà một đường ống:

cat file1 file2 file3 ... fileN | ./script

Ví dụ của bạn, sử dụng một đường ống và không có tệp tạm thời:

join file1.txt file2.txt | ./script

Cô ơi. Nó đơn giản đến mức tôi thậm chí không chắc là mình đã không nhận ra điều đó như thế nào. Cảm ơn!
0x4B1D

10
Công dụng hữu ích của giải thưởng mèo!
glenn jackman

4
@Bruce Ediger: Tôi giả sử bạn chỉ chỉ ra một cách sử dụng joinmà không cần tệp tạm thời, nhưng chỉ để làm cho người đọc rõ ràng: cat f1 f2không tạo ra cùng một kết quả nhưjoin f1 f2
Peter.O

@fred cảm ơn vì đã chỉ ra điều này - Tôi đã sử dụng jointrong ví dụ của mình vì tôi đã chơi với nó trước đó; trong thực tế, ví dụ của tôi, tôi đã sử dụng cat.
0x4B1D

10

Nếu bạn không muốn sử dụng đường ống, bạn có thể sử dụng chuyển hướng đầu vào với quá trình thay thế:

./script <(cat file1 file2)

3

Để thêm vào câu trả lời của @Jonah Braun, nếu bạn cần thêm đầu ra quá trình vào tập lệnh của mình, tức là tệp của bạn có thể không nằm trên đĩa của bạn mà được truy cập thông qua hoặc URLsử dụng curlmột công cụ tương tự.

Một cái gì đó như thế này có thể được sử dụng để có được stdoutnhiều quy trình và sử dụng chúng trong một tập lệnh thông quastdin

Đây sẽ là tập lệnh để xử lý Nội dung đầu vào của multi-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

Bây giờ hãy kiểm tra nó:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

Đầu ra:

process 1
process 2
process 3

<()biến quá trình thành ảo filebằng cách sử dụng fdnếu bạn muốn, vì vậy <cần phải đọc nó. catbản thân nó không cần nó bởi vì nó làm những gì nó làm, ghép các tệp, ảo hoặc thự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.