> [!right-bubble] ![[neovim-chan-face1.webp]] > > [!caution] [[ネオ]](agent)により自動で記述された項目です。 > ## 事象 [[Raycast]]をv2へアップデートしたあと、[[🦉Toki]]で管理している[[Script Commands (Raycast)|Script Commands]]の一部が動作しなくなった。 ```error ..../toki/raycast/png-to-webp.sh: line 11: ../mnt/toki/toki.sh: No such file or directory ``` - 動かなくなったのは、スクリプトの隣にあるファイルを**相対パスで呼び出しているもの**だけ - `png-to-webp.sh` / `mov-to-mp4.sh` / `mov-to-gif.sh` の3本 - 相対パスを使っていない他の5本(base64・URLエンコード系など)は無事だった - Script Commandの検出自体は正常。ログにも `Script discovery complete { count: 8 }` と出ている エラーは `~/Library/Logs/com.raycast.macos/` 配下のログで確認できる。 ```console [info] 🔌 macos-node [handler::script-commands] Script completed { exitCode: 127, outputLength: 137, outputData: "...: line 11: ../mnt/toki/toki.sh: No such file or directory" } ``` ### 環境 | 対象 | バージョン | | ----------- | ------- | | [[Raycast]] | 2.0.5.0 | | [[macOS]] | 26.5.2 | ## 原因 **v2はスクリプトの置かれたディレクトリをカレントディレクトリにして実行しない**ため。v1のカレントディレクトリを前提にした相対パスが解決できなくなった。 v2のScript Command実行は[[Node.js]]の `spawn` で行われており、`cwd` は `@raycast.currentDirectoryPath` が指定されているときだけ渡される。 ```ts function dq(e, t, n = []) { let r = { path: e }; return ( n.length > 0 && (r.arguments = n), t.currentDirectoryPath && (r.cwd = t.currentDirectoryPath), t.shebang && (r.shebang = t.shebang), r ); } ``` 未指定だと `cwd` が `undefined` のまま `spawn` へ渡るので、**Raycast本体のプロセスのカレントディレクトリを引き継ぐ**。スクリプトの位置とは無関係になる。 ## 解決方法 スクリプト側で `BASH_SOURCE` を起点に絶対パスへ解決する。カレントディレクトリがどこでも動くので、こちらが安全。 ```diff - ../mnt/toki/toki.sh webp + DIR_PATH=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) + "${DIR_PATH}/../mnt/toki/toki.sh" webp ``` [[Raycast]]の作法に寄せるなら `@raycast.currentDirectoryPath` を指定する手もある。ただし値は展開されずそのまま `cwd` へ渡るため、**絶対パスで書く必要がある**(`~` や相対パスは使えない)。スクリプトの置き場所をハードコードすることになるので、可搬性は落ちる。 ```bash # @raycast.currentDirectoryPath /Users/tadashi-aikawa/git/github.com/tadashi-aikawa/toki/raycast ```