我需要從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:
凡在各三次的程序等待用戶鍵入內容。
這是有點混淆你想達到什麼目的。你想以編程方式控制子流程的交互式輸入/輸出嗎?如果你這樣做,那麼這個任務就有一個標準的PTY模塊。看到http://ruby-doc.org/stdlib/libdoc/pty/rdoc/PTY.html – 2013-05-05 14:27:46
我不明白這是如何棘手。顯而易見的['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