コマンドに引数を渡して実行する

Recipe ID: shell-002

コマンド実行時に引数(オプションやファイルパスなど)を渡す方法を解説します。

前提条件

プラグインのインストールが必要です。

npm run tauri add shell

Permissions (権限) の設定

src-tauri/capabilities/default.json に以下の権限を追加します。

{
    "permissions": [
        ...,
        "shell:allow-execute",
        "shell:allow-open",
        {
            "identifier": "shell:allow-execute",
            "allow": [
                {
                    "name": "git",
                    "cmd": "git",
                    "args": [
                        "status",
                        "--short"
                    ]
                },
                {
                    "name": "node",
                    "cmd": "node",
                    "args": true
                }
            ]
        }
    ]
}

1. フロントエンドから作成する (TypeScript)

Command.create() の第2引数に配列として渡します。

任意の引数を渡す(args: true の場合)

import { Command } from '@tauri-apps/plugin-shell';

async function runNodeVersion() {
  // 第2引数に配列で引数を渡す
  // Node.js がインストールされている必要があります
  const cmd = Command.create('node', ['--version']);
  
  const output = await cmd.execute();
  console.log('Node Version:', output.stdout); // 例: "v18.16.0"
}

固定引数を渡す場合

import { Command } from '@tauri-apps/plugin-shell';

async function gitStatus() {
  // permission で args: ["status"] などと固定されている場合
  const cmd = Command.create('git', ['status']);
  const output = await cmd.execute();
  console.log(output.stdout);
}

2. バックエンドから作成する (Rust)

引数を渡す場合は .arg() または .args() を使用します。

use std::process::Command;

#[tauri::command]
fn run_node_version() -> Result<String, String> {
    // 複数の引数を配列(スライス)で渡す
    let output = Command::new("node")
        .args(&["--version"])
        .output()
        .map_err(|e| e.to_string())?;

    let stdout = String::from_utf8_lossy(&output.stdout);
    Ok(stdout.to_string())
}

#[tauri::command]
fn git_status() -> Result<String, String> {
    // 個別に引数を追加
    let output = Command::new("git")
        .arg("status")
        .arg("--short")
        .output()
        .map_err(|e| e.to_string())?;

    let stdout = String::from_utf8_lossy(&output.stdout);
    Ok(stdout.to_string())
}