やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

RustでStdErr出力

 StdOutでなく。

成果物

参考

前回からの続き

  1. Rustでコマンドライン引数を受け取る
  2. Rustのファイル読込
  3. Rustでリファクタリング(モジュール性とエラー処理の向上)
  4. Rustでテスト駆動開発
  5. Rustで環境変数を取得する

エラー出力

 現状、エラーメッセージはStdOutに出力されてしまう。これをStdErrに出力したい。

cargo run 1> stdout.log 2> stderr.log
$ cargo run 1> stdout.log 2> stderr.log
$ ls
Cargo.lock  Cargo.toml  src  stderr.log  stdout.log  target
$ cat stderr.log 
    Finished dev [unoptimized + debuginfo] target(s) in 0.24s
     Running `target/debug/minigrep`
$ cat stdout.log 
異常終了します。引数解析に問題が生じました。: 引数不足。2つ必要です。第一引数に検索文字列、第二引数に検索対象ファイルパス。

 stdout.logに出ているメッセージをstderr.logに出したい。ファイルディスクリプタ2番であるStdErrに出したい。

eprintln!

 StdErrに出力するマクロである。

eprintln!("標準エラー(StdErr)へ出力する。");

コード修正

 エラーメッセージを出しているprintln!epurintln!に置き換える。

src/main.rs

fn main() {
    let args: Vec<String> = std::env::args().collect();
    let config = minigrep::Config::new(&args).unwrap_or_else(|err| {
        eprintln!("異常終了します。引数解析に問題が生じました。: {}", err);
        std::process::exit(1);
    });
    println!("query: {}", config.query);
    println!("filename: {}", config.filename);
    if let Err(e) = minigrep::run(config) {
        eprintln!("アプリエラー: {}", e);
        std::process::exit(1);
    };
}

 実行結果を確認する。

$ cargo run 1> stdout.log 2> stderr.log
$ cat stdout.log 
$ cat stderr.log
   Compiling minigrep v0.1.0 (/tmp/work/Rust.Minigrep.StdErr.20190701144645/src/0/minigrep)
    Finished dev [unoptimized + debuginfo] target(s) in 9.79s
     Running `target/debug/minigrep`
異常終了します。引数解析に問題が生じました。: 引数不足。2つ必要です。第一引数に検索文字列、第二引数に検索対象ファイルパス。

 成功。エラーメッセージもStdErrに出るようになった!

正常時

$ cd src  # poem.txtがあるディレクトリへ移動
$ cargo run to poem.txt 1> stdout.log 2> stderr.log
$ cat stdout.log 
query: to
filename: poem.txt
Are you nobody, too?
How dreary to be somebody!
To tell your name the livelong day
To an admiring bog!
$ cat stderr.log
    Finished dev [unoptimized + debuginfo] target(s) in 0.10s
     Running `/tmp/work/Rust.Minigrep.StdErr.20190701144645/src/0/minigrep/target/debug/minigrep to poem.txt

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで