(追記: なんだこのうんこ記事...(唖然))
各行が100未満の数値を持つ10行の文字列を作成した。
numbers = Array.new(10){ rand 100 } * "\n"
puts numbers
17
32
63
2
70
12
84
7
87
52
この文字列をsort -n
コマンドに渡してソートしたいとする。
(ただの例え話なので「Rubyでやれ」とか言わない。)
適当にコマンドの実行結果を得るなら「``」「%x||」のコマンド出力リテラルが便利。
だけどこれらには標準入力を使う機能がないから普通はこんな感じと思う。たぶん。
sorted = open("|sort -n", "r+") do |io|
io.puts str
io.close_write
io.read
end
puts sorted
sorted = IO.popen("sort -n", "r+") do |io|
io.puts str
io.close_write
io.read
end
puts sorted
require 'open3'
sorted = Open3.popen3("sort -n") do |stdin, stdout, stderr, wait_thr|
stdin.puts str
stdin.close
stdout.read
end
puts sorted
_人人人人人人_
> めんどい <
 ̄Y^Y^Y^Y^Y ̄
シェルのヒアドキュメントを使えば「``」でも標準入力に文字列を渡せる。
使い捨てスクリプトなら だいじょぶだいじょぶ。
puts `sort -n <<X\n#{numbers}`
2
7
12
17
32
52
63
70
84
87
終端識別子と改行のあとに、渡したい文字列を置くだけ。
識別子は「X」にしたけど文字列の中に同じ行がないなら適当でだいじょぶ。
ほんとは「X」で閉じなきゃいけないけど「``」は勝手に閉じてくれるみたい。
たぶんだいじょぶだいじょぶ。
Rubyの中で書いた他のスクリプトのソースを今すぐ実行しないと死ぬ時などに便利。
# AppleScriptのソースを文字列に入れる
src = <<APPLESCRIPT
tell application "System Events"
set greeting to "ドーモ、#{ENV["LOGNAME"]}=サン。"
display dialog greeting
end tell
APPLESCRIPT
# 実行
`osascript <<XXX\n#{src}`
シェルのヒアドキュメントとRubyのヒアドキュメントを組み合わせるとさらにキモい。
`osascript <<XXX\n#{<<APPLESCRIPT}`
tell application "System Events"
set greeting to "ドーモ、#{ENV["LOGNAME"]}=サン。"
display dialog greeting
end tell
APPLESCRIPT
意味ない気がするけどRubyのヒアドキュメントからそのまま実行。
<<`APPLESCRIPT`
osascript <<XXX
tell application "System Events"
set greeting to "ドーモ、#{ENV["LOGNAME"]}=サン。"
display dialog greeting
end tell
APPLESCRIPT
DATA.readも便利。
`osascript <<XXX\n#{DATA.read}`
__END__
tell application "System Events"
display dialog "hello hello"
end tell
追記: さらにパイプに渡したいときは順番に注意。
渡す文字列はかならずいちばん最後。
src = "3\n2\n1"
sorted = `cat <<X | sort -n \n#{src}`
puts sorted
#=> "1\n2\n3\n"
"
(追記: 編集リクエストありです!)