2011-09-30 52 views
6

Tôi cần sử dụng Lua để chạy chương trình nhị phân có thể viết thứ gì đó trong giá trị của nó và cũng trả về mã trạng thái (còn được gọi là "exit status").Nhận trạng thái trả về và đầu ra chương trình

Tôi đã tìm kiếm trên web và không thể tìm thấy thứ gì đó làm những gì tôi cần. Tuy nhiên tôi phát hiện ra rằng trong Lua:

  • os.execute() trả về mã trạng thái
  • io.popen() trả về một xử lý tập tin đó có thể được sử dụng để đọc quá trình đầu ra

Tuy nhiên tôi cần cả hai. Viết một hàm bao bọc chạy cả hai hàm đằng sau khung cảnh không phải là một tùy chọn vì quá trình trên đầu và có thể thay đổi kết quả khi chạy liên tiếp. Tôi cần phải viết một chức năng như sau:

function run(binpath) 
    ... 
    return output,exitcode 
end 

Có ai có ý tưởng về cách giải quyết vấn đề này không?

PS. hệ thống đích rung động Linux.

Trả lời

8

Với LUA 5.2 tôi có thể làm những điều sau đây và nó hoạt động

-- This will open the file 
local file = io.popen('dmesg') 
-- This will read all of the output, as always 
local output = file:read('*all') 
-- This will get a table with some return stuff 
-- rc[1] will be true, false or nil 
-- rc[3] will be the signal 
local rc = {file:close()} 

Hope this helps ...

1

Nếu bạn đang chạy mã này trên Win32 hoặc trong một môi trường POSIX, bạn có thể thử mở rộng này Lua: http://code.google.com/p/lua-ex-api/

Ngoài ra, bạn có thể viết một kịch bản shell nhỏ (giả sử bash hoặc tương tự có sẵn) rằng:

  • thực hiện thực thi đúng, chụp mã lối ra vào một biến vỏ,
  • in một dòng mới và thiết bị đầu cuối vật/chuỗi vào tiêu chuẩn ra
  • in các biến shell valu e (mã thoát) lên tiêu chuẩn ra

Sau đó, nắm bắt tất cả đầu ra của io.popen và phân tích ngược.

Tiết lộ đầy đủ: Tôi không phải là nhà phát triển Lua.

+0

Cảm ơn bạn. Có, chúng tôi có một vỏ trên hệ thống Linux nhỏ của chúng tôi. Đây là giải pháp nhanh nhất cho vấn đề. – AlexStack

+0

@AlexStack Bạn được chào đón nhiều nhất. –

2

Chức năng này được cung cấp trong C theo pclose.

Khi trở về thành công, pclose() sẽ trả về trạng thái chấm dứt của trình thông dịch ngôn ngữ lệnh.

Trình thông dịch trả lại trạng thái chấm dứt của con mình.

Nhưng Lua không làm điều này đúng (io.close luôn trả về đúng). Tôi chưa đào sâu vào những chủ đề này nhưng một số người phàn nàn về tổn thương não này.

+0

cảm ơn lời giải thích và liên kết đến chủ đề. – AlexStack

+0

@AlexStack Tôi hy vọng bạn tìm thấy một cách xung quanh. Lua là tốt đẹp nhưng phát triển có vẻ loại chậm (thread đầu tiên là từ năm 2004!). – cnicutar

1

tôi không thể sử dụng Lua 5.2, tôi sử dụng chức năng helper này.

function execute_command(command) 
    local tmpfile = '/tmp/lua_execute_tmp_file' 
    local exit = os.execute(command .. ' > ' .. tmpfile .. ' 2> ' .. tmpfile .. '.err') 

    local stdout_file = io.open(tmpfile) 
    local stdout = stdout_file:read("*all") 

    local stderr_file = io.open(tmpfile .. '.err') 
    local stderr = stderr_file:read("*all") 

    stdout_file:close() 
    stderr_file:close() 

    return exit, stdout, stderr 
end 
0

vâng, bạn nói đúng rằng os.execute() có lợi nhuận và nó rất đơn giản nếu bạn hiểu làm thế nào để chạy lệnh của bạn với và với ra lua bạn cũng có thể muốn biết có bao nhiêu biến nó trở lại, và nó có thể mất một thời gian, nhưng tôi nghĩ rằng bạn có thể thử

local a, b, c, d, e=os.execute(-what ever your command is-) 

ví dụ của tôi a là một cuộc tranh cãi trở lại đầu tiên, b là tham số trở lại thứ hai, và vv .. tôi nghĩ rằng tôi đã trả lời câu hỏi của bạn đúng, dựa trên những gì bạn đang hỏi.

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