2010-09-23 70 views
28

Tôi đang cố sử dụng lớp ProcessBuilder của Java để thực hiện lệnh có đường ống trong đó. Ví dụ:Sử dụng Java ProcessBuilder để thực hiện lệnh đường ống

ls -l | grep foo 

Tuy nhiên, tôi nhận được một lỗi:

ls: |: no such file or directory 

Tiếp nối bởi:

ls: grep: no such file or directory 

Mặc dù lệnh mà làm việc một cách hoàn hảo từ dòng lệnh, tôi không thể nhận ProcessBuilder để thực hiện một lệnh chuyển hướng đầu ra của nó đến một lệnh khác. Có cách nào để thực hiện điều này?

Trả lời

5

Cách đơn giản nhất là gọi trình bao bằng dòng lệnh làm tham số. Xét cho cùng, đó là vỏ giải thích "|" để có nghĩa là "đường ống dữ liệu giữa hai quá trình".

Hoặc, bạn có thể khởi chạy riêng từng quy trình và đọc từ đầu ra chuẩn của "ls -l", ghi dữ liệu vào đầu vào chuẩn của "grep" trong ví dụ của bạn.

+0

Dường như là một lựa chọn tốt, tốt hơn là chạy vài vỏ để có được kết quả phù hợp. Cảm ơn! – LeoPucciBr

45

này nên làm việc:

ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l| grep foo"); 

Để thực hiện một đường ống dẫn, bạn phải gọi một vỏ, và sau đó chạy lệnh của bạn bên trong vỏ đó.

+0

Vì một lý do nào đó, tôi cũng cần làm điều này cho 'ls/dev/sd *' IOW, 'ProcessBuilder pb = new ProcessBuilder ("/bin/sh "," -c "," ls/dev/sd * "); 'hoạt động tốt, trong khi' ProcessBuilder pb = new ProcessBuilder ("ls", "/ dev/sd *"); 'đã làm * không * hoạt động. Đoán nó có một cái gì đó để làm với vararg giải thích của '*' trong chuỗi ... Có vẻ như một lỗi cho tôi. Cũng có thể là do thiết bị '/ dev'" đặc biệt ", không chắc chắn. – likethesky

+1

Đó là vỏ mở rộng ký tự đại diện, không phải ls. Nếu bạn đã gõ 'ls '/ dev/sd *'' thì điều đó sẽ không hoạt động. –

Các vấn đề liên quan