Frank を使用して iOS のテストを行っています。キュウリも使ったルビーの逸品です。アプリが実行されているかどうか、またはクラッシュしたかどうかを確認する「指定された」ステップがあります。ステップがクラッシュしたことがわかった場合は、アプリをもう一度起動したいと思います。キュウリの .feature ファイルの近くに保存されているシェル スクリプトを使用してアプリを起動します。
そのステップ定義からスクリプトを呼び出すにはどうすればよいですか?
これはいくつかの異なる方法で行うことができます
Kernel.system "command"
%x[command]
`command`
他の回答が示唆しているように、Ruby からシェル スクリプトを実行する方法はたくさんありますが、それらはすべて同じように作成されているわけではありません。私が知っているすべての方法をより詳細に説明しようとします。
`command arg1 arg2`
%x(command arg1 arg2)
コマンドをサブシェルで実行し、コマンドの出力を返します。コマンドとその引数は、バッククォートで区切られた文字列として提供されます。別の構文は%x(...)
、エスケープの問題を回避するのに役立ちます。たとえば、バッククォート自体を含むコマンドを実行する場合などです。エスケープの問題をほぼ回避できるように、括弧を[]
, {}
, , … などの他の区切り文字に置き換えることができます。!!
Stderr は通常どおり出力され、Stdout は抑制されます。コマンドの stdout 出力を返します。これは、バックティック表記を使用して、コマンドの出力を変数に取得して、さらに処理できることを意味します。
exec("command arg1 arg2")
exec("command", "arg1", "arg2")
コマンドを実行して、現在のプロセスを置き換えます。コマンドとその引数は、通常の文字列またはカンマ区切りの文字列リストとして提供されます。引数のリストが配列として既にある場合に便利です。出力はそのまま残されます。つまり、コマンドが直接実行されたかのようにコンソールに出力されます。
system("command arg1 arg2")
system("command","arg1 arg2")
同様Kernel.exec
ですが、再びサブシェルで実行されます。true
プロセスが正常に終了した場合 (ステータス 0) を返し、false
そうでない場合は返します。これは - ステートメント内でif
うまく機能します。
pid = spawn("command")
# do other stuff
Process.wait(pid)
に似てKernel.system
いますが、指定されたコマンドを実行する子プロセスを生成します。したがって、親プロセスは、Process.wait
が使用されない限り、コマンドの実行が終了するのを待ちません。戻り値は、生成されたプロセスの PID です。
io = IO.popen("command")
IO.popen("command") {|io| ... }
子プロセスでコマンドを再度実行しますが、IO をより詳細に制御できます。子プロセスの stdout と stdin は、戻り値またはブロック パラメーターとしてアクセスできる IO オブジェクトに接続されます。戻り値を介して取得した場合、 で使用した後、IO オブジェクトを閉じる必要がありますio.close
。
ここにいくつかの良い方法があります。バックティックはおそらく最も邪魔にならないものです。ただし、注意してください: tadman が指摘したようにexec
、呼び出しプロセスを終了します。これは、子プロセスを作成するか、system
.