9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyの``(コマンド出力リテラル)でコマンドの標準入力に文字列を渡す

Last updated at Posted at 2015-02-19

(追記: なんだこのうんこ記事...(唖然))

各行が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||」のコマンド出力リテラルが便利。
だけどこれらには標準入力を使う機能がないから普通はこんな感じと思う。たぶん。

open
sorted = open("|sort -n", "r+") do |io|
  io.puts str
  io.close_write
  io.read
end

puts sorted
IO.popen
sorted = IO.popen("sort -n", "r+") do |io|
  io.puts str
  io.close_write
  io.read
end

puts sorted
Open3
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_in_Ruby.rb
# 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"
"

(追記: 編集リクエストありです!)

参考

bashのヒアドキュメントを活用する - Qiita

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?