シェルコマンドを命令的に実行
useShell() は宣言した間隔で自動的にコマンドを実行しますが、runShell() は呼び出した瞬間に 1 回だけ実行する命令的な API です。ボタンクリックやイベントに応じて実行したい場合、または出力を加工してから表示したい場合に使います。
マニフェストの宣言
useShell と同じく、まず 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.yaml の shell セクションで宣言されている必要があります。未宣言の ID を渡すとエラーになります。
columns / lines で擬似端末のサイズを指定できます(カラー出力の幅調整に有用)。
詳細は runShell リファレンスを参照してください。