2012-05-10 29 views
14

Tôi đang viết một số tập lệnh shell với haskell, mà tôi đang chạy trong gitbash, nhưng có một vài kịch bản hiện có khác mà tôi muốn có thể sử dụng từ các tập lệnh đó.Có thể gọi các tập lệnh bash hoặc shell từ một chương trình haskell không?

Ví dụ: tôi muốn chạy mục tiêu maven hoặc thực hiện lệnh kéo git, nhưng không phải tích hợp cụ thể với các công cụ đó.

Có cách nào để thực hiện việc này không?

Trả lời

16

Bạn có thể sử dụng System.Process. Ví dụ, thực hiện seq 1 10 lệnh shell:

> import System.Process 

> readProcess "seq" ["1", "10"] "" 
"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n" 
it :: String 

> readProcessWithExitCode "seq" ["1", "10"] "" 
(ExitSuccess,"1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n","") 
it :: (GHC.IO.Exception.ExitCode, String, String) 
5

Tất nhiên rồi. Bạn có thể bắt đầu bằng cách sử dụng system để gọi các quy trình bên ngoài.

Kiểm soát quy trình và đường ống phức tạp hơn có sẵn theo cách đa nền tảng từ thư viện System.Process.

Cuối cùng, bạn có thể xem xét việc chuyển các tập lệnh shell của mình sang Haskell, via shell DSLs.

8

Có, điều đó là có thể. Bạn có thể sử dụng gói process, xuất nhiều chức năng hữu ích. Đơn giản nhất là System.Cmd.system, có thể chạy một số ứng dụng trong trình bao, tạo mã thoát.

Các tính năng nâng cao khác cũng được cung cấp trong mô-đun System.Process. Với mô-đun này, bạn có thể chạy quy trình và giao tiếp với nó theo nhiều cách (đường ống đầu vào, mã thoát, chờ quá trình dừng, sửa đổi môi trường, vv).

5

Turtle là thư viện haskell hiện đại khá đẹp cho việc này.

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