2010-04-28 75 views
1

我想談談一個交互式bash過程。bash周圍的包裝,控制STDIN和STDOUT

下面是一個例子,讓你知道我想要什麼archieve:

  1. 計劃啓動一個新的bash進程。
  2. 用戶在我的程序中鍵入「ls」。
  3. 程序將此命令發送給bash進程。
  4. 程序讀取bash的所有可用輸出(包括提示)並將其顯示回給用戶。
  5. GOTO 1

正如您可以猜到,有很大的空間漂亮的操作在這裏和那裏... ;-)

這將是美好的,如果這還曾任職於子過程(由啓動bash過程)和基於curses的程序。

我想在Ruby中實現這個功能,並且已經嘗試過使用IO.popen,但會發生奇怪的事情。您也歡迎您以其他語言進行此操作。

+0

這裏的實際問題是什麼? – 2010-04-28 15:10:02

+0

這是非常相關的我的問題在這裏:http://stackoverflow.com/questions/2380577/vi-input-mode-in-command-line-matlab – 2010-04-28 15:12:08

+1

如果你包含你所擁有的,你可能會得到更多的幫助迄今爲止嘗試過。 – 2010-04-28 16:09:47

回答

5

好的,我找到了一個解決方案。這項工作非常好聽,你甚至可以在它裏面啓動Vim :-)

require "pty" 

system("stty raw -echo") 

PTY.spawn("bash -i") do |pin, pout| 
    Thread.new do 
     loop do 
      pout.print STDIN.getc.chr 
     end 
    end 

    loop do 
     print pin.sysread(512) 
     STDOUT.flush 
    end 
end 

這將執行以下操作:

  • 使字符輸入明智的(僅限於UNIXoids,只怕)
  • 創建一個僞終端,啓動內部
  • 着每一個字符一個交互式bash命令從標準輸入到bash的
  • 打印每個輸出返回給用戶
+0

不錯的解決方案!但是,我注意到pty只有80列寬。有沒有辦法改變它? – 2011-12-10 19:39:32

+0

@AaronFeng也許你可以在'PTY.spawn'上試試''COLUMNS = 90 bash -i「'。這應該工作,我猜測? – Dave 2015-04-18 14:29:20

+0

可能對'PTY.spawn(「stty raw -echo; bash -i」)做...'更好? 'system'調用會破壞我的當前shell – caesarsol 2015-06-09 13:56:44