2012-07-05 37 views
5

Tôi đang tìm kiếm giao diện C cho bash shell. I E. Tôi muốn có một tập hợp các chức năng cho phép tôi mở một phiên, thực hiện các lệnh, trả về kết quả đầu ra (STDOUT, STDERR) và cuối cùng là đóng trình bao. Nó có thể là một thư viện hoặc mã nguồn C dựa trên các thư viện chuẩn.Giao diện C cho bash tương tác

+0

Tôi không biết về bất kỳ giao diện nào như vậy. Trường hợp sử dụng của bạn là gì? Bất cứ điều gì mà tập hợp các lệnh không được biết trước có lẽ sẽ trở thành một hack giòn xấu xí. –

+0

@highsciguy dường như đang tìm kiếm một số [mong đợi] (http://expect.sourceforge.net/) như thư viện C. – FooF

+0

Tại sao? Dù sao, cách đơn giản nhất (để có môi trường liên tục) là viết một kịch bản lệnh shell vào một tệp, sau đó thực thi nó bằng cách sử dụng 'system'. OK, một đường ống sẽ nhanh hơn, nhưng bạn không thể cần nhanh nếu không bạn sẽ không sử dụng vỏ nào cả. – cdarke

Trả lời

0

Bạn đang tìm kiếm để đạt được một cái gì đó như thế này:

#include<stdio.h> 
    int main() 
    { 
     char a[1000]; 
     gets(a); 
     system(a); 
     return 0; 
    } 

Output:

./a.out 
cat testing.c 
#include<stdio.h> 
int main() 
{ 
    char a[1000]; 
    gets(a); 
    system(a); 
    return 0; 
} 

gets()system cuộc gọi có thể được bên trong một vòng lặp.

+0

Chắc chắn, nhưng điều này sẽ không có môi trường liên tục. Nhiều khả năng đó là những gì OP quan tâm. –

+0

Có. Ví dụ, tất cả các biến shell phải được giữ nguyên giữa các lệnh tiếp theo. – highsciguy

1

Vấn đề gốc chung có vẻ là cách lập trình chương trình thiết bị đầu cuối tương tác.

Bây giờ điều này sẽ phần nào của tôi yêu cầu kiểm tra thực tế, nhưng bạn sẽ xấp xỉ cần phải

  1. tạo ba pipes tương ứng với quá trình con stdin, stdout, và stderr (quá trình cha mẹ bằng văn bản cho stdin_pipe và đọc stdout_pipestderr_pipe) sử dụng pipe(2) cuộc gọi hệ thống;
  2. fork và ở trẻ em close chuyển hướng tiêu chuẩn vào, ra và lỗi đến các đầu thích hợp của các đường ống trên bằng cách gọi dup2(2);
  3. exec (execve(2)/execv(3)) vỏ tương tác của bạn;
  4. bắt đầu writing lệnh tới stdin_pipereading lỗi và phản hồi từ hai ống còn lại.

(Nếu bạn không cần phải thực hiện sự phân biệt giữa stdoutstderr bạn chỉ có thể đơn giản hóa cuộc sống của bạn bằng cách sử dụng popen(3) - bạn có thể có thể chuyển hướng stderr để stdout bởi sự lựa chọn đúng đắn của chuỗi lệnh).

Đối với giải pháp làm việc phù hợp, tuy nhiên, tôi tin rằng bạn có thể sẽ cần sử dụng số giả giả (pty(7)) bằng cách gọi forkpty(3) thay vì chỉ cần ngã ba.

Vì nó bắt đầu ngày càng phức tạp hơn khi tính đến tất cả các giao dịch với thiết bị đầu cuối giả, tại sao bạn không tìm kiếm thư viện C mong muốn có thể thực hiện tất cả điều này cho bạn. Hoặc mô phỏng cách expect hoặc một số ngôn ngữ tương đương khác như pexpect được triển khai. Trên thực tế, expect dường như cung cấp một thư viện C có tên là libexpect(3) cho bạn để bạn không cần phải viết tcl/tk để lập trình tương tác. Tôi không quen thuộc với thư viện, và có thể có những cái khác tốt hơn.

+1

Bạn sẽ cần phải sử dụng ptys, gần như chắc chắn. –

+0

@JonathanLeffler - cho các kịch bản phức tạp hơn có, chắc chắn. Ví dụ, nếu các chương trình chạy với shell yêu cầu thông tin về thiết bị đầu cuối (như số cột cho 'ls'). Tôi nghĩ rằng các lệnh shell đơn giản có lẽ vẫn có thể chạy với phương thức tiếp cận dựa trên 'popen (3)' + 'pclose (3)' (thiết lập các biến môi trường, chạy các chương trình không quan tâm đến các đầu cuối). Về nguyên tắc, tôi không thể thấy tại sao các shell như bash không cho phép sử dụng chúng một cách tương tác mà không có tty (mặc dù chúng chắc chắn kiểm tra xem bạn đang chạy chúng bằng tty và điều chỉnh hành vi tương ứng). – FooF

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