Rustで外部コマンド(プロセス)を起動する方法

2024年3月13日水曜日

Rust

t f B! P L

Rustはシステムプログラミング言語であり、その性能と安全性から多くの開発者に選ばれています。この記事では、Rustを使って外部のコマンドを実行する基本的な方法を紹介します。

外部コマンドの実行

外部コマンドを実行するには、std::process::Command構造体を使用します。この構造体を使って、新しいプロセスの設定、起動、その出力の管理が可能です。

以下は、Rustで外部のechoコマンドを実行し、その出力を表示するサンプルコードです。

use std::process::{Command, Stdio};

fn execute_process() {
    
    // 外部の「echo」コマンドを実行
    let process = match Command::new("echo")
        .args(["hello world"])
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .output()
    {
        Err(why) => panic!("コマンドの実行でエラー: {}", why),
        Ok(process) => process,
    };

    // 標準出力の結果を表示
    println!("{}", String::from_utf8(process.stdout).unwrap());
}

このサンプルでは、まずCommand::newメソッドを使って実行したいコマンド(この場合はecho)のインスタンスを作成します。次に、.args()メソッドを使ってコマンドに渡す引数を設定します。ここでは、echoコマンドに"hello world"という文字列を渡しています。

.stdin(Stdio::piped()).stdout(Stdio::piped())メソッドを使用して、標準入出力をパイプします。これにより、Rustのプログラムからコマンドの入出力を直接制御できます。

最後に、.output()メソッドを呼び出してコマンドを実行し、その結果を変数processに格納します。process.stdoutには、コマンドの標準出力の内容がバイト配列として格納されています。これをString::from_utf8()メソッドを使って文字列に変換し、println!マクロで表示します。

スポンサーリンク

外部コマンドの戻り値の取得

外部コマンドを実行した後、その戻り値を取得する方法について解説します。
戻り値は、output()メソッドの戻り値に含まれるstatusフィールドからこの終了ステータスを取得できます。

以下のサンプルコードは、外部コマンドの実行結果の終了ステータスを取得し、それを基に成功か失敗かを判断するコードです。

fn execute_process() {
    
    // 外部の「echo」コマンドを実行
    let process = match Command::new("echo")
        .args(["hello world"])
        .output()
    {
        Err(why) => panic!("コマンドの実行でエラー: {}", why),
        Ok(process) => process,
    };
    
    // コマンドの終了ステータスを確認
    if process.status.success() {
        println!("コマンドは成功しました。");
    } else {
        println!("コマンドは失敗しました。終了コード: {}", process.status.code().unwrap_or(-1));
    }
}

この例では、output.status.success()メソッドを使用して、コマンドが成功したかどうかを判断しています。このメソッドは、コマンドの終了ステータスが成功を示す場合にtrueを返します。もしコマンドが失敗した場合、output.status.code()メソッドを使用して終了コードを取得し、その値を表示しています。

終了コードは、通常、コマンドが成功した場合は0を、失敗した場合は0以外の値を返します(ただし、具体的な値はコマンドによって異なります)。unwrap_or(-1)は、終了コードが何らかの理由で取得できなかった場合にデフォルト値として-1を使用することを指定しています。

まとめ

このように、Rustで外部コマンドを実行する方法は非常に簡単で、システムレベルのタスクを扱うアプリケーションを作成する際に非常に便利です。

スポンサーリンク
スポンサーリンク

このブログを検索

Profile

自分の写真
Webアプリエンジニア。 日々新しい技術を追い求めてブログでアウトプットしています。
プロフィール画像は、猫村ゆゆこ様に書いてもらいました。

仕事募集もしていたり、していなかったり。

QooQ