みなさんは Ruby でシェルのコマンドを実行する際はどうしていますか?
私はだいたいは Kernel.#system
メソッドや FileUtils
モジュールを利用しますが、
今回 Shell という標準ライブラリを見つけたのでそれを活用してみました。
require 'shell'
Shell.def_system_command("ls")
Shell.alias_command("ls1", "ls", "-1")
Shell.def_system_command("sort")
my_shell = Shell.new
my_shell.cd("hidamari")
# ls -1 を実行
puts my_shell.ls1
# [出力結果]
# hiro.txt
# miyako.txt
# sae.txt
# yuno.txt
contents = nil
my_shell.transact do
# ls -1 | sort -r を実行
contents = (ls1 | sort("-r")).map.with_index(1) do |file, i|
filename = file.chomp
# cat を実行
"(#{i}) #{filename.rjust(10)}: #{cat(filename)}"
end
end
puts contents
# [出力結果]
# (1) yuno.txt: Yuno (CV: Kana Asumi)
# (2) sae.txt: Sae (CV: Ryoko Shintani)
# (3) miyako.txt: Miyako (CV: Kaori Mizuhashi)
# (4) hiro.txt: Hiro (CV: Yuko Goto)
軽く使ってみた上で、ポイントとしては
- メソッドが用意されていないコマンドは
Shell.def_system_command
で登録する。 -
Shell.alias_command
でエイリアスも定義できる。 -
Shell#transact
のブロック中では shell オブジェクトがself
となるので、より直感的にコマンドを実行できる。 - パイプ
|
が使える。
といったところでしょうか。
まあ system
メソッドを使ったり、そもそも Ruby じゃなくて bash で書いたりしてもいいのでしょうが、
こういう方法もあるよということで。 ✌( 'ω' )✌