2013-05-05 41 views
1

我需要從ruby啓動一個子進程,然後接管然後返回控制。 這個子進程需要來自用戶的交互輸入,所以它的io應該綁定到stdin stdout和stderr。此外,它根據具體情況要求輸入更改。執行需要交互輸入的ruby子進程

這樣的程序的一個例子是TeX,我將從一個文件開始,但在此過程中,TeX可能會遇到用戶錯誤,它必須詢問用戶如何修復。

本質上,我正在尋找exec的可重入版本。

PS

對於那些不能仔細閱讀讓我重申。

此子需要從用戶

這意味着交互式輸入,如果Ruby程序在一個tty運行時,其輸出變爲TTY不是Ruby程序和它的輸入來自tty的,不Ruby程序。

換句話說: 本質上,我正在尋找exec的可重入版本。

我以TeX爲例,讓我給你看一個例子。我在Sample Tex上找到了一塊TeX的樣品。我打算把一個錯誤,但似乎我沒有必要在我的系統扼流圈。將其保存在sample1.tex,sample2.tex,sample3.tex中。

現在我想運行該位的Ruby代碼:

files=["sample1.tex","sample2.tex","sample3.tex"] 
files.each{|file| 
    # It is really a latex command. 
    commmand_that_I_am_looking_for("latex #{file}") 
} 

當我運行這段代碼,我應該在終端看到,三次一堆東西:

通用有關信息膠乳程序,在處理進度等

! LaTeX Error: File `html.sty' not found. 

Type X to quit or <RETURN> to proceed, 
or enter new name. (Default extension: sty) 
Enter file name: 

凡在各三次的程序等待用戶鍵入內容。

+0

這是有點混淆你想達到什麼目的。你想以編程方式控制子流程的交互式輸入/輸出嗎?如果你這樣做,那麼這個任務就有一個標準的PTY模塊。看到http://ruby-doc.org/stdlib/libdoc/pty/rdoc/PTY.html – 2013-05-05 14:27:46

+0

我不明白這是如何棘手。顯而易見的['Kernel :: system'](http://www.ruby-doc.org/core-2.0/Kernel.html#method-i-system)如何做你想做的事情?它運行你在一個子shell中傳遞的命令,它繼承了你的ruby進程的stdin/stdout/stderr;它會阻止等待子進程退出。 – dbenhur 2013-05-05 16:47:31

回答

0

Ruby標準庫有一個特殊的命令可以滿足您的需求。它被稱爲open3。這裏有一個來自其文檔的例子:

Open3.popen3("pwd", :chdir=>"/") {|stdin, stdout, stderr, thread| 
    p stdout.read.chomp #=> "/" 
} 
+0

向我解釋你的示例程序「pwd」需要什麼樣的用戶輸入? – 2013-05-05 07:55:36

+0

@ Mouse.The.Lucky.Dog這裏幾乎所有人都在努力幫助別人,相互學習。稱愚蠢的人不具有建設性。解釋你如何以及爲什麼認爲他們錯了。儘量禮貌,不是每個人都能看到你所看到的,沒有人欠你的時間或注意力。 – dbenhur 2013-05-05 16:52:54

相關問題