シェルコマンドを命令的に実行

useShell() は宣言した間隔で自動的にコマンドを実行しますが、runShell() は呼び出した瞬間に 1 回だけ実行する命令的な API です。ボタンクリックやイベントに応じて実行したい場合、または出力を加工してから表示したい場合に使います。

マニフェストの宣言

useShell と同じく、まず fluxlay.yaml で実行可能なコマンドを宣言します。

fluxlay.yaml
shell:
  weather:
    run: curl -s "https://wttr.in/?format=%t"
    reason: 現在の気温を取得します。
    required:
      - curl

ボタンクリックで実行

import { useState } from "react";
import { runShell } from "@fluxlay/react";
 
function RefreshButton() {
  const [temp, setTemp] = useState<string>("");
 
  const handleClick = async () => {
    const result = await runShell("weather");
    setTemp(result.stdout.trim());
  };
 
  return <button onClick={handleClick}>気温を更新 {temp && `: ${temp}`}</button>;
}

出力を加工してから表示

async function fetchProcesses() {
  const { stdout } = await runShell("ps-aux");
  return stdout
    .split("\n")
    .slice(1, 11) // 上位 10 件
    .map(line => line.trim());
}

useShell との使い分け

場面推奨
一定間隔で自動更新してターミナル表示useShell
ボタンクリックなどイベント駆動runShell
出力を JSON パースして利用runShell
表示前に値を加工・フィルタしたいrunShell

注意事項

  • 戻り値は Promise<ShellResult> で、{ stdout, stderr, statusCode, success, signal } を含みます。stdout を使う前に success(または statusCode === 0)を確認してください。
  • コマンド ID は fluxlay.yamlshell セクションで宣言されている必要があります。未宣言の ID を渡すとエラーになります。
  • columns / lines で擬似端末のサイズを指定できます(カラー出力の幅調整に有用)。

詳細は runShell リファレンスを参照してください。