質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Q&A

解決済

1回答

2262閲覧

Rubyで外部コマンドの中でさらにコマンドを実行する

oonya

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

GDB

GDBはGNUソフトウェアシステムのための標準的なデバッガーです。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

1グッド

2クリップ

投稿2019/12/21 06:58

前提・実現したいこと

Rubyで外部コマンドを呼び出して、さらにその中でコマンドを実行したい。
例 irbを開いてからそのなかでなんらかのコマンドを打つ。

gdbを使ってコードをデバッグした結果をrailsなどで処理したいと考えています。Kernelのメソッド(systemや``)、Open3のpopenなどを使って外部コマンドを打つことは出来るのですがコマンドの中(子プロセス?)でさらに操作をしたいときはどうすればいいのか分からず質問させていただきました。

補足情報(FW/ツールのバージョンなど)

Windows10home
Ubuntu(WSL) VERSION="18.04.3 LTS (Bionic Beaver)"
g++ (Ubuntu 7.4.0-1ubuntu118.04.1) 7.4.0
gcc (Ubuntu 7.4.0-1ubuntu1
18.04.1) 7.4.0

なにか入れた方がいいツールなどがあれば入れるので教えていただけると嬉しいです。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/12/21 09:39

> コマンドの中(子プロセス?)でさらに操作をしたい 具体的に何のことを言ってるのでしょうか? 大元はRubyスクリプト? そこから呼び出すコマンドとは? その中での操作とは?
oonya

2019/12/21 10:39 編集

rubyからgdbを呼び出してc/c++ファイルのデバッグがしたいです。 具体的にはrubyからgdb a.outを実行してそこからn(next)やprintコマンドを打って出力される文字列を変数に入れたいです。ターミナルを使わずにgdbを動かすことが目的なのでデバッグの開始から終了までをrubyで操作したいと思っています。 具体的にはgdb a.out → b main → n → p num(なんらかの変数名) と打った時に出てくる$1 = 5の文字列を保存出来るようにしたくて、それまでの操作をrubyでしたいです。
guest

回答1

0

ベストアンサー

標準入力から、ひたすらコマンドを入力して、出力を見るのは最後でいい場合は、Open3.popen3を使えばできます。
module Open3 (Ruby 2.6.0 リファレンスマニュアル)

出力を見ながら、コマンドを入れる場合は、それでは無理なので、さらに追加でexpectを使います。
リファレンスには使い方が書いてないので、ググってください。
Linuxコマンドのexpectを使ったことがあればすぐ使えると思います。

コマンドを標準入力から読むのでなく端末から読む場合(パスワード入力とか)は、ptyexpectを使います。

あんまりexpectを使ったことなので、いい例かどうかわかりませんが。

Ruby

1require "expect" 2require "open3" 3 4i, o, e = *Open3.popen3("gdb a.out") 5 6i.sync = true 7o.expect(/(gdb) /,10) do |lines| 8 puts lines 9 i.puts "list" 10end 11 12o.expect(/(gdb) /,10) do |lines| 13 puts lines 14 i.puts "quit" 15end

投稿2019/12/21 11:23

otn

総合スコア84505

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oonya

2019/12/21 17:17

ありがとうございました。ググってもなかなか解決できず何時間も取られてしまっていたのですごく助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問