Truyền một đường ống đến một lệnh mong đợi một tên tệp


19

Nói rằng tôi có một lệnh footrong đó có một đối số tên tệp : foo myfile.txt. Khó chịu, fookhông đọc từ đầu vào tiêu chuẩn. Thay vì một tập tin thực tế, tôi muốn chuyển nó thành kết quả của một lệnh khác (trong thực tế pv, nó sẽ tạo ra tập tin và đưa ra một thước đo tiến độ như một tác dụng phụ).

Có cách nào để thực hiện điều này? Không có gì trong túi thủ thuật của tôi dường như làm điều đó.

( footrong trường hợp này là tập lệnh PHP mà tôi tin rằng xử lý tệp tuần tự).

Tôi đang sử dụng Ubuntu và Bash

EDIT Xin lỗi vì mô tả vấn đề hơi không rõ ràng, nhưng đây là câu trả lời thực hiện những gì tôi muốn:

pv longfile.txt | foo /dev/stdin

Rất rõ ràng bây giờ tôi nhìn thấy nó.


Bạn đang tìm kiếm một lót?
Dave Forgac

Bạn có chắc chắn foo không chấp nhận một đối số "-" để làm cho nó đọc từ stdin?
rackandboneman

Đáng buồn là có, trong trường hợp này - đó là một tập lệnh php.
Steve Bennett

Đúng thực sự. .
Steve Bennett

Câu trả lời:


19

Nếu tôi hiểu những gì bạn muốn làm đúng, bạn có thể làm điều đó với tính năng thay thế lệnh của bash:

foo <(somecommand | pv)

Điều này thực hiện một cái gì đó tương tự như những gì các mkfifocâu trả lời dựa trên gợi ý, ngoại trừ việc bash xử lý các chi tiết cho bạn (và nó sẽ chuyển một cái gì đó như / dev / fd / 63 cho lệnh, thay vì một ống có tên thông thường). Bạn cũng có thể làm điều đó trực tiếp hơn như thế này:

somecommand | pv | foo /dev/stdin

1
ồ, một cái tốt đẹp Đây pv inputfile.txt | foo /dev/stdinchính xác là những gì tôi đang tìm kiếm, nhưng không nghĩ đến.
Steve Bennett

Khốn nạn! / dev / stdin
hiền nhân

<(.)đã làm cho tôi. Là cú pháp này được ghi lại trong hướng dẫn Bash? Tôi hiểu (.)như sự thay thế lệnh được ghi lại, nhưng không thấy sự kết hợp của nó với <giải thích.
Flow2k

@ Flow2k Nó được gọi là "thay thế quá trình" - xem phần 3.5.6 của hướng dẫn bash .
Gordon Davisson

Hiểu rồi. Bạn nói đúng - nó đề cập rằng nó sử dụng ống có tên / mkfifo.
Flow2k

2
ARRAY=(`pv whatever`); for FILE in $ARRAY; do foo $FILE; done

2

Câu hỏi Unix SE này có một câu trả lời cho thấy cách tạo một đường ống có tên tạm thời:

Shell Script mktemp, phương pháp tốt nhất để tạo đường ống có tên tạm thời là gì?

Dựa trên các câu trả lời ở đó, bạn có thể làm một cái gì đó như sau:

tmppipe=$(mktemp -u)
mkfifo -m 600 "$tmppipe"
pv examplefile > $tmppipe

Sau đó bạn có thể xem đường ống với:

foo $tmppipe

Sau đó xóa nó khi bạn hoàn thành nó.



0

xargs dường như hoạt động tốt cho việc này:

echo longfile.txt | xargs pv

Điều đó làm một cái gì đó khác nhau: chạy pvnhiều lần, mỗi lần có một hoặc nhiều dòng được rút ra longfile.txt. Không phải tất cả những gì tôi sau khi ở đây.
Steve Bennett
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.