簡體   English   中英

在Ruby腳本中運行命令行命令

[英]Running command line commands within Ruby script

有沒有辦法通過Ruby運行命令行命令? 我正在嘗試創建一個小的Ruby程序,該程序可以通過“ screen”,“ rcsz”等命令行程序撥出並接收/發送。

如果我可以將所有這些與Ruby(MySQL后端等)結合在一起,那將是很棒的

是。 有幾種方法:


一種。 使用%x或'`':

%x(echo hi) #=> "hi\n"
%x(echo hi >&2) #=> "" (prints 'hi' to stderr)

`echo hi` #=> "hi\n"
`echo hi >&2` #=> "" (prints 'hi' to stderr)

這些方法將返回標准輸出,並將標准錯誤重定向到程序的標准輸出。


b。 使用system

system 'echo hi' #=> true (prints 'hi')
system 'echo hi >&2' #=> true (prints 'hi' to stderr)
system 'exit 1' #=> nil

如果命令成功,則此方法返回true 它將所有輸出重定向到程序的輸出。


C。 使用exec

fork { exec 'sleep 60' } # you see a new process in top, "sleep", but no extra ruby process. 
exec 'echo hi' # prints 'hi'
# the code will never get here.

該命令將當前進程替換為該命令創建的進程。


d。 (ruby 1.9)使用spawn

spawn 'sleep 1; echo one' #=> 430
spawn 'echo two' #=> 431
sleep 2
# This program will print "two\none".

此方法不等待進程退出並返回PID。


e。 使用IO.popen

io = IO.popen 'cat', 'r+'
$stdout = io
puts 'hi'
$stdout = IO.new 0
p io.read(1)
io.close
# prints '"h"'.

此方法將返回一個IO對象,該對象代表新進程的輸入/輸出。 這也是目前我所知道的唯一輸入程序的方法。


F。 使用Open3 (在1.9.2及更高版本上)

require 'open3'

stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.successful?
  puts stdout
else
  STDERR.puts "OH NO!"
end

Open3還有其他幾個功能,可以顯式訪問兩個輸出流。 它類似於popen,但使您可以訪問stderr。

有幾種方法可以在Ruby中運行系統命令。

irb(main):003:0> `date /t` # surround with backticks
=> "Thu 07/01/2010 \n"
irb(main):004:0> system("date /t") # system command (returns true/false)
Thu 07/01/2010
=> true
irb(main):005:0> %x{date /t} # %x{} wrapper
=> "Thu 07/01/2010 \n"

但是,如果您實際上需要使用命令的stdin / stdout執行輸入和輸出,則可能需要查看IO::popen方法,該方法專門提供了該功能。

 folder = "/"
 list_all_files = "ls -al #{folder}"
 output = `#{list_all_files}`
 puts output

是的,這當然是可行的,但是實現方法因所討論的“命令行”程序是以“全屏”還是命令行模式運行而有所不同。 為命令行編寫的程序傾向於讀取STDIN並寫入STDOUT。 可以使用標准的backticks方法和/或system / exec調用在Ruby中直接調用它們。

如果程序在“全屏”模式(如屏幕或vi)下運行,則方法必須不同。 對於這樣的程序,您應該尋找“期望”庫的Ruby實現。 這將使您可以編寫腳本,以期望在屏幕上看到的內容以及在屏幕上看到這些特定字符串時發送的內容。

這不太可能是最好的方法,您可能應該查看要達到的目標並找到相關的庫/ gem來做到這一點,而不是嘗試使現有的全屏應用程序自動化。 例如,“ 需要幫助Ruby中的串行端口通信 ”處理了串行端口通信,如果您要使用提到的特定程序來實現此目的,則可以使用撥號的前體。

最常用的方法是使用Open3這是我對以上代碼進行代碼修改的版本,並進行了一些更正:

require 'open3'
puts"Enter the command for execution"
some_command=gets
stdout,stderr,status = Open3.capture3(some_command)
STDERR.puts stderr
if status.success?
  puts stdout
else
  STDERR.puts "ERRRR"
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM