2016-02-03 12 views
10

Sử dụng Groovy và nó là hỗ trợ java.lang.Process, làm cách nào để thêm nhiều lệnh shell vào nhau?Sử dụng groovy, làm cách nào để bạn thêm nhiều lệnh shell?

Cân nhắc lệnh bash này (và giả sử rằng username là foo):

ps aux | grep ' foo' | awk '{print $1}' 

này sẽ in ra tên người dùng - một dòng đối với một số các quy trình liên quan đến tài khoản người dùng của bạn.

Sử dụng Groovy, tài liệu ProcessGroovyMethods và mã nói rằng tôi sẽ có thể làm điều này để đạt được kết quả tương tự:

def p = "ps aux".execute() | "grep ' foo'".execute() | "awk '{print $1}'".execute() 
p.waitFor() 
println p.text 

Tuy nhiên, tôi không thể nhận được bất kỳ đầu ra văn bản cho bất cứ điều gì khác hơn thế này:

def p = "ps aux".execute() 
p.waitFor() 
println p.text 

Ngay sau khi tôi bắt đầu đường ống, println không in ra bất kỳ thứ gì.

Suy nghĩ?

Trả lời

8

này làm việc cho tôi:

def p = 'ps aux'.execute() | 'grep foo'.execute() | ['awk', '{ print $1 }'].execute() 
p.waitFor() 
println p.text 

cho một lý do nào đó, các thông số của awk không thể gửi với chỉ một chuỗi (tôi không biết tại sao! có thể bash là trích dẫn một cái gì đó khác nhau). Nếu bạn kết xuất với lệnh của bạn luồng lỗi, bạn sẽ thấy lỗi liên quan đến việc biên dịch tập lệnh awk.

Sửa: Trong thực tế,

  1. "-string-".execute() đại biểu để Runtime.getRuntime().exec(-string-)
  2. Đó là công việc bash để xử lý đối số có chứa không gian với 'hoặc" Runtime.exec hoặc hệ điều hành không nhận thức có dấu ngoặc kép
  3. .
  4. Thực hiện "grep ' foo'".execute() thực hiện lệnh grep, với thông số ' làm thông số đầu tiên và foo' làm thông số thứ hai: nó không hợp lệ, tương tự cho awk
+0

Trong khi câu trả lời của @ tim_yates giải quyết vấn đề cụ thể của tôi theo một cách khác (và tôi rất biết ơn điều đó), câu trả lời này giải quyết câu hỏi OP của toán tử 'hay' của Groovy và' Process 'đối tượng, vì vậy tôi sẽ trao nó. Cảm ơn! –

8

Bạn có thể làm điều này để chỉ cho phép các loại vỏ nó ra:

// slash string at the end so we don't need to escape ' or $ 
def p = ['/bin/bash', '-c', /ps aux | grep ' foo' | awk '{print $1}'/].execute() 
p.waitFor() 
println p.text 
+0

Yeah, tôi có thể, và đó có thể là cách tôi cần phải đi, nhưng bạn có biết lý do tại sao 'hoặc' phương pháp không hoạt động theo quy định tại tài liệu? –

+1

Đó là điều cần làm với awk. Không chắc chắn những gì, nhưng nó không giống như đang chạy theo cách này –

+0

Thú vị - cách tiếp cận slashy làm việc. Sử dụng dấu nháy kép thì không. Đi con số! –

0

Nếu bạn muốn nó async Tôi khuyên bạn nên

proc.consumeProcessOutputStream(new LineOrientedOutputStream() { 
     @Override 
     protected void processLine(String line) throws IOException { 
      println line 
     } 
    } 
    ); 
Các vấn đề liên quan